(*
*)
(* **************** Sets as lists ****************** *)
(* represent a set of strings as an ordered list *)
(* of strings without without duplicates *)
fun mem (x:string) [] = false
| mem x (y::ys) =
if x=y then true
else mem x ys;
fun setAdd x [] = [x]
| setAdd x (y::ys) =
case String.compare (x,y) of
EQUAL => (y::ys)
| LESS => x::y::ys
| GREATER => y :: setAdd x ys;
fun setUnion [] [] = []
| setUnion [] ys = ys
| setUnion xs [] = xs
| setUnion (x::xs) (y::ys) =
case String.compare (x,y) of
EQUAL => setUnion xs (y::ys)
| LESS => x:: setUnion xs (y::ys)
| GREATER => y :: setUnion (x::xs) ys;
fun setConcat [] = []
| setConcat (x::xs) = setUnion x (setConcat xs);
(* Turn a list into a set, sort and remove duplicates. *)
fun sort [] = []
| sort (x::xs) = setAdd x (sort xs);
fun remDupFromOrdered [] = []
| remDupFromOrdered [x:string] = [x]
| remDupFromOrdered (x::y::zs) =
if x=y then remDupFromOrdered (y::zs)
else x:: remDupFromOrdered (y::zs);
fun norm xs = remDupFromOrdered(sort xs);
fun setToString xs =
let fun help [] = "]\n"
| help [x] = x ^ "]\n"
| help (x::xs) = x ^ "," ^ help xs
in "[" ^ help xs end
(* ********************************************* *)
(* cross product operator *)
fun innerWhile x [] ans = ans
| innerWhile x (y::ys) ans = innerWhile x ys ((x,y)::ans);
fun outerWhile ys [] ans = ans
| outerWhile ys (x::xs) ans = outerWhile ys xs (innerWhile x ys ans);
fun cross xs ys = outerWhile ys xs [];
(* ********************************************** *)
datatype RE
= Empty
| Union of RE * RE
| Concat of RE * RE
| Star of RE
| C of char;
(* *)