/* SYS$USER2:[PROLOG.PRO]SETS.DAT;1 */ /* ----------------------- */ /* some set maniputating */ /* ----------------------- */ /* member */ /* member(X,List) -> X is an element in List */ member(X,[X|Y]). member(X,[Y|Z]) :- member(X,Z). /* subset */ /* subset(X,Y) -> X is a subset of Y */ subset([A|X],Y) :- member(A,Y), subset(X,Y). subset([],Y). /* disjoint */ /* disjoint(X,Y) -> X is disjoint from Y */ disjoint(X,Y) :- not( (member(Z,X),member(Z,Y)) ). /* intersection */ /* intersection(X,Y,Z) -> Z is the intersection of X and Y */ intersection([],X,[]). intersection([X|R],Y,[X|Z]) :- member(X,Y), !, intersection(R,Y,Z). intersection([X|R],Y,Z) :- intersection(R,Y,Z). /* union */ /* union(X,Y,Z) -> Z is the union of X and Y */ union([],X,X). union([X|R],Y,Z) :- member(X,Y), !, union(R,Y,Z). union([X|R],Y,[X|Z]) :- union(R,Y,Z). /* --------- */ /* testing */ /* --------- */ ?- trace. ?- member(i,[a,e,i,o,u]). ?- member(t,[a,e,i,o,u]). ?- member(X,[a,e,i,o,u]). /* ?- subset(X,[a,b,c,d,e]). */ ?- subset([a,f],[a,b,c,d,e]). ?- subset([a,d],[a,b,c,d,e]). ?- disjoint([a,e,i],[o,u]). ?- disjoint([s,t,p],[t,x]). ?- intersection([a,e,i],[o,u],L). ?- intersection([s,u,m],[r,s,m],L). ?- union([a,e,i],[o,u],L). ?- union([x,y,z],[w,z],L).