首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >#=和=:=在SWI prolog中的区别是什么?

#=和=:=在SWI prolog中的区别是什么?
EN

Stack Overflow用户
提问于 2017-10-15 15:40:45
回答 2查看 2.2K关注 0票数 3

#==:=在SWI中的区别是什么?

我已经找到了SWI prolog的定义,但仍然对此感到困惑。

http://www.swi-prolog.org/pldoc/man?section=arithpreds

http://www.swi-prolog.org/pldoc/man?section=clpfd-arith-constraints

代码语言:javascript
运行
复制
?- 3=:=3.
true.

?- (3-2) =:= (9-8).
true.

?- 3 #= 3.
true.

?- (3-2) #= (9-8).
true.
EN

回答 2

Stack Overflow用户

发布于 2017-10-15 15:56:19

#=和=:=在SWI prolog中有什么区别?

区别在于,#=/2是一个CLPFD库操作符(您需要执行:use_module(library(clpfd)).才能使用它),它用于算术约束,并包含整数上的is/2=:=/2 。这意味着您只能将其用于整数:

例如,使用list会引发错误:

代码语言:javascript
运行
复制
?- L #= [1,2,3].
ERROR: Domain error: `clpfd_expression' expected, found `[1,2,3]' 

(在=:=/2中使用列表也会引发错误,列表示例只是为了理解两个运算符都用于表达式!)

对于整数,它可以在=:=可以使用的任何地方使用,但如上所述,它可以用作is/2,这意味着您可以将它用于统一--只需将一个变量绑定到某个整数值中,例如:

代码语言:javascript
运行
复制
?- X #= 2.
X = 2.

上面没有检查X和数字2之间的相等,因为X在无界变量中,它所做的是将X与值2结合起来。

这在=:=/2操作符中是不可能的:

代码语言:javascript
运行
复制
?- X =:= 2.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:    [8] _2494=:=2
ERROR:    [7] <user>

这是因为=:=/2只用于检查是否相等!!

这就是#=/2=:=/2之间的区别。两个都检查两个算术表达式之间的相等性,但是当使用=:=/2 时,所有变量都应该实例化。当将#=/2与变量一起使用时,这会在这些变量之间设置约束:

代码语言:javascript
运行
复制
?- X #= 2.
X = 2.      % constraints X to integer value 2

?- X + Y #= 2.
X+Y#=2.     % constraints X,Y such that sum equals to 2 see next example:

?- X + Y #= 2 , X = 3.
X = 3,
Y = -1.     % binds Y with -1 in order to succeed the constraint

?- X + Y #= 2 , X = 3 , Y > 0.
false.      % false since constraint can't succeed!

正如您可以看到的那样,#=/2显然更具有关系性,因为即使有一个约束,其中一个变量(例如X + Y #= 2. )设置了X,Y之间的关系,绑定一个变量也会导致另一个变量的推理。

在您的测试中,您没有看到任何区别,因为您的所有变量都有值(例如,它们是实例化的),并且您可以简单地检查是否相等,这两个操作符都实现了。

票数 3
EN

Stack Overflow用户

发布于 2017-10-15 16:18:17

见以下示例:

代码语言:javascript
运行
复制
:- use_module(library(clpfd)).

solve_equation_1(X) :- X + 1 =:= 2.
solve_equation_2(X) :- X + 1 #= 2.
solve_equation_3(X,Y,Z) :- X + Y #= Z.

正如您可能预期的那样,solve_equation_1适用于实例化的X,而非实例化的=:=是一个简单的操作符,检查表达式的相等性:

代码语言:javascript
运行
复制
?- solve_equation_1(1).
true.

?- solve_equation_1(2).
false.

?- solve_equation_1(X).
=:=/2: Arguments are not sufficiently instantiated

对于#=来说,情况并非如此。它并没有真正检查任何东西--它只是说一些变量和一些数字以某种特定的方式受到约束--例如,它们形成了一个方程。除非约束/方程如此简单,以至于可以立即求解,否则以后才会进行实际的检查和计算。这就是为什么对于非常简单的情况(如您的示例),#=看起来可能类似于=:=

参见这些示例--对于=:=来说,所有这些都是不可能的,它们表明,#=的结果不是一些真/假布尔值,而是新的约束:

代码语言:javascript
运行
复制
?- solve_equation_2(X).
X = 1.

?- solve_equation_3(X,Y,2).
X+Y#=2.

?- X #= Y + Z, solve_equation_2(X).
X = 1,
Y+Z#=1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46756842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档