Guy*_*der 7 lambda prolog exponentiation iso-prolog prolog-setof
什么是Prolog运算符^?
查看Prolog内置指令op,列出了内置运算符.
我看
**是取幂
/ \是或
但是^是什么?
当前三个答案中的每一个都是有价值的,我学到了一些东西:
运营商有(^)/2
多种用途:
setof/3
, bagof/3
这里它用于表示术语的存在变量(集合).就像在
setof(Ch, P^child_of(Ch,P), Chs)
哪里P
被宣布为存在变量一样.
作为对此的非标准副作用,许多系统已将其定义为具有以下定义的谓词:
_^Goal :- Goal
Run Code Online (Sandbox Code Playgroud)
但是,其他人没有这样的定义.无论如何,避免定义谓词是一个好主意(^)/2
.
(^)/2
- 力量这是通过访问一个可评估的函子(is)/2
和像算术比较(=:=)/2
和(>)/2
.也library(clpfd)
使用它具有这个含义.相反,(**)/2
它总是产生一个浮点数,2^2
是一个整数 - 从而允许具有bigint的算术.试着?- X is 7^7^7.
看看你的系统是否支持它们.
最后,有一些用户定义的用法(^)/2
不会与lambda表达式library(lambda)
(source)之类的上述用法发生冲突.
关于它的使用有一些一般性的评论.(^)/2
与权利相关联,这意味着:
(7^7^7) = (7^(7^7))
.它具有非常低的优先级,这意味着您必须使用括号作为标准运算符的参数.
在数学表达式中,^ 是取幂,它只是 ** 的不同表示法。
在 lambda 表达式中,它是一个参数传递运算符。
正如 Pereira 和 Shieber 的书中所说:
因此 lambda 表达式 ? X。x + 1 将在 Prolog 中编码为 X^(X+1)。同样,lambda 表达式 ? X。? y.wrote(y, x) 将被编码为 Prolog 项 X^Y^wrote(Y,X),假设“^”的右结合
在 Prolog 中,大多数符号都可以“未解释”地使用,在语法级别,特别是在op/3
声明之后,任何原子都可以用作operator。然后,您可以使用,例如,^/2
作为域特定语言(DSL)的函数构造函数,其语义从您的规则中指定。
是 SWI-Prolog(或更一般地在 ISO Prolog 中),current_op/3
为您提供有关声明运算符的信息:
?- current_op(X,Y,^).
X = 200,
Y = xfy.
Run Code Online (Sandbox Code Playgroud)
也就是说,当用于装饰第二个参数时,任何 Prolog 实现都应setof/3
解释^/2
为量化说明符。同样,当发生在表达式的右侧时,任何 Prolog 实现都应解释为幂运算。is/2
^/2
is/2
归档时间: |
|
查看次数: |
1517 次 |
最近记录: |