In dem angegebenen Beispiel verwendet reverse1
keine echte Differenzliste, sondern nur eine andere Darstellung von reverse2
. Sie verwenden beide dieselben Variablen auf die gleiche Weise. reverse
verwendet einen -
Funktor, um sie anzuhängen, und reverse2
verwaltet sie als separate Parameter. Aber das ist alles zwischen den beiden. Die Verhaltensweisen des Algorithmus sind gleich.
eine echte Unterschied Liste ist eine Listenstruktur mit einem „Loch“ in der es, wie X-T
in denen T
nicht instanziiert wird (bis zu einem späteren Zeitpunkt vielleicht) und X
enthält T
(z.B., [a,b,c|T]-T
). Der Funktor -
verknüpft die "exponierte" nicht instantiierte Variable mit der Struktur, die sie enthält.
Ein beliebtes und einfaches Beispiel ist eine Implementierung von append
unter Verwendung von Differenzlisten. Eine traditionelle, rekursive Implementierung von append
könnte wie folgt aussehen:
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
Einfach genug, und die Ausführungszeit ist auf die Länge der ersten Liste proportional.
append(A-B, B-C, A-C).
Das alles, was Sie Listen, Listen mit Unterschied anhängen müssen ist:
Differenzlisten verwenden, können Sie eine append
wie folgt implementieren. Keine Rekursion oder irgendetwas anderes. Ausführungszeit ist O(1)
unabhängig von der Länge der Liste. Hier ist ein Beispiel der Ausführung:
append([1,2,3|T]-T, [4,5,6|W]-W, DL).
Ausbeuten:
DL = [1,2,3,4,5,6|W]-W
T = [4,5,6|W]
Sie auf die konkrete Antwort bekommen kann durch das Loch mit einer leeren Liste im letzten Parameter "Füllung":
append([1,2,3|T]-T, [4,5,6|W]-W, L-[]).
Sie erhalten:
L = [1,2,3,4,5,6]
T = [4,5,6]
W = []
Vielen Dank an alle für die rechtzeitigen Antworten. –