添加谓词相关(X,Y),使x与y相关,如果x和y有共同的祖先,但不是同一个人
对于我的作业,我需要将谓词添加到.PL我必须证明2个人是否相关。我已经解决了所以它会说如果他们是兄弟姐妹他们是相关的,但我不能弄清楚表兄弟的代码等等。任何帮助将不胜感激。
% File FAMILY.PL% Part of a family tree expressed in Prolog
% In father/2, mother/2, and parent/2,
% first arg. is parent and second arg. is child.
father(michael,cathy).
father(michael,sharon).
father(charles_gordon,michael).
father(charles_gordon,julie).
father(charles,charles_gordon).
father(jim,melody).
father(jim,crystal).
father(elmo,jim).
father(greg,stephanie).
father(greg,danielle).
mother(melody,cathy).
mother(melody,sharon).
mother(hazel,michael).
mother(hazel,julie).
mother(eleanor,melody).
mother(eleanor,crystal).
mother(crystal,stephanie).
mother(crystal,danielle).
parent(X,Y) :- father(X,Y).
parent(X,Y) :- mother(X,Y).
sibling(X,Y) :- mother(M,X), mother(M,Y), \+ X == Y.
ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).
related(X,Y) :- sibling(X,Y), \+ X == Y.
我试图添加这样的东西,但没有运气。 相关(X,Y): - 祖先(Z,X),祖先(Z,Y)。
所以我添加了
related(X,Y) :- parent(Z,X),parent(P,Y),parent(Q,Z),parent(Q,P), \+ X == Y.
这在我的所有测试中都有效。那有什么不对吗?或者更好的写作方式?
答案 0 :(得分:1)
在其他问题中,您的祖先规则无法完成,是一个递归规则并且缺少基本情况。尝试
ancestor(X,Y) :- parent(X,Y). % base case
ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y). % recursive case
注意:我不确定兄弟姐妹/ 2的语言意识,但我应该独立于性别,我想
sibling(X,Y) :- parent(P,X), parent(P,Y), X \= Y.
相关的/ 2可能是
related(X,Y) :- ancestor(A,X), ancestor(A,Y), X \= Y.
答案 1 :(得分:0)
与祖先互补=下一代……
nextgen(X,Y) :- parent(Y,X).
nextgen(X,Y) :- parent(Y,Z), nextgen(Z,X).
答案 2 :(得分:0)
为了提出比谈论很多次的ancestor / 2更精致的内容,您还可以使用ancestor / 3之类的内容来增加深度:
ancestor(X,Y,0) :-
% Base : X ancestor of Y and N=0 if
parent(X,Y). % X parent of Y
ancestor(X,Y,N) :-
% Recursive : X ancestor of Y if
N>0,
parent(X,Z), % X parent of Z and
M is N-1,
ancestor(Z,Y,M). % Z also ancestor of Y