Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math Prolog=:=运算符_Math_Prolog_Operators_Equality_Arithmetic Expressions_Clpfd_Clpq_Clpb - Fatal编程技术网

Math 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)完全相同,它自己什么都不做。评估这些术语是每个谓词的责任 几个内置谓词

Prolog中有一些特殊的操作符,其中一个是
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