Unwated循环使用简单的家谱Prolog程序

时间:2016-10-05 16:16:55

标签: prolog

一个奇怪的问题出现在程序中,因为当使用诸如叔叔,阿姨和堂兄之类的一些条款时,他们会给出明显不符合逻辑的答案,例如: uncle(david, Y).应该给所有人大卫是一个叔叔,而是给所有孩子列出,然后再循环两次。

如果有人能帮助我,那就太棒了,我只是开始理解这种语言的一些细节,并且已经陷入了对此的调试中。

parents(jennifer, george, noreen).
parents(david, george, noreen).
parents(georgejr, george, noreen).
parents(scott, george, noreen).
parents(joanne, george, noreen).
parents(jessica, david, edel).
parents(clara, david, edel).
parents(michael, david, edel).
parents(laura, georgejr, susan).
parents(anna, scott, siobhan).

father(X, Y) :- parents(Y, X, _).
male(X) :- father(X, _).

mother(X, Y) :- parents(Y, _, X).
female(X) :- mother(X, _).

grandfather(X, Y) :- father(X, Z), father(Z, Y).
grandfather(X, Y) :- father(X, Z), mother(Z, Y).

grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
grandmother(X, Y) :- mother(X, Z), father(Z, Y).

brother(X, Y) :- male(X), father(Z, X), father(Z, Y).

sister(X, Y) :- female(X), father(Z, X), father(Z, Y).

uncle(X, Y) :- brother(X, Z), father(Z, Y).

aunt(X, Y) :- sister(X, Z), father(Z, Y).

cousin(X, Y) :- father(M, X), father(N, Y), brother(M, N).

1 个答案:

答案 0 :(得分:1)

代码中的一个明显问题是brother/2子句

brother(X, Y) :- male(X), father(Z, X), father(Z, Y).

XY的兄弟,如果X是男性且Z是两者的父亲。

如果您不强加XY不同,X结果兄弟,那么david结果david的兄弟和他孩子的叔叔。

尝试

brother(X, Y) :- male(X), father(Z, X), father(Z, Y), X \= Y.