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 中的术语 true
和 not(not(true))
是否相同(或等效)?不,他们不是。一个是没有参数的简单术语 (true/0
)。另一个是复合词:一个有一个参数的词本身就是一个有一个参数的词。因此 (==)/2
在这里失败了。
请注意 (=:=)/2
完全不同。它是比较算术表达式结果的运算符。参数必须是可计算的算术表达式,如果它们的计算结果相同,(=:=)/2
将成功,否则将失败。
显然 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 中的术语 true
和 not(not(true))
是否相同(或等效)?不,他们不是。一个是没有参数的简单术语 (true/0
)。另一个是复合词:一个有一个参数的词本身就是一个有一个参数的词。因此 (==)/2
在这里失败了。
请注意 (=:=)/2
完全不同。它是比较算术表达式结果的运算符。参数必须是可计算的算术表达式,如果它们的计算结果相同,(=:=)/2
将成功,否则将失败。