2016-05-21 12 views
2

プロローグでa + 1の平方とaの平方の差が2a + 1であることを知りたい。私は プロローグの相違点

?- abc(D,E,P). 

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

誰もがこの問題で私を助け

でそれを試してみました

:- use_module(library(clpfd)). 

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

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

:このような理由から私はこのようなコードを書きました。

+2

完全に別のトピックのための新たな質問をしてください。これを以前の質問に戻し、あなたが与えた答えを受け入れてください。全く異なるものになるように質問を修正すべきではありません。 – mat

+0

私はそれを尋ねることができませんそれは待つ3日 – dymayd

+1

あなたの変更を元に戻し、答えを受け入れて、*そして*新しい質問をしてください。 – mat

答えて

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 
+0

okeyどのように見つけることができますか?aの正方形とaの正方形との差異が2a + 1であることを確認してください。** – dymayd

+1

@dymayd:a + 1の正方形との違いを正しく理解しているかわかりませんaの2乗は2a + 1 *である。あなたの述語abc/3を見ると、「?-D#= A + 1、E#= 2 * A + 1、abc(D、E、P)」のようなクエリーをしたいと思うかもしれません。 A#= 2、D#= A + 1、E#= 2 * A + 1、abc(D、E、P)。あなたはいくつかの例を提供できますか?結果は期待していますか? – tas