/* SETROU : Set manipulating routines UTILITY Lawrence Updated: 11 September 81 */ %%% SETROU requires no other modules intersect([],Set,[]). intersect([HD|TL],Set,[HD|Ans]) :- member(HD,Set), !, intersect(TL,Set,Ans). intersect([HD|TL],Set,Ans) :- intersect(TL,Set,Ans). member(X,[X|TL]). member(X,[Y|TL]) :- member(X,TL). memberchk(X,[X|TL]) :- !. memberchk(X,[Y|TL]) :- memberchk(X,TL). % X is the N'th member of List nmember(X,[X|_],1). nmember(X,[_|L],N) :- nmember(X,L,M), N is M+1. seteq(S1,S2) :- subset(S1,S2), subset(S2,S1). subset([],Ys). subset([X|Xs],Ys) :- memberchk(X,Ys), subset(Xs,Ys). subtract([],Ys,[]). subtract([X|Xs],Ys,Zs) :- member(X,Ys), !, subtract(Xs,Ys,Zs). subtract([X|Xs],Ys,[X|Zs]) :- subtract(Xs,Ys,Zs). union([],Ys,Ys). union([X|Xs],Ys,Zs) :- member(X,Ys), !, union(Xs,Ys,Zs). union([X|Xs],Ys,[X|Zs]) :- union(Xs,Ys,Zs).