我正在通过Clocksin和Mellish努力尝试最终超越仅仅涉及Prolog . FWIW,我正在运行SWI-Prolog:
适用于x86_64-linux的SWI-Prolog版本7.2.3
无论如何,我实现了diff / 2谓词作为练习1.4的一部分 . 谓词很简单:
diff(X,Y) :- X \== Y.
它在sister_of谓词中使用时有效,如下所示:
sister_of(X,Y) :-
female(X),
diff(X,Y),
parents(X, Mum, Dad ),
parents(Y, Mum, Dad ).
在此,假设必要的额外事实,这样做:
?- sister_of(alice,alice).
按预期返回false . 但这就是问题所在 . 如果我这样做:
?- sister_of(alice, Who).
(再次,鉴于必要的额外事实)我得到
谁=爱德华;谁=爱丽丝;假
尽管已经如上所示,姐妹的谓词并没有将爱丽丝视为自己的妹妹 .
另一方面,如果我使用SWI提供的dif / 2谓词,那么一切都按我天真的预期方式工作 .
任何人都可以解释为什么会发生这种情况,以及为什么我的差异实现不能按照我期望的方式工作,在我要求查询的其他统一的情况下?
我正在使用的整个源文件可以找到here
任何帮助深表感谢 .
1 回答
如你所知,问题源于平等(或更确切地说,不平等)与统一之间的相互作用 . 请注意,在
sister_of
的定义中,首先找到X
的候选值,然后尝试将Y
约束为不同,但Y
仍然是未实例化的逻辑变量,并且检查总是会成功,如diff(alice, Y)
将 . 以下约束,包括给出Y
具体值的最后一个约束,来得太晚了 .通常,您需要做的是确保在进行不等式检查时,所有变量都会被实例化 . 否定是Prolog的一个非逻辑特征,因此有潜在危险,但检查两个基本术语是否不相等是安全的 .