首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog为什么下一个术语不统一?

Prolog为什么下一个术语不统一?
EN

Stack Overflow用户
提问于 2017-03-31 12:31:02
回答 3查看 828关注 0票数 2

在prolog中,=用于统一,据我所知,如果这两个术语可以匹配,如果变量实例化,它们是统一的。

那么为什么下面的查询失败呢?

代码语言:javascript
复制
?- 2+2 = 4.

尽管2+2生成4,这与另一个项的数字相同。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-31 14:12:03

其他人的回答是正确的,但这里有一些更多的细节。

在Prolog中,术语2+2只是术语'+'(2, 2)的一个句法替代。这是一个带有函子+的术语,有两个参数(2和2)。术语2只是一个插话者,没有任何论点。=/2运算符试图统一术语。它不执行算术表达式计算。这些术语显然不同,不能统一(它们甚至没有相同数量的参数)。

Prolog中有将执行表达式计算的运算符。对于表达式相等,您可以使用=:=/2或更好,正如@mat指出的对整数进行推理时,您可以使用#=/2。因此,以下内容将发挥作用:

代码语言:javascript
复制
| ?- 2+2 =:= 4.

yes
| ?- 2+2 #= 4.

yes
| ?- 

还有is/2,它只计算第二个参数,并确定它的值是否与第一个参数的值相同。因此,将发生以下情况:

代码语言:javascript
复制
| ?- 2+2 is 4.

no
| ?- 4 is 2+2.

yes
| ?- 

上面的例子在GNU prolog中。请注意,在SWI Prolog中,必须包括CLP(FD)库才能使用对整数进行推理的运算符:

代码语言:javascript
复制
:- use_module(library(clpfd)).
票数 2
EN

Stack Overflow用户

发布于 2017-03-31 12:37:13

左边的表达式不是由自己计算的.相反,您比较的是字符串的统一。要比较表达式的计算结果与右侧的统一,需要使用is/2操作符。

代码语言:javascript
复制
?- 4 is 2+2.

与以下比较:

代码语言:javascript
复制
?- 2+2 = 2+2.

代码语言:javascript
复制
?- X is 2+2.
票数 1
EN

Stack Overflow用户

发布于 2017-03-31 12:37:56

当你写

2+2=4

答案是否定的,因为prolog将比较一个数字(4)和一个公式(2+2),这是不一样的。为了使其正确,您需要prolog在将公式2 + 24进行比较之前对公式进行计算。为此,请使用is操作符:

is运算符是专门用于数学函数的。左参数必须是变量,右参数必须是一个数学函数,所有变量都实例化。 =操作符用于统一变量,并且可以用于任意两个参数(尽管如果两个参数不相同,并且不能通过以某种方式实例化变量,则会失败) [来源]

所以在你的例子中:

代码语言:javascript
复制
4 is 2+2

将评估为yes

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43140744

复制
相关文章

相似问题

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