0

私は機能を持っています

sublist(_,[_],_) :-
    !.
sublist(X,[Y|T],Z) :-
    R is X - Y,
    sublist(X,T,[R|Z]).

呼び出しの例はsublist(2,[1,2,3],Z). 実行の最後に「はい」とだけ返されますが、Z の内容を確認したいと思います。

同様のことを行う他の命令があるので、それは簡単なことだと思いますが、これは機能していません。

4

2 に答える 2

3

また、sublist/3はリスト内のすべてのアイテムから数値を減算することになっていると仮定します。

Zの結果が得られない理由は、再帰への途中でリストを作成しているためです。つまり、停止述語が成功すると、Prologは再帰から抜け出し、Zは再びインスタンス化されなくなります。

Z is ?
    |
    Z is [-1]
        |
        Z is [-1, 0]
            |
            Z is [-1, 0, 1]
            |
        Z is [-1, 0]
        |
    Z is [-1]
    |
Z is ?

最初に再帰に入り、途中でリストを作成してみてください。多分このように:

subtract_list(_, [], []).

subtract_list(Number, [Head|Tail], [Subtracted|Result]):-
    subtract_list(Number, Tail, Result),
    Subtracted is Head - Number.

変更したのは、再帰述語のルールの順序と停止条件の条件だけです。これで、空のリストに到達するまで繰り返し、その時点で結果変数も空のリストでインスタンス化されます。次に、バブルバックしてリストに値を追加します。

?- subtract_list(1,[4,3,2],Z).
Z = [3, 2, 1] 

お役に立てれば。トム

于 2009-04-04T12:47:05.247 に答える
1

あなたは実際sublist/3に何をすべきかを特定していませんが、おそらくこれを意味しています:

sublist(_, [], []) :- !.

sublist(X, [Y | T], [R | Z]) :-
    R is X - Y,
    sublist(X, T, Z).

使用例:

?- sublist(2, [1, 2, 3], Z).
Z = [1, 0, -1].

ところで、自分でリストを反復処理したくない場合はmaplist/3、SWI-Prolog が提供するものを使用できます。まず、目的の計算を定義します。

my_calculation(X, Y, Z) :-
    Z is X - Y.

そして、次のように呼び出しますmaplist/3

?- maplist(my_calculation(2), [1, 2, 3], Z).
Z = [1, 0, -1].
于 2008-12-18T19:56:57.897 に答える