1

次の Prolog コードを書きました。

concatenate([X|L1], L2, [X|L3]) :- concatenate(L1, L2, L3).
concatenate([], L, L).

rev([X|L], Y) :- concatenate(Z, [X], Y), rev(L, Z).
rev([], []).

次のようなクエリを実行すると:

?- rev([1,2,3], [3,2,1]).  ->  true
?- rev([1,2,3], [ X, Y, Z]).  -> X=3, Y=2, Z=1

それは大丈夫ですが、もしそうなら:

?- rev([1, 2, 3], X).

私は得る:

ERROR: Out of local stack

Web での正しい実装を見つけることができると確信してreverse functionいますが、このエラーの原因を知りたいです。

4

2 に答える 2

3

concatenate(L1, L2, L3).インスタンス化されていない L1 と L3の両方で get が呼び出され、永久にループします。デバッガーを使用してこの動作を確認できます。

?- gtrace,rev([1,2,3],X).

次に、連結内のステップを要求します (スペースバーを押します)。左上のフレーム (バインディング) には、インスタンス化された変数が表示されます。L2 だけが値を取得します。

于 2012-08-28T10:40:44.340 に答える
1

それ以外の:

rev([X|L], Y) :- concatenate(Z, [X], Y), rev(L, Z).

試す:

rev([X|L], Y) :- rev(L, Z), concatenate(Z, [X], Y).
于 2012-08-28T13:15:01.243 に答える