我最近在Prolog中使用谓词#=/2看到了一个程序.我在SWI prolog网站上查看了它,并将其定义为
算术表达式X等于Y.当对整数进行推理时,将#=/2替换为/ 2以获得更一般的关系.
我不明白的是,#=/2可以更"通用",因为它只适用于整数.
从文档输入页面:
它们在整数表达式之间实现纯关系,可以在所有方向上使用
举个例子:
?- 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),因为域的有限性通常可以放宽.