差別化されたリストが「コンテキスト外」で使用されたことはありませんでした。主なコンテキストはDCGの実装です。
ここはDCGベースの逆です(私は自分で書きましたが、クリスチャンによってリンクされたページでも見つけることができます)。
それはあなたのreverse2がほぼ同じであるか証明リスト
reverse3(L,R) :- phrase(rev3(L),R).
rev3([]) --> [].
rev3([H|T]) --> rev3(T),[H].
:
?- listing(rev3).
stackoverflow:rev3([], A, A).
stackoverflow:rev3([D|A], B, E) :-
rev3(A, B, C),
C=[D|E].
すべてのこれらの定義は、問題を共有する:「後方」モードで使用する場合、それらは、第一の溶液の後にバックトラックに、ループ:
を
?- reverse1(R,[a,b,c]).
R = [c, b, a] ; (^C here)
Action (h for help) ? abort
% Execution Aborted
正しく、効率的なライブラリの実装を見てみましょう。
?- listing(reverse).
lists:reverse(A, B) :-
reverse(A, [], B, B).
lists:reverse([], A, A, []).
lists:reverse([B|A], C, D, [_|E]) :-
reverse(A, [B|C], D, E).
ここには違いがありません!
次に、あなたの質問については、私は、差分リストから、唯一の利点は、プロローグをより良く理解する...タイムリーな答えをすべての
おかげであると言うでしょう。 –