3

次のように書いた加算ルールによる乗算のエラーArguments are not sufficiently instantiatedが続きます。エラーメッセージ "引数が十分にインスタンス化されていません"が理解できない理由を理解できません

mult(_, 0, 0).         %base case for multiplying by 0 
mult(X, 1, X).         % another base case 
mult(X, Y, Z) :- 
    Y > 1, 
    Y1 is Y - 1, 
    mult(X, Y1, Z1), 
    Z is X + Z1. 

私はプロローグには新しく、このような単純な問題でも本当に苦労しています。

書籍やオンラインチュートリアルのおすすめは素晴らしいです。

私はUbuntu LinuxのSWI-Prolog上で実行しています。

答えて

2

最後の2回のコールが逆転したと思います。あなたが意味するものではありません。

            
 
             
  mult(X,Y,Z):- Y>1,Y1 is Y-1, Z1 is X+Z, mult(X,Y1,Z1). 
            
 

編集

用事それは、再びコードを見て、それは意味がありません。元のコードが正しいと思います。

なぜそのエラーが発生しているかについては、述語の呼び出し方法を知る必要があります。入力例を挙げることができますか?

あなたの述語を呼び出す正しい方法はmult(+X, +Y, ?Z)です:

?- mult(5,0,X). 
X = 0 

?- mult(5,1,X). 
X = 5 

?- mult(5,5,X). 
X = 25 

?- mult(4,4,16). 
yes 

?- mult(3,3,10). 
no 

などそのうちの一つが、右側に使用されるため、そのエラーが生成されます最初の二つの引数で自由変数とそれを呼び出しますisのいずれか、または<のいずれかの側にあり、これらの述語は、根拠のある用語が成功することを期待しています。

+0

私はコンパイルできません私は単にファイルをプロローグ[PA3]にロードしようとします。このエラーが発生します。これは奇妙だと思います –

+1

ファイルの名前を小文字に変更してみてください。 Prologが 'PA3'を見ると、それを変数と解釈するため、エラーが発生します。もう一つの選択肢は、引用符を使うことです: '['PA3']'それはうまくいくかもしれません。それ以外に、あなたのプログラムは100%罰金です! (ここでテストしても、全く問題はありません) – mgibsonbr

+0

haha​​haありがとうございました。私はほとんど夢中になりました。 –

4

mult/3の定義では、最初の2つの引数を知らなければなりません。そのうちの1つでも変数の場合は、インスタンス化エラーが発生します。例えば。 mult(2, X, 6)は、X = 3は正解ですが、インスタンス化エラーが発生します。実際には、唯一の答えです。

あなたが持っているいくつかのオプションがあります:

、制約、またはメタ論理述語は。

ここ後継算術演算での出発点は次のとおりです。

add(0,Y,Y). 
add(s(X),Y,s(Z)) :- add(X,Y,Z). 

別のアプローチは、整数上の制約を使用することであろう。 YAPとSWIはlibrary(clpfd)という非常に柔軟な方法で使用できます。通常の整数計算とより一般的な制約の両方があります。もちろん、乗算がすでに事前定義されています。

 
?- A * B #= C. 
A*B#=C. 

?- A * B #= C, C = 6. 
C = 6, 
A in -6.. -1\/1..6, 
A*B#=6, 
B in -6.. -1\/1..6. 

?- A * B #= C, C = 6, A = 2. 
A = 2, 
B = 3, 
C = 6. 

メタ論理述語:私はあなたが様々なケースを区別し、別々にそれらを処理するためにvar/1nonvar/1ground/1を使用している場合は、このオプションをお勧めすることはできません。これは間違いやすいので、私はめったにそれらを使って正しいプログラムを見たことがありません。実際には、よく知られている教科書でも重大なエラーが含まれています。

関連する問題