fun inside(k,l)= if l=nil then false else if k=hd(l) then true else inside(k,tl(l)); fun union(l1,l2)= if l1=nil then l2 else if inside(hd(l1),l2)=false then hd(l1)::union(tl(l1),l2) else union(tl(l1),l2); fun intersection(l1,l2)= if l1=nil then nil else if inside(hd(l1),l2)=true then hd(l1)::intersection(tl(l1),l2) else intersection(tl(l1),l2); fun cart(l1,l2)= let fun nxs(k,l)= if l=nil then nil else [k,hd(l)]::nxs(k,tl(l)) in if l1= nil then nil else nxs(hd(l1),l2)@cart(tl(l1),l2) end; fun subtract(a,b)= let fun rem1ele(l1,k)= if l1=nil then nil else if hd(l1)=k then tl(l1) else hd(l1)::rem1ele(tl(l1),k) in if b=nil then a else subtract(rem1ele(a,hd(b)),tl(b)) end; fun add(a,b)=if b=nil then a else if inside(hd(b),a)=false then add(hd(b)::a,tl(b)) else add(a,tl(b)); fun equalto(a,b)= let fun rem1ele(l1,k)= if l1 = nil then nil else if hd(l1)=k then tl(l1) else hd(l1)::rem1ele(tl(l1),k) in if (a=nil) andalso (b=nil) then true else if (a=nil) orelse (b=nil) then false else if inside(hd(a),b)=false then false else equalto(tl(a),rem1ele(b,hd(a))) end; fun disjoint(a,b)= if intersection(a,b)=nil then true else false; fun symdiff(a,b)=subtract(union(a,b),intersection(a,b)); fun subset(a,b)= if a=nil then true else if b=nil then false else if inside(hd(a),b)=true then subset(tl(a),b) else false; fun card(a)=if a=nil then 0 else 1+card(tl(a)); fun max(a)= let fun max_iter(a,v)= if a=nil then v else if vhd(a) then min_iter(tl(a),hd(a)) else min_iter(tl(a),v) in min_iter(a,99999999) end; fun P(L)= let fun rem1ele(l1,k)= if l1 = nil then nil else if hd(l1)=k then tl(l1) else hd(l1)::rem1ele(tl(l1),k) fun P1(A,B,x)= hd(B)::P(rem1ele(A,hd(B)))@P(x::tl(A)); in if L=nil then nil else P1(L,L,hd(L)) end;