Prolog:为什么 true == not(not(true)) -> false?

Prolog: why is true == not(not(true)) -> false?

显然 true = not(not(true)) 必须为假,因为 = 试图将原子 true 与术语 not(not(true)) 统一(不评估该术语),这是错误的,因为术语不相同。

但是,我认为 == 确实比较了评估的内容。因此,我认为 true == not(not(true)) 应该评估为 true == true,就像(对于算术运算符)4 =:= 2 + 2 评估为 4 =:= 4 和 return true.

...但这就是我在 SWI-Prolog 中得到的:

?- true == not(not(true)).
false.

我哪里错了?

(==)/2 不会 比较任何评估的内容 。它不评估其参数。它只有在参数已经实例化为匹配项时才会成功。

在序言中,not(not(true))是一个复合项,它是not/1带有一个参数的项,not(true)本身就是一个参数的项not/1由没有参数的术语 true/0 组成。它没有价值。它甚至不会得到 "executed" 除了在某些情况下。在 Prolog 中,谓词 not/1 如果它的参数失败则成功,如果它的参数成功则它失败。这不是价值功能结果,而是一种行为。这是假设它出现在如下上下文中:

not(not(true)),
write('This will be written out because not(not(true)) succeeded'), nl.

Prolog中的表达式true == not(not(true))是一个复合词,等价于:

'=='(true, not(not(true)))

在此上下文中,not(not(true)) 未被评估。 Prolog 将首先执行 (==)/2 等价运算符,如果其参数被实例化为相同的项,则该运算符会成功。 Prolog 中的术语 truenot(not(true)) 是否相同(或等效)?不,他们不是。一个是没有参数的简单术语 (true/0)。另一个是复合词:一个有一个参数的词本身就是一个有一个参数的词。因此 (==)/2 在这里失败了。

请注意 (=:=)/2 完全不同。它是比较算术表达式结果的运算符。参数必须是可计算的算术表达式,如果它们的计算结果相同,(=:=)/2 将成功,否则将失败。