Prolog Family Tree查询问题

时间:2011-12-06 01:11:45

标签: prolog

% facts
mother(john, dana).
father(john, david).
mother(chelsea, dana).
father(chelsea, david).
mother(jared, dana).
father(jared, david).
% queries
father(X,Y) :- father(X,Y), write(Y). 
mother(X,Y) :- mother(X,Y), write(Y).
parent(X,Y) :- father(X,Y);mother(X,Y).
sibling(X,Y) :- parent(X,Z), parent(Y,Z), write(Y).

我无法让这些查询正常工作。当我输入父命令时,它会告诉我是或否正确,但不会执行写命令(与母亲相同)。 “父母”对我来说根本不起作用(因此兄弟姐妹也没有)。此外,如果我键入兄弟(X,Y)。我需要得到所有兄弟姐妹......例如,兄弟姐妹(约翰,切尔西)。我需要输出所有可能的兄弟姐妹(也是jared)。让我知道我哪里出错了,我真的没有看到我的逻辑问题。谢谢!

1 个答案:

答案 0 :(得分:1)

基本上你可以删除不属于事实的母亲和父亲的谓词。它们是无限循环。由于父级使用它们并且兄弟使用父级,因此所有谓词都是无限循环。

要了解会发生什么,您可以这样做:

?- trace, father(john, X).

并观察prolog如何处理查询。你很快就会发现,要解决父亲问题,他需要解决父亲问题,要解决父亲的问题,他需要解决父亲问题,并且永远不会停止......

如果删除了两个问题,我会获得正确的行为:

?- father(john, X).
X = david.

?- parent(john, X).
X = david ;
X = dana.

?- sibling(john, X).
john
X = john ;
chelsea
X = chelsea ;
jared
X = jared ;
john
X = john ;
chelsea
X = chelsea ;
jared
X = jared.

现在,为了让你的兄弟姐妹谓语更好,你可以说有人不是自己的兄弟姐妹,如果你有一个共同的父母就足够了(它会删除重复的东西): 兄弟(X,Y): - 父亲(Y,Z),父亲(X,Z),X = \ = Y。