Math Prolog=:=运算符
Prolog中有一些特殊的操作符,其中一个是Math Prolog=:=运算符,math,prolog,operators,equality,arithmetic-expressions,clpfd,clpq,clpb,Math,Prolog,Operators,Equality,Arithmetic Expressions,Clpfd,Clpq,Clpb,Prolog中有一些特殊的操作符,其中一个是is,但是,最近我遇到了=:=操作符,不知道它是如何工作的 有人能解释一下这个操作符的作用吗?我在哪里可以找到这些特殊操作符的预定义列表以及它们的作用?我找到了自己的答案 另外,请参见文档我认为上述答案值得在这里作几句解释 提前注意:Prolog中的算术表达式只是术语(“Prolog中的一切都是术语”),不会自动计算。(如果您有Lisp背景,请考虑引用列表)。所以3+4与+(3,4)完全相同,它自己什么都不做。评估这些术语是每个谓词的责任 几个内置谓词
is
,但是,最近我遇到了=:=
操作符,不知道它是如何工作的
有人能解释一下这个操作符的作用吗?我在哪里可以找到这些特殊操作符的预定义列表以及它们的作用?我找到了自己的答案
另外,请参见文档我认为上述答案值得在这里作几句解释 提前注意:Prolog中的算术表达式只是术语(“Prolog中的一切都是术语”),不会自动计算。(如果您有Lisp背景,请考虑引用列表)。所以
3+4
与+(3,4)
完全相同,它自己什么都不做。评估这些术语是每个谓词的责任
几个内置谓词执行隐式求值,其中包括算术比较运算符,如=:=
和is
。当=:=
计算两个参数并比较结果时,is
只接受并计算作为算术表达式的正确参数
左参数必须是原子,或者是数值常量(然后与右操作数的计算结果进行比较),或者是变量。如果它是绑定变量,则其值必须是数字,并与前一种情况下的右操作数进行比较。如果是未绑定变量,则右操作数的计算结果将绑定到该变量is
通常用于后一种情况,即绑定变量
从上面链接的Prolog字典中选取一个示例:要测试数字N是否为偶数,可以使用两个运算符:
0 is N mod 2 % true if N is even
0 =:= N mod 2 % dito
但是,如果要捕获操作的结果,只能使用第一个变量。如果X未绑定,则:
X is N mod 2 % X will be 0 if N is even
X =:= N mod 2 % !will bomb with argument/instantiation error!
经验法则:如果您只需要算术比较,请使用
=:=
。如果要捕获计算结果,请使用is
=:=作为比较运算符。如果表达式A1和A2的值相等,则A1=:=A2成功。
如果术语A1和A2相同,则A1==A2成功 第一个运算符=:=检查是否相等? 例如 这是真的。 但这个结果是错误的
作为对现有答案的补充,我想补充几点: 操作员就是操作员 首先,操作符
=:=
如名称所示,是一个操作符。在Prolog中,我们可以使用谓词current\u op/3
来了解有关操作符的更多信息。例如:
?- current_op(Prec, Type, =:=).
Prec = 700,
Type = xfx.
?- 1 + 2 =:= 3.
true.
| ?- 1 + 2 #= 3.
yes
谓词不是运算符
到目前为止,一切都很好!这只是一个纯粹的语法特征。然而,你实际上要问的是谓词(=:=)/2
,它的名字是=:=
,需要2个参数
正如其他人已经解释过的,谓词(=:=)/2
表示两个算术表达式的算术等式。如果其参数的计算结果相同,则为真
例如,让我们尝试最通用的查询,通过该查询,我们可以使用变量作为参数来请求任何解决方案:
?- X =:= Y.
ERROR: Arguments are not sufficiently instantiated
我使用GNUProlog作为一个特定的例子,许多其他Prolog系统也提供CLP(FD)实现
约束的主要吸引力在于其通用性。例如,与(=:=)/2
相比,我们使用谓词(#=)/2
:
| ?- X + 2 #= 3.
X = 1
| ?- 1 + Y #= 3.
Y = 2
这表明您必须区分运算符和谓词。在上述情况下,谓词
sat/1
已将给定表达式解释为命题公式,在此上下文中,=:=
表示布尔表达式的相等性。是ISO核心标准谓词运算符,不能使用从统一(=)/2或语法等式(=)/2引导。它在第8.7节算术比较中定义。它的基本行为如下:
E =:= F :-
X is E,
Y is F,
arithmetic_compare(=, X, Y).
因此,左手侧(LHS)和右手侧(RHS)都必须是算术表达式,在比较它们之前必须求值。算术比较可以跨数值类型进行比较。因此我们有:
GNU Prolog 1.4.5 (64 bits)
?- 0 = 0.0.
no
?- 0 == 0.0
no
?- 0 =:= 0.0.
yes
在Erlang中,我认为最好对其进行注释,因为语法与Prolog非常相似
=:=
表达式是完全相等的意思
例如在JavaScript中,您可以使用==
来查看变量的类型是否相同。
基本上它的逻辑是相同的,但是函数式语言中使用的是Prolog、Erlang
信息不多,但希望能有所帮助。为什么这不是正确的答案,我永远也不知道(.)什么时候使用“is”“左侧是否可以有多个变量?例如X+Y=2+3。@hiswendy这会是什么结果?!请记住,
is
将其右侧作为算术表达式进行计算。在你的例子中是5。5应该如何与左边的术语统一,如X+Y
?!-您使用的=/2
谓词是一个最通用的统一函数,它尝试匹配和绑定两个任意术语。它不进行自动算术计算,因此与这里讨论的=:=
也有很大不同。@ThomasH hiswendy在技术上是正确的,尽管?-X+Y=2+3。
生成一个结果,结果是X=2,Y=3。
但是使用CLP算术,一个人可以做X+4#=2+3.
并得到X=1.
哪个更有用。@ErikKaplun我同意使用=
。但是他温迪所关心的问题是,这是行不通的。回答得很好,马特。我特别喜欢你介绍op和write_canonical用法的方式。在我看来,op是prolog的一个非常重要的特性。但是,我强烈反对你的as
| ?- X #= Y.
X = _#0(0..268435455)
Y = _#0(0..268435455)
?- sat(A =:= B+1).
A = 1,
sat(B=:=B).
E =:= F :-
X is E,
Y is F,
arithmetic_compare(=, X, Y).
GNU Prolog 1.4.5 (64 bits)
?- 0 = 0.0.
no
?- 0 == 0.0
no
?- 0 =:= 0.0.
yes