删除不必要的规则:
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
Twice因为就您的数据库而言,每个兄弟/姐妹都有相同的两个父母。
例如,如果A是B的女儿,B是C同父异母的兄弟,则A仍然是C的侄女。
如果您希望该规则为假,并且仅当 B 和 C 是兄弟/姐妹(且不仅仅是同父异母)时,A 才成为 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)
.