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

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

subset([],_).
subset([X|S1],S2) :-
	in(X,S2),
	rem(X,S2,S3),	% remove so subset can be used in reverse order
	subset(S1,S3).

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

union([],S,S) .
union([X|S1],S2,U) :-
	rem(X,S2,S),
	union(S1,[X|S],U).

diff(S,[],S).
diff(S1,[X|S2],D) :-		rem(X,S1,S),
				diff(S,S2,D).

inter([],S,[]) .
inter([X|S1],S2,[X|I]) :-	in(X,S2), !,
				inter(S1,S2,I).
inter([X|S1],S2,I) :-		inter(S1,S2,I).

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

writeln([]) :- nl.
writeln([X|L]) :- write(X), writeln(L).

findall(X) :- X, write(X), nl, fail.
findall(_).

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

test1 :- findall(subset(_,[a,b,c])).
