2

私は Prolog の初心者で、2 つの要件があります。

  1. f(1) = 1

  2. f(x) = 5x + x^2 + f(x - 1)

ルール:

f(1,1). f(X,Y) :- Y is 5 * X + X * X + f(X-1,Y).

クエリ:

f(4,X).

出力:

ERROR: is/2: Arguments are not sufficiently instantiated

f(X-1) の値を追加するにはどうすればよいですか?

4

2 に答える 2

5

これは、補助変数を使用することで簡単に解決できます。

たとえば、次のことを考慮してください。

f(1, 1)。
f(X, Y) :-
        Y #= 5*X + X^2 + T1 ,
         T2 #= X - 1,
        f(T2, T1)。

これは、それぞれ部分式f(X-1)X-1を表す補助変数T1とを使用して、指定したルールを簡単に翻訳したものです。@BallpointBen が正しく指摘しているように、これらの用語は算術評価とは異なるため、用語自体を使用するだけでは十分ではありません。特に、は整数 ではありません、成り立ちます!T2-(2,1)12 - 1 #= 1

Prolog システムによっては、整数式の等価性を表す述語を使用するために、現在でもライブラリをインポートする必要がある場合があります。(#=)/2

あなたのサンプルクエリはすでに解決策を生み出しています:

?- f(4, X)。
X = 75

この場合、述語は普遍的に終了しないことに注意してください。

?- f(4, X)、偽。
不始末

追加の制約を使用して、簡単にそうすることができます。

f(1, 1)。
f(X, Y) :-
        X #> 1、
        Y #= 5*X + X^2 + T1,
        T2 #= X - 1、
        f(T2, T1)。

これで、次のようになりました。

?- f(4, X)。
X = 75;
間違い。

最も一般的な場合でも、これを真の関係として使用できることに注意してください。

?- f(X, Y)。
X = Y、Y = 1 ;
X = 2、
Y = 15;
X = 3、
Y = 39;
X = 4、
Y = 75;
等

低レベルの演算に基づくバージョンは、通常、そのようなクエリのインスタンスの非常に限られたサブセットのみをカバーします。(#=)/2 したがって、代わりにを使用することをお勧めします(is)/2。特に初心者には使い方(is)/2が難しすぎます。証拠として、下に提出された多くの関連する質問 を取り上げ、宣言的な解決策についてはを参照してください。

于 2016-12-11T09:45:14.950 に答える