Prolog错误:是/ 2:参数没有充分实例化

时间:2016-11-09 04:29:05

标签: prolog clpfd instantiation-error

我是Prolog的新手。我写了一个很短的程序如下:

package container.random.B;

import container.random.A.RandomA;

public class test
{

    public static void main ( String [ ] args )
    {
        RandomA randomA = new RandomA ( );
        randomA.setRandomAID ( 1 );

        RandomB randomB = new RandomB ( randomA );
        System.out.println ( randomB.getMyForeignRandom ( ).getRandomAID ( ) );

        randomA.setRandomAID ( 2 );
        System.out.println ( randomB.getMyForeignRandom ( ).getRandomAID ( ) );

    }

}

当我运行它时,我遇到以下问题:

plus(X,Y,R):- R is X+Y.

为什么会发生错误?如何修改代码以实现相同的目标? 谢谢大家的帮助!!!

1 个答案:

答案 0 :(得分:2)

这不起作用的原因是/ 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是如何相关的。