Prolog 为什么下面的术语不统一?
在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
?- 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不会计算为是。它将失败。