什么是Prolog运算符^?

Guy*_*der 7 lambda prolog exponentiation iso-prolog prolog-setof

什么是Prolog运算符^?

查看Prolog内置指令op,列出了内置运算符.

我看
**是取幂
/ \是或

但是^是什么?

当前三个答案中的每一个都是有价值的,我学到了一些东西:

  • 罗伊为这本书
  • 这个例子是假的
  • 我接受了CapelliC的答案,因为它明确表示^/2具有多种含义,
    具体取决于上下文,立即消除了我的困惑.

fal*_*lse 7

运营商有(^)/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)).它具有非常低的优先级,这意味着您必须使用括号作为标准运算符的参数.


Roy*_*tus 5

在数学表达式中,^ 是取幂,它只是 ** 的不同表示法。

在 lambda 表达式中,它是一个参数传递运算符。

正如 Pereira 和 Shieber 的书中所说:

因此 lambda 表达式 ? X。x + 1 将在 Prolog 中编码为 X^(X+1)。同样,lambda 表达式 ? X。? y.wrote(y, x) 将被编码为 Prolog 项 X^Y^wrote(Y,X),假设“^”的右结合

  • 那是我的*首选* Prolog 书! (2认同)

Cap*_*liC 5

在 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^/2is/2