添加(X \= Y)子句后Prolog嫉妒查询结果不符预期,原因何在?
Prolog嫉妒规则的问题分析
问题出在jealous/2规则里目标的执行顺序:
- 原规则中
X \= Y被放在最前面执行,当查询jealous(vincent, X)时,变量X(对应规则里的Y)还处于未绑定状态。Prolog的\=是否定等价测试,它要求两边的项必须是可实例化的才能判断是否不等;对于未绑定的自由变量,vincent \= X会直接返回false,导致整个规则匹配失败。 - 逻辑上我们需要先找到共同爱慕的对象
Z,绑定Y的具体值后,再判断X和Y是否不等。
修正后的规则
jealous(X,Y) :- loves(X,Z), loves(Y,Z), X \= Y.
执行查询jealous(vincent, X).时,会先通过loves(vincent,Z)绑定Z=mia,再找到loves(Y,mia)对应的Y=marcellus,最后判断vincent \= marcellus为真,就会返回X = marcellus。
内容的提问来源于stack exchange,提问作者Josh Wang
相关产品推荐
相关产品推荐

