Prolog的广场差异

时间:2016-05-21 10:10:45

标签: prolog clpfd instantiation-error

我想在序言中发现a + 1的平方和a的平方之间的区别是2a + 1。出于这个原因,我写了这样的代码:

:- use_module(library(clpfd)).

kare(X,Y):- Y #= X*X.

abc(A,B,F) :-
        kare(A,P),
        kare(B,T), 
        F is P-T.

我用

尝试了
?- abc(D,E,P).

ERROR: is/2: Arguments are not sufficiently instantiated.

任何人都可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:3)

您收到错误是因为您使用的是is / 2,它希望绑定参数。但是在您的示例查询中,参数DEP是未绑定的变量,因此当您到达目标时,PT也是未绑定的是/ 2。由于您已经在使用clpfd,请改用#= / 2:

abc(A,B,F) :-
   kare(A,P),
   kare(B,T),
   F #= P-T.    % <- here

这样您的查询就会产生结果:

   ?- abc(D,E,P).
D^2#=_A,
_A in 0..sup,
P+_B#=_A,
_B in 0..sup,
E^2#=_B