在Prolog中创建一个Niece规则

时间:2015-04-16 00:02:38

标签: prolog

使用家庭数据库,我需要在swi-prolog中创建一个侄女规则(侄女(X,Y)),定义为"如果X是Y&#39的女儿,X是Y的侄女兄弟姐妹。"这是我已经设计的规则的给定数据库:

% family DB

grandfather(don,who).

father(don,ted).
father(don,barb).
father(don,paula).
father(greg,erin).
father(greg,austin).
father(wes,alyssa).
father(ted,jessica).
father(ted,david).
%mother(ted, john).

mother(audrey,ted).
mother(audrey,barb).
mother(audrey,paula).
mother(paula,erin).
mother(paula,austin).
mother(barb,alyssa).

married(don,audrey).
married(wes,barb).
married(greg,paula).

male(don).
male(ted).
male(wes).
male(greg).
male(austin).
male(david).

female(audrey).
female(barb).
female(paula).
female(alyssa).
female(jessica).
female(erin).

parent(X,Y) :-
    father(X,Y)
  ; mother(X,Y).

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

samefather(X,Y) :- 
   father(F,X),
   father(F,Y).

samemother(X,Y) :- 
   mother(M,X),
   mother(M,Y).

sameparent(X,Y) :-
   samefather(X,Y).
sameparent(X,Y) :-
   samemother(X,Y),
   not(samefather(X,Y)).

couple(X,Y) :- 
   married(X,Y),
   married(X,Y).

这是我对侄女规则的初步尝试:

niece(X,Y) :-
   parent(F,X),
   sameparent(Y,F).

我的想法是使用sameparent规则来检查Y和F是否是兄弟姐妹,然后检查F是否是X的父亲。此规则目前不起作用。我仍然在努力理解组合多个规则的语法。如果有人可以通过使用相同的逻辑来帮助我,那将非常感激。

1 个答案:

答案 0 :(得分:1)

删除不必要的规则:

parent(don,ted).
parent(don,barb).
parent(don,paula).
parent(greg,erin).
parent(greg,austin).
parent(wes,alyssa).
parent(ted,jessica).
parent(ted,david).

parent(audrey,ted).
parent(audrey,barb).
parent(audrey,paula).
parent(paula,erin).
parent(paula,austin).
parent(barb,alyssa).

male(don).
male(ted).
male(wes).
male(greg).
male(austin).
male(david).

female(audrey).
female(barb).
female(paula).
female(alyssa).
female(jessica).
female(erin).

father(X,Y) :-
    male(X),
    parent(X,Y).

mother(X,Y) :-
    female(X),
    parent(X,Y).

sameparent(X,Y) :-
   parent(A,X),
   parent(A,Y).

给你:

niece(X,Y) :-
    female(X),
    parent(Z,X),
    sameparent(Z,Y),
    Z \= Y.

逐行含义:

  • 如果
  • ,X是Y的侄女
  • X是女性,
  • X的一位父母
  • 的父母与Y
  • 有共同之处
  • 谁不是自己。

这会给你:

| ?- niece(X,Y).

X = alyssa
Y = ted;

X = alyssa
Y = paula;

X = jessica
Y = barb;

X = jessica
Y = paula;

X = erin
Y = ted;

X = erin
Y = barb

两次,因为在您的数据库中,每个兄弟/姐妹共享相同的两个父母。

例如,如果A是B的女儿而B是C的同父异母,A仍然是C的侄女。

如果你想要那个规则是假的而A只是C的侄女,只有当B和C是兄弟/姐妹(而不仅仅是一半)时,你可以将侄女规则改为:

sameFather(X,Y) :-
    father(A,X),
    father(A,Y).

sameMother(X,Y) :-
    mother(A,X),
    mother(A,Y).

niece(X,Y) :-
    female(X),
    parent(Z,X),
    sameFather(Z,Y),
    sameMother(Z,Y),
    Z \= Y.

然后你不会得到niece(X,Y)的重复结果。