annotate regex.agda @ 12:c3fa431262fa

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 16 Nov 2020 13:11:26 +0900
parents
children 6f1fb2fa9a31
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 {-# OPTIONS --allow-unsolved-metas #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 module regex where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 open import Level renaming ( suc to Suc ; zero to Zero )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 open import Data.List hiding ( any ; [_] ; concat )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 open import Relation.Binary.PropositionalEquality hiding ( [_] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Relation.Nullary using (¬_; Dec; yes; no)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 open import Data.Empty
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 open import Data.Unit
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 open import Data.Maybe
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 open import logic
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 data Regex ( Σ : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 _* : Regex Σ → Regex Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 _&_ : Regex Σ → Regex Σ → Regex Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 _||_ : Regex Σ → Regex Σ → Regex Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 <_> : Σ → Regex Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 -- postulate a b c d : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 data char : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 a : char
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 b : char
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 c : char
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 d : char
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 infixr 40 _&_ _||_
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 r1' = (< a > & < b >) & < c >
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 r1 = < a > & < b > & < c >
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 any = < a > || < b > || < c > || < d >
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 r2 = ( any * ) & ( < a > & < b > & < c > )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 r3 = ( any * ) & ( < a > & < b > & < c > & < a > & < b > & < c > )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 r4 = ( < a > & < b > & < c > ) || ( < b > & < c > & < d > )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 r5 = ( any * ) & ( < a > & < b > & < c > || < b > & < c > & < d > )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 data regular-expr {Σ : Set} : Regex Σ → List Σ → Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 atom : (x : Σ ) → regular-expr < x > ( x ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 concat : {x y : Regex Σ} {t s : List Σ} → regular-expr x t → regular-expr y s → regular-expr (x & y) (t ++ s )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 select : {x y : Regex Σ} {t : List Σ} → regular-expr x t ∨ regular-expr y t → regular-expr (x || y) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 star-nil : {x : Regex Σ} → regular-expr (x *) []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 star : {x : Regex Σ} → {lx next : List Σ} → regular-expr x lx → regular-expr (x *) next → regular-expr (x *) next
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 test-regex : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 test-regex = ¬ (regular-expr r1 ( a ∷ [] ) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 test-regex1 : regular-expr r1 ( a ∷ b ∷ c ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 test-regex1 = concat (atom a) (concat (atom b) (atom c))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 open import regular-language
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 -- match : {Σ : Set} → (r : Regex Σ ) → Automaton (Regex Σ) Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 -- open import Data.Nat.DivMod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 -- test-regex-even : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 -- test-regex-even = (s : List char ) → regular-expr ( ( any & any ) * ) s → (length s) mod 2 ≡ zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 empty? : {Σ : Set} → Regex Σ → Maybe (Regex Σ)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 empty? (r *) = just (r *)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 empty? (r & s) with empty? r
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 ... | nothing = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 ... | just _ = empty? s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 empty? (r || s) with empty? r | empty? s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 ... | nothing | nothing = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 ... | just r1 | _ = just r1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 ... | _ | just s1 = just s1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 empty? < x > = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 derivative : {Σ : Set} → Regex Σ → Σ → ((i j : Σ ) → Dec ( i ≡ j )) → Maybe (Maybe (Regex Σ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 derivative (r *) x dec with derivative r x dec
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 ... | just (just r1) = just (just (r1 & (r *)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 ... | just (nothing) = just (just (r *))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 ... | nothing = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 derivative (r & s) x dec with derivative r x dec | derivative s x dec | empty? r
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 ... | nothing | _ | _ = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 ... | just nothing | nothing | _ = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 ... | just nothing | just nothing | _ = just nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 ... | just nothing | just (just s1) | _ = just (just s1)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 ... | just (just r1) | just (just s1) | nothing = just (just (r1 & s))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 ... | just (just r1) | just (just s1) | just _ = just (just (s1 || (r1 & s)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 ... | just (just r1) | _ | _ = just (just (r1 & s))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 derivative (r || s) x dec with derivative r x dec | derivative s x dec
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 ... | just (just r1) | just (just s1) = just (just ( r1 || s1 ) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 ... | just nothing | _ = just nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 ... | _ | just nothing = just nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 ... | just (just r1) | _ = just (just r1)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 ... | _ | just (just s1) = just (just s1)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 ... | nothing | nothing = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 derivative < i > x dec with dec i x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 ... | yes y = just nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 ... | no _ = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 open import automaton
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 regex→automaton : {Σ : Set} → Regex Σ → ((i j : Σ ) → Dec ( i ≡ j )) → Automaton (Maybe (Maybe (Regex Σ))) Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 regex→automaton {Σ} r dec = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 δ = δ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 ; F = F
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 δ : Maybe (Maybe (Regex Σ)) → Σ → Maybe (Maybe (Regex Σ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 δ nothing i = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 δ (just nothing) i = nothing
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 δ (just (just r)) i = derivative r i dec
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 F : Maybe (Maybe (Regex Σ)) → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 F (just (just (r *))) = ⊤
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 F (just nothing) = ⊤
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 F _ = ⊥
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 char-dec : (i j : char) → Dec (i ≡ j)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 char-dec a a = yes refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 char-dec b b = yes refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 char-dec c c = yes refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 char-dec d d = yes refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 char-dec a b = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 char-dec a c = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 char-dec a d = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 char-dec b a = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 char-dec b c = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 char-dec b d = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 char-dec c a = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 char-dec c b = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 char-dec c d = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 char-dec d a = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 char-dec d b = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 char-dec d c = no (λ ())
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 char-list : List char
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 char-list = a ∷ b ∷ c ∷ d ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 a2 = accept (regex→automaton r2 char-dec ) (just (just r2)) ( a ∷ a ∷ b ∷ c ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 tr2 = trace (regex→automaton r2 char-dec ) (just (just r2)) char-list
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 a1 : accept (regex→automaton < a > char-dec ) (just (just < a > )) ( a ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 a1 = tt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 tr1 = trace (regex→automaton < a > char-dec ) (just (just < a > )) ( a ∷ [] ) a1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 a3 = accept (regex→automaton < a > char-dec ) (just (just (< a > & < b > ))) ( a ∷ b ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141 t3 = trace (regex→automaton < a > char-dec ) (just (just (< a > & < b > ))) ( a ∷ b ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150