使用Prolog的族树中的错误

时间:2014-03-28 15:07:45

标签: prolog

我的家谱中有一些问题。根据需要,我需要根据男性,女性,父母的事实,为父亲,母亲,儿子,女儿,祖父,兄弟,姨妈,叔叔,堂兄,配偶,父母等创建谓词。

male(jerry).
male(stuart).
male(warren).
male(peter).
female(kather).
female(maryalice).
female(ann).
brother(jerry,stuart).
brother(jerry,kather).
brother(peter, warren).
sister(ann, maryalice).
sister(kather,jerry).
parent_of(warren,jerry).
parent_of(maryalice,jerry).

father(X,Y) :- male(X), parent_of(X,Y).
mother(X,Y) :- female(X), parent_of(X,Y).
son(X,Y) :- male(X), parent_of(Y,X).
daughter(X,Y) :- female(X), parent_of(Y,X).
grandfather(X,Y) :- father(X,P), parent_of(P,Y).
sibling(X,Y):- parent_of(P,X), parent_of(P,Y), X\=Y.
aunt(X,Y) :- sister(X,P), parent_of(P,Y).
uncle(X,Y) :- brother(X,P), parent_of(P,Y).
cousin(X,Y):- sibling(P,Q), parent_of(P,X), parent_of(Q,Y).
spouse(X,Y) :- parent_of(X,P), parent_of(Y,P).
parent_of(X,Y) :- male(X), father(X,Y); female(X), mother(X,Y).

parent_of谓词给了我一个错误。 parent_of / 2的clasues不在源文件中。当我忽略错误并运行查询? - sibling(jerry,stuart)时,它给出了一个本地堆栈错误。任何人都知道如何解决这个问题。你的帮助将会得到满足。谢谢。

1 个答案:

答案 0 :(得分:0)

问题1

parent_of谓词给了我一个错误。 parent_of / 2的clasues不在源文件中。

只需将谓词的定义放在彼此旁边

即可

更改

parent_of(warren,jerry).
parent_of(maryalice,jerry).

...
spouse(X,Y) :- parent_of(X,P), parent_of(Y,P).
parent_of(X,Y) :- male(X), father(X,Y); female(X), mother(X,Y).

parent_of(warren,jerry).
parent_of(maryalice,jerry).
parent_of(X,Y) :- male(X), father(X,Y); female(X), mother(X,Y).
...
spouse(X,Y) :- parent_of(X,P), parent_of(Y,P).

问题2

? - sibling(jerry,stuart),它在本地堆栈中给出了一个错误。

您有循环逻辑错误。您可以使用parent_of\2father\2来定义father\2 parent_of\2。这将使每个人圈入Prolog永远不会落地。