(*
Code from the 3rd lecture. *)
(* ************** References ******************* *)
val r = (ref 5) ;
!r ;
fun ! (ref n) = n;
r := 6 + 2 ;
val n = ref 4;
val w1 =
while (!n > 0)
do (print (Int.toString (!n) ^ "\n");
n := (!n) - 1 );
fun fact3 n =
let val ans = ref 1
val count = ref n
in while (!count > 0)
do (ans := !ans * !count
; count := !count - 1);
!ans
end;
(************** Accumulating functions ***** *)
fun fact4 n =
let fun loop 0 ans = ans
| loop n ans = loop (n-1) (n*ans)
in loop n 1 end;
datatype Tree = Tip | Node of Tree * int * Tree;
fun flat3 x =
let fun help Tip ans = ans
| help (Node(x,y,z)) ans =
help x (y::(help z ans))
in help x [] end;
(* ************************************************** *)
datatype RE
= Empty
| Union of RE * RE
| Concat of RE * RE
| Star of RE
| C of char;
val re1 = Concat(Union(C #"+",Union(C #"-",Empty))
,Concat(C #"D",Star (C #"D")));
datatype Label = Epsilon | Char of char;
type Start = int;
type Finish = int;
datatype Edge = Edge of Start * Label * Finish;
val next = ref 0;
fun new () = let val ref n = next
in (next := n+1; n) end;
type Nfa = (int * int * Edge list)
fun nfa Empty =
let val s = new()
val f = new()
in (s,f,[Edge(s,Epsilon,f)]):Nfa end
| nfa (C x) =
let val s = new()
val f = new()
in (s,f,[Edge(s,Char x,f)]) end
| nfa (Union(x,y)) =
let val (sx,fx,xes) = nfa x
val (sy,fy,yes) = nfa y
val s = new()
val f = new()
val newes = [Edge(s,Epsilon,sx),Edge(s,Epsilon,sy)
,Edge(fx,Epsilon,f),Edge(fy,Epsilon,f)]
in (s,f,newes @ xes @ yes) end
| nfa (Concat(x,y)) =
let val (sx,fx,xes) = nfa x
val (sy,fy,yes) = nfa y
in (sx,fy,(Edge(fx,Epsilon,sy))::(xes @ yes)) end
| nfa (Star r) =
let val (sr,fr,res) = nfa r
val s = new()
val f = new()
val newes = [Edge(s,Epsilon,sr),Edge(fr,Epsilon,f)
,Edge(s,Epsilon,f),Edge(f,Epsilon,s)]
in (s,f,newes @ res) end
val ex6 = nfa re1;
(* *)