Wou*_*eek 7 prolog operator-precedence iso-prolog
为什么**/2(xfx)和(^)/2(xfy)的参数优先级在Prolog中不一样?
这会导致轻微的不一致,例如:
?- X = 1, Y is 1 ^ -X.
X = Y, Y = 1.
Run Code Online (Sandbox Code Playgroud)
和:
?- Y is 1 ** -1.
Y = 1.
Run Code Online (Sandbox Code Playgroud)
但:
?- X = 1, Y is 1 ** -X.
ERROR: Syntax error: Operator priority clash
ERROR: X = 1, Y is 1 *
ERROR: ** here **
ERROR: * -X .
Run Code Online (Sandbox Code Playgroud)
小要点:它是(^)/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.
Run Code Online (Sandbox Code Playgroud)
(^)/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.
Run Code Online (Sandbox Code Playgroud)
(^)/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
Run Code Online (Sandbox Code Playgroud)
从 1982 年开始,它被用于自然语言解析器中的量化setof/3,也被用作 lambda。bagof/3对于所有这些用途,它已经具有正确的关联性和优先级。作为一个可评估的函子,它存在于多个系统中。
第一个用作(^)/2可评估函子(即幂)的系统可能是 C-Prolog。
与这一遗产相比,(**)/2Prolog 中的出现相对较晚,很可能是受到 Fortran 的启发。在第一个委员会草案(CD 1992)之前不久就建议将其纳入(N80 1991-07,巴黎文件)。系统也将其提供为exp/2.
(**)/2具有相同的优先级,(^)/2但没有任何结合性,乍一看可能会觉得很奇怪,因为在很多情况下,乘幂两次是很常见的。最突出的是最简单形式的高斯函数
e -x 2
exp/1提供了一个特殊的可评估函子,而不是使用常数 e 和求幂。上式则写为exp(- X**2)。事实上,维基百科也使用这种表示法。给定这个函子,在这种常见情况下不需要关联性。
如果真的有的话,我会很有兴趣看看。
与其他系统相比,提供两种求幂似乎很常见。想想 Haskell,它有^和**。
结论:似乎并不常见需要嵌套浮点求幂的情况。因此,最小的支持似乎更可取。