3

この回答でこのPrologコードを見つけました。これは、差分リストを使用してキューを実装しています:

%% empty_queue(-Queue)
% make an empty queue
empty_queue(queue(0, Q, Q)).

%% queue_head(?Queue, ?Head, ?Queue0)
% Queue, with Head removed, is Queue0
queue_head(queue(s(X), [H|Q], Q0), H, queue(X, Q, Q0)).

%% queue_last(+Queue0, +Last, -Queue)
% Queue0, with Last at its back, is Queue
queue_last(queue(X, Q, [L|Q0]), L, queue(s(X), Q, Q0)).

このようなことをすると、期待どおりに機能します。

..., empty_queue(Q), queue_last(Q, 999, Q_), writeln(Q_), ....

そして私は得る

queue(s(0),[999|_3076],_3076)

Qまた興味深いことに、このスニペットで の値を観察すると、次のようになります。

empty_queue(Q), writeln(Q), queue_last(Q, 999, Q_), writeln(Q)

私は得る:

queue(0,_3750,_3750)
queue(0,[999|_3758],[999|_3758])

違いは空のリストになるため、このようにする必要があると思います。したがって、それらは多少同等です。

問題は、コマンドの後です

queue_last(Q, 999, Q_)

Q再利用して を作成することはできませんQ__。例:

empty_queue(Q), queue_last(Q, 999, Q_), queue_last(Q, 888, Q__)

のバインディングがqueue_last(queue(X, Q, [L|Q0]), L, queue(s(X), Q, Q0)).失敗するためです。

L = 888, L = 999 (tries to be both)

この問題を解決するにはどうすればよいですか? 回避策はありますか?(常に差分リストを使用)

4

2 に答える 2