В приведенном примере 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 = []
Спасибо всем за своевременные ответы. –