与えられた例では、reverse1
は真の差分リストを使用していませんが、 の異なる表現ですreverse2
。どちらも同じ変数を同じ方法で使用します。reverse
ファンクターを使用して-
それらをアタッチし、reverse2
それらを個別のパラメーターとして維持します。しかし、両者の違いはそれだけです。アルゴリズムの動作は同じです。
実際の違いリストは、インスタンス化されず (おそらく後の時点まで) のようX-T
に、その中に「穴」があるリスト構造であり、含まれています(たとえば、)。このファンクターは、「公開された」インスタンス化されていない変数を、それを含む構造体に関連付けます。T
X
T
[a,b,c|T]-T
-
人気のある簡単な例は、append
差分リストを使用した実装です。の従来の再帰的な実装は次のappend
ようになります。
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
十分に単純で、実行時間は最初のリストの長さに比例します。
append
差分リストを使用すると、次のように を実装できます。
append(A-B, B-C, A-C).
差分リストを使用してリストを追加するために必要なのはこれだけです。再帰などはありません。実行時間はO(1)
、リストの長さとは無関係です。実行例を次に示します。
append([1,2,3|T]-T, [4,5,6|W]-W, DL).
収量:
DL = [1,2,3,4,5,6|W]-W
T = [4,5,6|W]
最後のパラメーターの空のリストで穴を「埋める」ことで、具体的な答えにたどり着くことができます。
append([1,2,3|T]-T, [4,5,6|W]-W, L-[]).
あなたは得る:
L = [1,2,3,4,5,6]
T = [4,5,6]
W = []