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

时间:2017-03-07 00:43:53

标签: prolog logical-operators

显然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.

我出错了什么?

1 个答案:

答案 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中的术语(==)/2true是相同的(或等效的)吗?不,他们不是。一个是没有参数的简单术语(not(not(true)))。另一个是复合词:一个带有一个参数的术语,它本身就是一个带有一个参数的术语。因此true/0在此失败。

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