显然true = not(not(true))
必须是错误的,因为=
试图将原子true
与术语统一not(not(true))
(不评估术语),这是错误的,因为术语不相同。
但是,我认为==
真的可以比较任何评估的内容。因此,我认为true == not(not(true))
应该评估为true == true
,就像(对于算术运算符)4 =:= 2 + 2
评估为4 =:= 4
并返回 true 一样。
...但这就是我在 SWI-Prolog 中得到的:
?- 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.
true == not(not(true))
Prolog 中的表达式是一个复合术语,相当于:
'=='(true, not(not(true)))
在这种情况下,not(not(true))
不进行评估。Prolog 将首先使用(==)/2
等价运算符,如果其参数被实例化为相同的术语,则该运算符会成功。Prolog 中的术语true
和术语是否not(not(true))
相同(或等效)?不,他们不是。一种是没有参数的简单术语 ( true/0
)。另一个是复合术语:具有一个参数的术语本身就是具有一个参数的术语。因此(==)/2
这里失败了。
请注意,这(=:=)/2
是完全不同的。它是一个运算符,用于比较算术表达式的结果。参数必须是可计算的算术表达式,(=:=)/2
如果它们的计算结果相同,则会成功,否则会失败。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句