我是 Prolog 的新手。我写了一个很短的程序如下:
plus(X,Y,R):- R is X+Y.
当我运行它时,我遇到以下问题:
?- plus(1,1,2).
true
?- plus(1,1,X).
X=2
?- plus(1,X,2).
ERROR: is/2: Arguments are not sufficiently instantiated
为什么会发生错误?如何修改代码以实现相同的目标?谢谢大家帮助我!!!
我是 Prolog 的新手。我写了一个很短的程序如下:
plus(X,Y,R):- R is X+Y.
当我运行它时,我遇到以下问题:
?- plus(1,1,2).
true
?- plus(1,1,X).
X=2
?- plus(1,X,2).
ERROR: is/2: Arguments are not sufficiently instantiated
为什么会发生错误?如何修改代码以实现相同的目标?谢谢大家帮助我!!!
这不起作用的原因是 is/2 是(就像)一个函数。给定 X,Y 它计算 X+Y 并将其存储到 R(它用 X+Y 实例化 R)。如果提供了 R 并且 X 或 Y 是一个 var(它尚未实例化),那么它如何计算 X+Y,这就是实例化错误的原因。
要解决这个问题,您应该使用更相关的模块:CLPFD
:- use_module(library(clpfd)).
plus(X,Y,R):- R #= X+Y.
一些例子:
**?- [ask].
true.
?- plus(1,1,2).
true.
?- plus(1,1,X).
X = 2.
?- plus(1,X,2).
X = 1.
?- plus(X,Y,2).
X+Y#=2.
?- plus(X,Y,R).
X+Y#=R.**
您可以在最后一种情况下看到作为答案给出的 X、Y 和 R 是如何相关的。