显然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.
我出错了什么?
答案 0 :(得分:1)
f1,f2,...
不会比较评估的内容。它没有评估其论点。如果参数已经实例化为匹配的术语,它只会成功。
在prolog中,(==)/2
是一个复合词,它是一个带有单个参数not(not(true))
的术语not/1
,它本身是一个参数的一个术语not(true)
。没有参数的术语not/1
。它没有价值。它甚至没有被执行"除了在某些情况下。在Prolog中,谓词true/0
如果参数失败则成功,如果参数成功则失败。这不是值或功能结果,而是一种行为。这假设它出现在如下的上下文中:
not/1
Prolog中的表达式not(not(true)),
write('This will be written out because not(not(true)) succeeded'), nl.
是一个复合词,相当于:
true == not(not(true))
在此上下文中,不评估'=='(true, not(not(true)))
。 Prolog将首先运用not(not(true))
等价运算符,如果其参数被实例化为同一项,则该运算符将成功。 Prolog中的术语(==)/2
和true
是相同的(或等效的)吗?不,他们不是。一个是没有参数的简单术语(not(not(true))
)。另一个是复合词:一个带有一个参数的术语,它本身就是一个带有一个参数的术语。因此true/0
在此失败。
请注意(==)/2
完全不同。它是一个比较算术表达式结果的运算符。参数必须是可评估的算术表达式,如果它们评估相同的结果,(=:=)/2
将成功,如果它们没有,它将失败。