【发布时间】:2013-05-28 11:51:24
【问题描述】:
我有一个递归谓词:
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: obj1Object: obj1
它应该在哪里
Object: obj1Object: obj2
(与其他变量一起,但我将它们排除在外以保持帖子更清洁)。
在 SWI Prolog 实现中使用可视化调试器后,我可以看到,一旦内部递归调用返回,内部递归的值就会丢失,这就是为什么我再次看到 obj1 作为第二个返回值。
我不太确定如何保存这些内部值,我查看了很多递归函数的示例,但似乎无法将这些概念应用于这个特定实例。
【问题讨论】:
-
似乎是
findall(Object, <Predicates to get return values>, Complete)的工作