Prolog 序言:为什么是真==不是(不是(真))->;假的?

Prolog 序言:为什么是真==不是(不是(真))->;假的?,prolog,logical-operators,Prolog,Logical Operators,显然true=not(not(true))必须是false,因为=试图将原子true与术语not(not(true))(不计算术语)统一起来,这是false,因为术语不相同 然而,我认为==确实比较了所评估的内容。因此,我认为true==not(not(true))应该求值为true==true,就像(对于算术运算符)4=:=2+2求值为4=:=4并返回true一样 …但这是我在SWI序言中得到的: ?- true == not(not(true)). false. 我做错了什么?(==)/2

显然
true=not(not(true))
必须是false,因为
=
试图将原子
true
与术语
not(not(true))
(不计算术语)统一起来,这是false,因为术语不相同

然而,我认为
==
确实比较了所评估的内容。因此,我认为
true==not(not(true))
应该求值为
true==true
,就像(对于算术运算符)
4=:=2+2
求值为
4=:=4
并返回true一样

…但这是我在SWI序言中得到的:

?- true == not(not(true)).
false.
我做错了什么?

(==)/2
不比较所计算的内容。它不评估其论点。仅当参数已实例化为匹配项时,此操作才会成功

在prolog中,
not(not(true))
是一个复合术语,它是一个术语
not/1
,带有一个参数,
not(true)
,本身是一个术语
not/1
,由一个没有参数的术语
true/0
组成。它没有值。它甚至不会被“执行”,除非在某些上下文中。在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中的术语
true
not(not(true))
是否相同(或等效)?不,他们不是。一个是没有参数的简单术语(
true/0
)。另一个是复合术语:一个有一个参数的术语,它本身就是一个有一个参数的术语。因此,
(==)/2
在此失败


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

您在一个位置使用了
not(not(false))
,在其他位置使用了
not(not(true))
。那是故意的吗?不,是打字错误。Sry。修复了它。相当于
(==)/2
@错误的确,我有点懒。仍然懒,我是指周围的圆括号,否则它是一个标记
=/