0

我有一个递归谓词:

something(A, Object, Value, Complete) :-
     member(Value, Complete), Object = Value.

something(A, Object, _, Complete) :-
    objects(Object),
    \+ member(Object, Complete),
    !,
    <Predicates to get return values>,
    something(A, NewObject, Object, [Object|Complete]).

该谓词的功能是遍历 Object 的所有事实,对其进行进一步的逻辑处理,然后输出与对象分开的每个 Object 事实的结果。

我遇到的问题是我得到的所有返回值(按下 ;)都是第一次迭代,所以这个递归函数为 Object 返回的第一个值。

EG:我看到的输出:

Object: obj1
Object: obj1

它应该在哪里

Object: obj1
Object: obj2

(与其他变量一起,但是我将它们排除在外以保持帖子更清洁)。

在 SWI Prolog 实现中使用可视化调试器后,我可以看到,一旦内部递归调用返回,内部递归的值就会丢失,这就是为什么我obj1再次看到第二个返回值的原因。

我不太确定如何保存这些内部值,我查看了很多递归函数的示例,但我似乎无法将这些概念应用于这个特定实例。

4

1 回答 1

1

我认为这里对变量有一个简单的误解。Prolog 有变量,而不是“ assignables ”。之间没有区别

something(A, Object, Value, Complete) :-
    member(Value, Complete), Object = Value.

还有这个:

something(A, Value, Value, Complete) :-
    member(Value, Complete).

一个自然的后果是这条线:

something(A, NewObject, Object, [Object|Complete]).

与此相同:

something(A, Object, Object, [Object|Complete]).

这几乎可以肯定是您看到意外行为的地方。如果您的想法拒绝这一点,并且您觉得我的简化版本和您的代码之间应该存在差异,那么您误解了 Prolog 中变量的工作方式。它们在任何情况下都不能被“覆盖”。在递归调用中,它们可以以不同的方式实例化,但这实际上与任何其他语言中的形式参数没有什么不同。

于 2013-05-28T18:44:26.297 回答