member(X,[X|R]).
member(X,[Y|R]) :- member(X,R).
substitute(X,Y,[],[]).
substitute(X,Y,[X|S],[Y|S1]):-substitute(X,Y,S,S1).
substitute(X,Y,[Z|S],[Z|S1]):-X\==Z,substitute(X,Y,S,S1).
occurrences([],[]).
occurrencesfirst([X],[s(0)]).
occurrencesfirst([X|S],[0|S1]):-not(member(X,S)).
occurrencesfirst([X|S],[s(Y)|S1]):-removeone(X,S,Z),occurrencesfirst([X|Z],[Y|S1]).
occurrences([X|S],[s(Y)|S1]):-occurrencesfirst([X|S],[Y|S1]),occurrences(S,S1).
subset([X|R],S) :- member(X,S), subset(R,S).
subset([],_).
equal(S1,S2):-subset(S1,S2),subset(S2,S1).
is_set([]).
is_set([X|S]):-not(member(X,S)),is_set(S).
union([X|Y],Z,W) :- member(X,Z), !,union(Y,Z,W).
union([X|Y],Z,[X|W]) :- union(Y,Z,W).
union([],Z,Z).
intersection([X|Y],M,[X|Z]) :- member(X,M),!, intersection(Y,M,Z).
intersection([X|Y],M,Z) :- intersection(Y,M,Z).
intersection([],M,[]).
rank([X],s(0),X).
rank([X,Y|S],Z,X):-rank([Y,X|S],Z,X).
rank([X|S],Z1,Y):- X > Y,member(Y,S),rank(S,Z,Y),Z1 is Z + s(0).
rank([X|S],Z,Y):- X < Y,member(Y,S),rank(S,Z,Y).
removeone(X,[X|Rest],Rest):- !.
removeone(X,[Y|Rest],[Y|L]):- removeone(X,Rest,L).
removeone(_,[],[]).