1(* -------------------------------------------------------------------------
2   Set
3   ------------------------------------------------------------------------- *)
4
5structure Set :> Set =
6struct
7
8   fun mem (i, l) = List.exists (fn x => x = i) l
9
10   fun insert (i, l) = if mem (i, l) then l else i :: l
11
12   fun mk [] = []
13     | mk (h :: t) = if mem (h, t) then mk t else h :: mk t
14
15   fun diff (s1, s2) = List.filter (fn x => not (mem (x, s2))) s1
16   fun intersect (s1, s2) = List.filter (fn x => mem (x, s2)) s1
17   fun isSubset (s1, s2) = List.all (fn x => mem (x, s2)) s1
18
19   fun equal (s1, s2) =
20      List.length s1 = List.length s2 andalso intersect (s1, s2) = s1
21
22   fun union ([], s) = s
23     | union (s, []) = s
24     | union (h :: t, s) = union (t, insert (h, s))
25
26end (* structure Set *)
27