【发布时间】:2009-07-08 14:44:42
【问题描述】:
我正在尝试在 Prolog 中实现 findall 谓词(是的,我知道它是内置的,这是用于分配的)。
写法如下:
my_findall(N,P,Pred,L) :- Pred, not(new(N,P)), !, assert(new(N,P)), my_findall(N1,P1,Pred,L1), L=[N,P,L1], retract(new(N,P)).
my_findall(_,_,_, []).
由于某种原因,它只给了我第一个解决方案并停在那里,好像第二次调用 my_findall 失败了。据我了解,回溯机制应该遍历所有可能的选项,其中应该包括调用 Pred(N,P) 的所有选项,所以即使第二次调用在第一次尝试时应该失败(为 Pred 尝试的第一个选项已经被断言),它应该先尝试所有其他选项,然后放弃并转到 my_findall((,),_, [])。
如果它不是这样工作的,有没有办法在不完全重写解决方案的情况下强制这种行为?
【问题讨论】:
-
您正在使用哪个 prolog 解释器?
-
内置的 findalls 是 findall/3 和 findall/4。你想实现哪一个?
标签: prolog