/* 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).

