我的家谱中有一些问题。根据需要,我需要根据男性,女性,父母的事实,为父亲,母亲,儿子,女儿,祖父,兄弟,姨妈,叔叔,堂兄,配偶,父母等创建谓词。
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)时,它给出了一个本地堆栈错误。任何人都知道如何解决这个问题。你的帮助将会得到满足。谢谢。
答案 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\2
和father\2
来定义father\2
parent_of\2
。这将使每个人圈入Prolog永远不会落地。