@@ -23,8 +23,29 @@ open Re
23
23
Vihje: Re.equal.
24
24
Vihje: Fixpoint. *)
25
25
26
- let rec simplify (r : t ): t =
27
- failwith " TODO"
26
+ let rec simplify_step (r : t ): t =
27
+ match r with
28
+ | Choice (r , r' ) when Re. equal r r' -> r
29
+ | Concat (r, Eps )
30
+ | Concat (Eps, r ) -> r
31
+ | Star (Star _ as r' ) -> r'
32
+ | Concat (Star r , Star r' ) when Re. equal r r' -> Star r
33
+ | Choice (Empty , r)
34
+ | Choice (r , Empty) -> r
35
+ | Concat (Empty , r)
36
+ | Concat (r , Empty) -> Empty
37
+ | Star Empty -> Eps
38
+ | Star Eps -> Eps
39
+ | Empty
40
+ | Eps
41
+ | Char _ -> r
42
+ | Choice (l , r ) -> Choice (simplify_step l, simplify_step r)
43
+ | Concat (l , r ) -> Concat (simplify_step l, simplify_step r)
44
+ | Star r -> Star (simplify_step r)
45
+
46
+ module ReFP = Fixpoint. Make (Re )
47
+
48
+ let simplify = ReFP. fp simplify_step
28
49
29
50
30
51
(* * Alt-üles lahendus.
@@ -34,5 +55,26 @@ let rec simplify (r: t): t =
34
55
35
56
Vihje: Re.equal. *)
36
57
58
+ let rec simplify'_one (r : t ): t =
59
+ match r with
60
+ | Choice (r , r' ) when Re. equal r r' -> r
61
+ | Concat (r, Eps )
62
+ | Concat (Eps, r ) -> r
63
+ | Star (Star _ as r' ) -> r'
64
+ | Concat (Star r , Star r' ) when Re. equal r r' -> Star r
65
+ | Choice (Empty , r)
66
+ | Choice (r , Empty) -> r
67
+ | Concat (Empty , r)
68
+ | Concat (r , Empty) -> Empty
69
+ | Star Empty -> Eps
70
+ | Star Eps -> Eps
71
+ | _ -> r
72
+
37
73
let rec simplify ' (r : t ): t =
38
- failwith " TODO"
74
+ match r with
75
+ | Empty
76
+ | Eps
77
+ | Char _ -> r
78
+ | Choice (l , r ) -> simplify'_one (Choice (simplify' l, simplify' r))
79
+ | Concat (l , r ) -> simplify'_one (Concat (simplify' l, simplify' r))
80
+ | Star r -> simplify'_one (Star (simplify' r))
0 commit comments