我有一个关系爷爷(X,Y),我试图获得已知世界中所有爷爷的名单,而不使用forall,findall和类似的方法
到目前为止,我的尝试是:
Get()->JsonValue
在使用 trace 检查步骤时,我可以看到,正确的列表会被评估,但稍后会丢失。我怎样才能构建一些“削减”条件?
答案 0 :(得分:2)
这里的问题是你建立了正确的清单,但你需要知道停在哪里。例如,如果我们有事实:
grandpa(a,_).
grandpa(b,_).
grandpa(c,_).
最终你将构建列表[a, b, c]
并递归地尝试在下一次迭代中找到另一个解决方案:
grandpa(New,_)
会生成a
,但由于not(member(New,Tmp))
这会失败,通过回溯它会再次尝试使用b
... c
失败。然后没有选择点,它完全失败。 Soyou需要改为:
find_grandpas(Tmp,List):-
(
grandpa(New,_),
not(member(New,Tmp)) ->
find_grandpas([New|Tmp],List); List = Tmp
).
这简单地说试试grandpa(New,_),not(member(New,Tmp))
如果成功我要添加一些东西,添加它并继续递归。如果没有,那么没有更多的解决方案,所以设置List = Tmp
,这成功返回正确的列表。
例如:
?- find_grandpas([],L).
L = [c, b, a].