2

プロローグで 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.

誰でもこの問題で私を助けてください。

4

1 に答える 1

3

引数がバインドされることを期待する is/2 を使用しているため、エラーが発生します。Dしかし、あなたの例では、引数をクエリし、EはバインドされPていない変数であるためPTis/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
于 2016-05-21T10:21:26.197 に答える