Prolog 为什么下面的术语不统一?

Prolog 为什么下面的术语不统一?,prolog,instantiation-error,Prolog,Instantiation Error,在prolog中=用于统一,据我所知,如果变量实例化,这两个术语是否可以匹配可能需要帮助,它们是统一的 那么为什么下面的查询失败呢 ?- 2+2 = 4. 虽然2+2生成4,这与另一项的数字相同。左侧的表达式本身不计算。而是比较字符串的统一。要将表达式的求值统一与右侧进行比较,需要使用is/2运算符 ?- 4 is 2+2. 与之相比: ?- 2+2 = 2+2. 及 左侧的表达式不会自行计算。而是比较字符串的统一。要将表达式的求值统一与右侧进行比较,需要使用is/2运算符 ?- 4 is

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

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

?- 2+2 = 4.

虽然2+2生成4,这与另一项的数字相同。

左侧的表达式本身不计算。而是比较字符串的统一。要将表达式的求值统一与右侧进行比较,需要使用is/2运算符

?- 4 is 2+2.
与之相比:

?- 2+2 = 2+2.


左侧的表达式不会自行计算。而是比较字符串的统一。要将表达式的求值统一与右侧进行比较,需要使用is/2运算符

?- 4 is 2+2.
与之相比:

?- 2+2 = 2+2.

当你写作时

2+2=4

答案是否定的,因为prolog会将数字4与公式2+2进行比较,这两个公式是不同的。为了使其正确,您需要prolog在将公式2+2与4进行比较之前对其求值。为此,请使用is运算符:

is运算符专门用于数学函数。左参数必须是一个变量,右参数必须是一个所有变量都实例化的数学函数

=运算符用于统一变量,可以与任意两个参数一起使用,但如果两个参数不相同,并且无法通过某种方式实例化变量使其相同,则会失败

在你的例子中:

4 is 2+2
写入时,将计算为是。

2+2=4

答案是否定的,因为prolog会将数字4与公式2+2进行比较,这两个公式是不同的。为了使其正确,您需要prolog在将公式2+2与4进行比较之前对其求值。为此,请使用is运算符:

is运算符专门用于数学函数。左参数必须是一个变量,右参数必须是一个所有变量都实例化的数学函数

=运算符用于统一变量,可以与任意两个参数一起使用,但如果两个参数不相同,并且无法通过某种方式实例化变量使其相同,则会失败

在你的例子中:

4 is 2+2

将评估为是。

作为对其他帖子的补充,我建议=/2在推理整数时作为is/2更具声明性的替代品

=/2表示整数表达式的算术等式。这涉及一个评估步骤,因此与语法质量不同。在你的情况下,你期待前者,但得到了后者

使用GNU Prolog的示例:

| ?- 4 #= 2+2. yes 相比之下,我们得到的是is/2:


这样的问题在初学者第一次学习算术时非常常见,因此我建议您至少在开始时就开始使用更多的声明性谓词。

作为对其他帖子的补充,我建议在推理整数时,使用=/2作为is/2更具声明性的替代方法

=/2表示整数表达式的算术等式。这涉及一个评估步骤,因此与语法质量不同。在你的情况下,你期待前者,但得到了后者

使用GNU Prolog的示例:

| ?- 4 #= 2+2. yes 相比之下,我们得到的是is/2:


这样的问题在初学者第一次学习算术时非常常见,因此我建议您至少在开始时就开始使用更多的声明性谓词。

其他人的回答是正确的,但这里有一点更详细

在Prolog中,术语2+2只是术语“+”2,2”的一种句法替代。这是一个带有函子+和两个参数2和2的术语。术语2只是一个整数,没有参数。=/2运算符尝试统一术语。它不执行算术表达式计算。这些术语明显不同,不能统一,它们甚至没有相同数量的参数

Prolog中有一些运算符将执行表达式求值。对于表达式等式,可以使用=:=/2或更好,正如@mat指出的,对于整数的推理,可以使用=/2。因此,以下措施将起作用:

| ?- 2+2 =:= 4.

yes
| ?- 2+2 #= 4.

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

| ?- 2+2 is 4.

no
| ?- 4 is 2+2.

yes
| ?- 

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

在Prolog中,术语2+2只是术语“+”2,2”的一种句法替代。这是一个带有函子+和两个参数2和2的术语。术语2只是一个整数,没有参数。=/2运算符尝试统一术语。它不执行算术表达式计算。这些术语明显不同,不能统一,它们甚至没有相同数量的参数

这里有操作员 将执行表达式计算的Prolog。对于表达式等式,可以使用=:=/2或更好,正如@mat指出的,对于整数的推理,可以使用=/2。因此,以下措施将起作用:

| ?- 2+2 =:= 4.

yes
| ?- 2+2 #= 4.

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

| ?- 2+2 is 4.

no
| ?- 4 is 2+2.

yes
| ?- 

如果您更习惯于java或c等命令式语言,那么最好将Prolog中的2+2=4看作2+2==4。只有当你把4设为2+2时,Prolog才会计算2+2。如果你更习惯于像java或c这样的命令式语言,那么最好把Prolog中的2+2=4看作2+2==4。只有当你把4等于2+2时,Prolog才会计算2+2。2+2等于4不会计算为yes。它将失败。2+2等于4不会计算为是。它将失败。