在Prolog中#=是什么意思?

IIM*_*IIM 3 prolog clpfd

我最近在Prolog中使用谓词#=/2看到了一个程序.我在SWI prolog网站上查看了它,并将其定义为

算术表达式X等于Y.当对整数进行推理时,将#=/2替换为/ 2以获得更一般的关系.

我不明白的是,#=/2可以更"通用",因为它只适用于整数.

Cap*_*liC 6

从文档输入页面:

它们在整数表达式之间实现纯关系,可以在所有方向上使用

举个例子:

?- X+3 #= X*2.
X = 3.
Run Code Online (Sandbox Code Playgroud)

看起来很简单,但实际上在传统的算术表达式评估中获得这样的结果相当困难.

?- X+3 is X*2.
ERROR: is/2: Arguments are not sufficiently instantiated
Run Code Online (Sandbox Code Playgroud)

从is/2页面,您可以看到签名

-Number is +Expr
Run Code Online (Sandbox Code Playgroud)

在哪里+Expr意味着必须磨碎.

另外,左边的参数是/ 2实际上应该是原子的:

?- 3+3 is 3*2.
false.
Run Code Online (Sandbox Code Playgroud)

尽管我们知道上述陈述应该是真的......

注意:名称CLP(FD)有点"轻描淡写",正如@false指出的那样,可以命名为CLP(Z),因为域的有限性通常可以放宽.