我有一个递归谓词:
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
第二个返回值的原因
我不太确定如何保存这些内部值,我已经看了很多递归函数的例子,但我似乎无法将这些概念应用于这个特定的实例。
答案 0 :(得分: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中的工作方式。在任何情况下,他们都不能被“覆盖”。在递归调用中,它们可以被不同地实例化,但这与任何其他语言中的形式参数没有什么不同。