list a ::= Nil | Cons a (list a) ; ;; if c t f = case c of True -> t; False -> f end; utSetEmpty = Nil; utSetIsEmpty s = case s of Nil -> True; Cons x xs -> False end; utSetSingleton x = Cons x Nil; utSetFromList l = letrec rmdup = \rl -> case rl of Nil -> Nil; Cons x xs -> case xs of Nil -> Cons x Nil; Cons y ys -> case x==y of True -> Cons x (rmdup ys); False -> Cons x (Cons y (rmdup ys)) end end end; sort = \sl -> letrec insert = \a l -> case l of Nil -> Cons a Nil; Cons bb xx -> case a <= bb of True -> Cons a (Cons bb xx); False -> Cons bb (insert a xx) end end in case sl of Nil -> Nil; Cons a x -> insert a (sort x) end in rmdup (sort l); utSetToList xs = xs; utSetUnion seta setb = case seta of Nil -> Nil; Cons a as -> case setb of Nil -> Nil; Cons b bs -> case a < b of True -> Cons a (utSetUnion as setb); False -> case a == b of True-> Cons a (utSetUnion as bs); False -> Cons b (utSetUnion seta bs) end end end end;