寻求 (\=)/2 的纯 Prolog 实现

Seeking a pure Prolog implementation of (\=)/2

作为失败的否定通常被认为是不纯的。否定失败所需的 Prolog 解释器必须实现 SLDNF,它是 SLD 的扩展。

谓词 (\=)/2 例如在库 (reif) 中使用。它可以通过否定作为失败引导,如下所示,但通常是内置的:

X \= Y :- \+ X = Y.

是否可以将 (\=)/2 作为一个纯谓词来实现?仅使用纯 Prolog,即仅使用一阶喇叭子句?

Would it be possible to implement (=)/2 as a pure predicate? Using only pure Prolog, i.e. only first order horn clauses?

您无法在纯 Prolog 中实现 (\=)/2

证明:

在逻辑中,合取是可交换的,纯 Prolog 查询如果终止,则必须是合乎逻辑的。

但是,对于 (\=)/2,术语的顺序很重要,因此不符合逻辑:

?- X \= Y, X=0, Y=1.
false.

?- X=0, Y=1, X \= Y.
X = 0,
Y = 1.