/* ----------------------- */ /* Operatii cu multimi */ /* ----------------------- */ /* member */ /* member(X,List) -> X este membru in List */ member(X,[X|Y]). member(X,[Y|Z]) :- member(X,Z). /* subset */ /* subset(X,Y) -> X este o submultime a lui Y */ subset([A|X],Y) :- member(A,Y), subset(X,Y). subset([],Y). /* disjoint */ /* disjoint(X,Y) -> X este disjuncta fata de Y */ disjoint(X,Y) :- not( (member(Z,X),member(Z,Y)) ). /* intersection */ /* intersection(X,Y,Z) -> Z este intersectia lui X cu 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 este reuniunea lui X si 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). /* --------- */ /* Teste */ /* --------- */ ?- 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).