2017-10-08 144 views
2

我有序言谓词male, female, parent,如下所示:现在扩展Prolog的谓词

parent(bob, rick). 
parent(jane, rick). 
parent(rick, alice). 
parent(betsy, alice). 
male(rick). 
female(jane). 

,一种方式来推断残缺的性别信息是看如果父母一方是男性,那么其他的必须是女性,副反之亦然,所以我试图延长女:

female(X) :- parent(X, Y), parent(Z, Y), male(Z). 

因此,我最后female谓语是:

female(jane). 
female(X) :- parent(X, Y), parent(Z, Y), male(Z). 

但是,当我尝试:

?- female(jane). 
true ; 
false. 

?- female(betsy). 
true ; 
false. 

为什么错误会出现在那里?当我尝试为male做类似的事情时会出现更多问题,因为这会导致无限递归。

回答

2

让我们看看会发生什么,如果你询问女/ 1:

?- female(jane). 

的Prolog试图通过努力你为它编写的所有事实和规则来证明谓语。首先,事实female(jane).匹配成功和前导告诉你:

?- female(jane). 
true 

后你打; - 键的Prolog寻找进一步的解决办法:

?- female(jane). 
true ; 

有女性/ 1,但通常没有更多的事实,所以Prolog试图通过按照你写的顺序来证明它的目标来证明规则。规则头部的Xjane统一。第一个目标parent(jane,Y)成功为Y=rick。然后Prolog正试图证明parent(Z,rick),其成功为Z=bob。现在Prolog试图证明male(bob)但由于您的事实不包括male(bob)而失败。因此,Prolog回溯到之前的目标parent(Z,rick),并找到第二个解决方案Z=jane(毕竟您的规则未指定XZ必须不同)。但是,目标male(jane)失败。 Prolog回溯到之前的进球,但没有找到更多parent(Z,rick)的解决方案,因此回溯到第一个进球parent(jane,Y)。 由于是没有更多的解决方案,无论是Prolog的告诉你:

?- female(jane). 
true ; 
false 

为了进一步说明是如何工作的,我建议你添加一个事实:

male(bob). 

现在查询得到:

?- female(jane). 
true ; 
true ; 
false. 

现在按照上述推理:第一个true是因为事实female(jane)。第二个true你得到,因为规则成功,因为Prolog现在可以证明male(bob)。而你得到的是false,因为没有更多的解决方案。

您的第二个查询的答案可以用相同的方式解释:您可以得到答案true,因为male(rick)可以在规则中证明。 false告诉你没有更多的解决方案。

+0

谢谢,明白了。我很困惑,因为'真的;虚假“似乎表明”简“是一个逻辑女性而不是另一个女性,这不应该是女性。现在我明白,这意味着它意味着没有更多的解决方案。并且很好的了解我忘记了'X \ == Z'的条件。 – forumulator

0

在这种情况下,任何人帮助,我想进一步补充说,在这种情况下,如果我也想同样延长male,它会导致无穷递归,因为male引用femalefemale引用male

为了避免这种情况,最好是分开的事实和规则,就像这样:

male(rick). 
is_male(X) :- male(X). 
is_male(X) :- parent(X, Y), parent(Z, Y), X \== Z, female(Z). 

female(jane). 
is_female(X) :- female(X). 
is_female(X) :- parent(X, Y), parent(Z, Y), X \== Z, male(Z). 

(这是唯一适当的这里,是因为递归的进一步水平不会产生任何额外的信息,这可能不是对于其他情况为真)。

+0

使用内置的\ ==/2时要小心。考虑下面的查询:'? - X = Y,X'== Y.'如预期的那样产生'no',但是'? - X \ == Y,X = Y.'由于X = Y'成功,因为\ = =/2对变量没有任何影响,因此它们可以随后统一。如果在Prolog系统中可用,请考虑使用dif/2。这样上述查询都失败了:'? - X = Y,dif(X,Y).'产生'no'和'? - dif(X,Y),X = Y.'也产生'no'。 – tas