序言中的意外结果

时间:2017-12-08 02:11:03

标签: prolog

为什么我会获得如此多的真实结果,而不只是一个?以下是我定义规则的方法:

parent(X,Y):- or(father(X,Y), mother(X,Y)).   
sister(X,Y):- female(X), parent(P, X), parent(P,Y).      
aunt(X,Y):- female(X), sister(X,P), parent(P,Y).


?- aunt(molly, johnny).
true ;
true ;
true ;
true ;
true ;
true ;
true ;
true ;
true ;
true.

1 个答案:

答案 0 :(得分:2)

正如@Steven在评论中提到的,结果取决于你拥有的谓词,尤其是原子谓词。例如,以下代码将导致两个" true"结果因为parent(X,Y):- father(X,Y);mother(X,Y). 将匹配父亲和母亲的谓词为莫莉&亚历克斯。

father(dan,molly).
father(dan,alex).
father(alex,johnny).

mother(jess,molly).
mother(jess,alex).

female(molly).

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

sister(X,Y):- female(X), parent(P, X), parent(P,Y), X \= Y.

aunt(X,Y):- sister(X,P), parent(P,Y).

?- aunt(molly, johnny).
true ;
true .

如果您需要获得单个匹配(例如单个true结果),则可以在阿姨谓词末尾使用剪切!谓词,例如aunt(X,Y):- female(X), sister(X,P), parent(P,Y),!.

在这种情况下,代码如下:

father(dan,molly).
father(dan,alex).
father(alex,johnny).

mother(jess,molly).
mother(jess,alex).

female(molly).

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

sister(X,Y):- female(X), parent(P, X), parent(P,Y), X \= Y.

aunt(X,Y):- sister(X,P), parent(P,Y),!.

?- aunt(molly, johnny).
true .