次要点:它(^)/2
不是^/2
表示^
用作运算符并使其有效的Prolog语法和谓词指示符(7.1.6.6)。
(**)/2
和(^)/2
都是可评估函子 (9),因此它们可以用于与 的算术评估 (8.7) 和(is)/2
与 的算术比较 (8.7)(=:=)/2
等(<)/2
。它们的定义略有不同。
(**)/2
总是以与总是给出浮点数相同的方式返回(/)/2
浮点数。(SWI 不遵循这里的标准,它有自己的约定)。
?- X is 2**2.
X = 4.0.
?- X is 2/2.
X = 1.0.
(^)/2
在这里允许整数取幂,这对于现在支持任意大整数的许多系统来说变得更加重要。想想2^2^X
。也就是说,如果两个参数都是整数,则结果也是整数,与(*)/2
处理这种情况的方式相同。
?- X is 2^2, Y is 2*2.
X = 4, Y = 4.
?- X is 2.0^2, Y is 2.0*2.
X = 4.0, Y = 4.0.
在那些(^)/2
会给出带有两个整数参数的实值(如2^ -1
)的情况下,会产生类型错误,然后对于其他复杂或未定义的结果会产生更多错误。
(^)/2
很长一段时间以来一直用于求幂。指数运算符的早期使用是在 DHD Warren 的 1977 年论文中的符号微分示例中。(至少在 Philippe Roussel 1975 年的手册中没有提及)。在整个论文和 1978 年的用户指南中,该~
字符始终如一地使用,^
在integers are restricted to the range -2~17 to 2~17-1 , ie. -131072 to 131071.
声明如下,并且自 1982 年以来没有改变。
:- op(300, xfy, ~). % 1977
:- op(200, xfy, ^). % 1982 - today
从 1982 年开始,它被用于量化setof/3
并bagof/3
在自然语言解析器中用作 lambdas。对于所有这些用途,它已经具有正确的关联性和优先级。作为一个可评估的函子,它存在于几个系统中。
第一个(^)/2
用作可评估函子的系统可能是 C-Prolog。
与这种传承相比,(**)/2
Prolog 中出现的相对较晚,很可能是受到 Fortran 的启发。在第一次委员会草案(CD 1992)之前不久,它被提议纳入(N80 1991-07,巴黎论文)。系统也将其提供为exp/2
.
(**)/2
具有相同的优先级,(^)/2
但没有任何关联性,起初可能会觉得很奇怪,因为在相当多的情况下,通常会进行两次幂运算。最突出的是,最简单形式的高斯函数
e -x 2
代替使用常数 e 和取幂,exp/1
提供了一个特殊的可评估函子。上面因此写为exp(- X**2)
。事实上,维基百科也使用这种表示法。给定这个函子,在这种常见情况下不需要关联性。
如果真的有的话,我会非常有兴趣看到它。
与其他系统相比,提供两种幂运算似乎很常见。^
想想有和的 Haskell **
。
总结:似乎并不常见需要嵌套浮点取幂的情况。因此,最少的支持似乎更可取。