2

添加谓词related(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.

这在我所有的测试中都有效。有什么问题吗?还是更好的写法?

4

3 回答 3

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.

而related/2 可能是

related(X,Y) :- ancestor(A,X), ancestor(A,Y), X \= Y.
于 2013-09-12T07:49:22.733 回答
0

与祖先互补 = 下一代……</p>

nextgen(X,Y) :- parent(Y,X).
nextgen(X,Y) :- parent(Y,Z), nextgen(Z,X).
于 2018-06-28T11:28:42.543 回答
0

为了提出比被多次讨论的祖先/2 更精致的东西,您还可以使用诸如祖先/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
于 2018-06-29T07:06:06.090 回答