prolog家族树问题

时间:2016-10-30 14:22:49

标签: prolog

当使用我的知识库中的兄弟规则时,问题?- issibling(jo,X). 返回 ali 这是正确的,但也返回 jo (意味着jo是jo的姐妹)。任何帮助将不胜感激。

mother(ali,jess).
father(dom,dan).
mother(ali,dan).
father(dom,jess).
father(dom,tom).
mother(ali,tom).
father(dom,george).
mother(ali,george).
mother(jo,tracey).

father(eddie,ali).
mother(jenny,ali).
father(eddie,jo).
mother(jenny,jo).

mother(belinda,dom).
father(kieth,dom).
mother(belinda,ben).
father(kieth,ben).

male(dom).
male(tom).
male(dan).
male(george).
male(eddie).
male(kieth).
female(jess).
female(ali).
female(jo).
female(jenny).
female(belida).
male(ben).
female(tracey).

isparent(X,Y):-father(X,Y).
isparent(X,Y):-mother(X,Y).
ischild(Y,X):-isparent(X,Y).

isgrandparent(X,Z) :- isparent(X,Y), isparent(Y,Z).
issibling(X,Y) :- father(F,X),father(F,Y),mother(M,X),mother(M,Y).
issister(X,Y) :- issibling(X,Y), female(X).
isbrother(X,Y) :- issibling(X,Y), male(X).
isaunt(X,Z) :- issister(X,Y),isparent(Y,Z).
isuncle(X,Z) :- isbrother(X,Y),isparent(Y,Z).
isson(X,Y) :- male(X),isparent(Y,X).
isdaughter(X,Y) :- female(X),isparent(Y,X).
iscousin(X,Y) :- isaunt(Z,Y),isparent(Z,X).
isnephew(X,Z) :-ischild(X,Y),issibling(Z,Y).

1 个答案:

答案 0 :(得分:1)

您可以考虑更易读的代码:而不是issibling(X,Y),也许siblings(S1,S2)

帮助打破'对称关系,并尽可能使用更抽象的关系:我会尝试(未经测试的例子)

siblings(S1, S1) :- parent_of(P, S1), parent_of(P, S2), dif(S1, S2).

也可以使用(@<)/ 2而不是dif / 2。