一个奇怪的问题出现在程序中,因为当使用诸如叔叔,阿姨和堂兄之类的一些条款时,他们会给出明显不符合逻辑的答案,例如: 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).
答案 0 :(得分:1)
代码中的一个明显问题是brother/2
子句
brother(X, Y) :- male(X), father(Z, X), father(Z, Y).
X
是Y
的兄弟,如果X
是男性且Z
是两者的父亲。
如果您不强加X
与Y
不同,X
结果兄弟,那么david
结果david
的兄弟和他孩子的叔叔。
尝试
brother(X, Y) :- male(X), father(Z, X), father(Z, Y), X \= Y.