% -----------------------------------------------------------------------

/*
	append(L1,L2,L3) -- L1 append L2 yields L3
	in(X,L)		-- X is in list L
	diff(L1,L2,D)	-- list D is L1 minus L2
	union(L1,L2,U)	-- list U is L1 union L2
	inter(L1,L2,I)	-- list I is L1 intersection L2
	rem(X,S,R)	-- list (set) R is S with X removed.
*/

append([],L,L).
append([X|L1],L2,[X|L3])	:- append(L1,L2,L3) .

in(X,[X|_]).
in(X,[_|L])			:- in(X,L).

diff(L,[],L).
diff(L1,[X|L2],D)		:- rem(X,L1,L), diff(L,L2,D).

union([],L,L) .
union([X|L1],L2,U)		:- rem(X,L2,L), union(L1,[X|L],U) .

inter([],L,[]) .
inter([X|L1],L2,[X|I])		:- in(X,L2), !, inter(L1,L2,I).
inter([X|L1],L2,I)		:- inter(L1,L2,I).

rem(_,[],[]) .
rem(X,[X|S],R)			:- rem(X,S,R), !.
rem(X,[Y|S],[Y|R])		:- rem(X,S,R) .

subset(L1,L2)                   :- diff(L1,L2,[]).

% -----------------------------------------------------------------------

