let set_member eq x s = List.exists (fun y -> eq x y) s let rec set_diff eq s1 s2 = match s1 with [] -> [] | x::rest -> if (set_member eq x s2) then set_diff eq rest s2 else x::(set_diff eq rest s2) module type Eq = sig type t val eq : t -> t -> bool end module Set = functor (Elt: Eq) -> struct type element = Elt.t type set = element list let empty = [] let member x s = List.exists (fun y -> Elt.eq x y) s let add x s = if (member x s) then s else x::s let rec union s1 s2 = match s1 with [] -> s2 | x::rest -> if (member x s2) then union rest s2 else x::(union rest s2) let rec inter s1 s2 = match s1 with [] -> [] | x::rest -> if (member x s2) then x::(inter rest s2) else inter rest s2 let rec subset s1 s2 = match s1 with [] -> true | x::rest -> member x s2 && subset rest s2 let rec diff s1 s2 = match s1 with [] -> [] | x::rest -> if (member x s2) then diff rest s2 else x::(diff rest s2) let rec uniquify s = match s with [] -> [] | x::rest -> if (member x rest) then rest else x::(uniquify rest) end