在prolog中创建所有元素满填关系的列表

时间:2018-03-19 18:20:04

标签: prolog

我有一个关系爷爷(X,Y),我试图获得已知世界中所有爷爷的名单,而不使用forall,findall和类似的方法

到目前为止,我的尝试是:

Get()->JsonValue

在使用 trace 检查步骤时,我可以看到,正确的列表会被评估,但稍后会丢失。我怎样才能构建一些“削减”条件?

1 个答案:

答案 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].