2017-03-07 51 views
1

显然true = not(not(true))必须是错误的,因为=试图统一原子true与术语not(not(true))(没有评估术语),这是错误的,因为术语不相同。序言:为什么是真的==不是(不是(true)) - > false?

但是,我认为==确实比较了任何评估。因此,我认为true == not(not(true))应评估为true == true,就像(算术运算符)4 =:= 2 + 2将评估为4 =:= 4并返回true。

...但是这是我得到SWI-Prolog的:

?- true == not(not(true)). 
false. 

什么我收到错了吗?

+2

您在其他地方使用过'not(not(false))'而'not(not(true))'。那是故意的吗? – user2357112

+0

不,错字。 Sry基因。修复。 – daniel451

回答

1

(==)/2不是比较什么是评估。它不评估它的论点。它只有在参数已经被实例化为匹配项时才会成功。

在Prolog,not(not(true))是一种化合物的术语,其是术语not/1带一个参数,not(true),本身是由具有不带参数的术语true/0的一个参数的not/1的术语。它没有价值。除了在某些情况下,它甚至不会被“执行”。在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中的术语truenot(not(true))是否相同(或等同)?不,他们不是。一个是没有参数的简单术语(true/0)。另一个是复合术语:一个有一个参数的术语,它本身就是一个有一个参数的术语。因此(==)/2在这里失败。

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

+0

相反'(==)/ 2' – false

+0

@false确实,我有点懒。 – lurker

+1

还是懒,我的意思是围绕着括号,否则就是一个标记'== /' – false

相关问题