(* *)
fun concat xs =
let val xsRef = ref xs
val ansRef = ref []
in while (not (null (!xsRef))) do
( ansRef := !ansRef @ (hd (!xsRef))
; xsRef := tl (!xsRef)
);
!ansRef
end;
fun divides x y = y mod x = 0;
fun factors n =
let val count = ref (n-1)
val ans = ref []
in while (!count > 1) do
( if divides (!count) n
then ans := !count :: !ans
else ()
; count := !count - 1
);
!ans
end;
fun allTrue xs =
let val xsRef = ref xs
val ansRef = ref true
in while (not (null (!xsRef))) do
( ansRef := ((!ansRef) andalso (hd (!xsRef)))
; xsRef := tl (!xsRef)
);
!ansRef
end;
(* ******************************************************* *)
val filter = List.filter;
fun sort' [] ans = ans
| sort' [x] ans = x :: ans
| sort' (x::xs) ans =
let val small = filter (fn y => y <= x) xs
val big = filter (fn y => y > x) xs
in sort' small (x::(sort' big ans)) end;
fun nub [] = []
| nub [x] = [x]
| nub (x::y::xs) = if x=y then nub (x::xs) else x::(nub (y::xs));
fun norm x = nub (sort' x []);
fun equal x y = (norm x) = (norm y);
(* ********************************************** *)
datatype RE
= Empty
| Union of RE * RE
| Concat of RE * RE
| Star of RE
| C of char;
datatype Label = Epsilon | Char of char;
type Start = int;
type Finish = int;
datatype Edge = Edge of Start * Label * Finish;
val re1 = Concat(Union(C #"+",Union(C #"-",Empty))
,Concat(C #"D",Star (C #"D")));
val re2 = Concat(Union(C #"+",Union(C #"-",Empty))
,Concat(C #"D",(C #"A")));
val (n1 as (s1,f1,es1)) =
(8,15,
[Edge (9,Epsilon,10),Edge (8,Epsilon,0),Edge (8,Epsilon,6),
Edge (1,Epsilon,9),Edge (7,Epsilon,9),Edge (0,Char #"+",1),
Edge (6,Epsilon,2),Edge (6,Epsilon,4),Edge (3,Epsilon,7),
Edge (5,Epsilon,7),Edge (2,Char #"-",3),Edge (4,Epsilon,5),
Edge (11,Epsilon,14),Edge (10,Char #"D",11),Edge (14,Epsilon,12),
Edge (13,Epsilon,15),Edge (14,Epsilon,15),Edge (15,Epsilon,14),
Edge (12,Char #"D",13)]);
(*
*)