% A difference list is a term of the form L-Z, where L is a list whose last
% element is the logical variable Z.
difference_list(X - X) :- var(X).
difference_list([X|Y] - Z) :- difference_list(Y - Z).

% The following function transforms a difference list into a regular list,
% but *not* vice versa.
dl_to_list([] - X, []) :- !.
dl_to_list([X|Y] - Z, [X|W]) :- dl_to_list(Y - Z, W).

% list_to_dl transforms a difference list into a normal list,
% but not vice versa.
list_to_dl([], X - X).
list_to_dl([X|W], [X|Y] - Z) :- list_to_dl(W, Y - Z).

diffappend(X-Y, Y-Z, X-Z).
