65
|
1 module regular-language where
|
|
2
|
|
3 open import Level renaming ( suc to Suc ; zero to Zero )
|
|
4 open import Data.List
|
|
5 open import Data.Nat hiding ( _≟_ )
|
70
|
6 open import Data.Fin hiding ( _+_ )
|
72
|
7 open import Data.Empty
|
65
|
8 open import Data.Product
|
|
9 -- open import Data.Maybe
|
|
10 open import Relation.Nullary
|
|
11 open import Relation.Binary.PropositionalEquality hiding ( [_] )
|
|
12 open import logic
|
70
|
13 open import nat
|
65
|
14 open import automaton
|
|
15 open import finiteSet
|
|
16
|
|
17 language : { Σ : Set } → Set
|
|
18 language {Σ} = List Σ → Bool
|
|
19
|
|
20 language-L : { Σ : Set } → Set
|
|
21 language-L {Σ} = List (List Σ)
|
|
22
|
|
23 open Automaton
|
|
24
|
|
25 record RegularLanguage ( Σ : Set ) : Set (Suc Zero) where
|
|
26 field
|
|
27 states : Set
|
|
28 astart : states
|
70
|
29 aℕ : ℕ
|
|
30 afin : FiniteSet states {aℕ}
|
65
|
31 automaton : Automaton states Σ
|
|
32 contain : List Σ → Bool
|
|
33 contain x = accept automaton astart x
|
|
34
|
|
35 Union : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
|
|
36 Union {Σ} A B x = (A x ) \/ (B x)
|
|
37
|
|
38 split : {Σ : Set} → (List Σ → Bool)
|
|
39 → ( List Σ → Bool) → List Σ → Bool
|
|
40 split x y [] = x [] /\ y []
|
|
41 split x y (h ∷ t) = (x [] /\ y (h ∷ t)) \/
|
|
42 split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t
|
|
43
|
|
44 Concat : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
|
|
45 Concat {Σ} A B = split A B
|
|
46
|
|
47 {-# TERMINATING #-}
|
|
48 Star : {Σ : Set} → ( A : language {Σ} ) → language {Σ}
|
|
49 Star {Σ} A = split A ( Star {Σ} A )
|
|
50
|
87
|
51 test-AB→split : {Σ : Set} → {A B : List In2 → Bool} → split A B ( i0 ∷ i1 ∷ i0 ∷ [] ) ≡ (
|
69
|
52 ( A [] /\ B ( i0 ∷ i1 ∷ i0 ∷ [] ) ) \/
|
|
53 ( A ( i0 ∷ [] ) /\ B ( i1 ∷ i0 ∷ [] ) ) \/
|
|
54 ( A ( i0 ∷ i1 ∷ [] ) /\ B ( i0 ∷ [] ) ) \/
|
|
55 ( A ( i0 ∷ i1 ∷ i0 ∷ [] ) /\ B [] )
|
|
56 )
|
87
|
57 test-AB→split {_} {A} {B} = refl
|
69
|
58
|
65
|
59 open RegularLanguage
|
|
60 isRegular : {Σ : Set} → (A : language {Σ} ) → ( x : List Σ ) → (r : RegularLanguage Σ ) → Set
|
|
61 isRegular A x r = A x ≡ contain r x
|
|
62
|
73
|
63 postulate
|
|
64 fin-× : {A B : Set} → { a b : ℕ } → FiniteSet A {a} → FiniteSet B {b} → FiniteSet (A × B) {a * b}
|
|
65
|
65
|
66 M-Union : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
|
|
67 M-Union {Σ} A B = record {
|
|
68 states = states A × states B
|
|
69 ; astart = ( astart A , astart B )
|
73
|
70 ; aℕ = aℕ A * aℕ B
|
|
71 ; afin = fin-× (afin A) (afin B)
|
65
|
72 ; automaton = record {
|
|
73 δ = λ q x → ( δ (automaton A) (proj₁ q) x , δ (automaton B) (proj₂ q) x )
|
|
74 ; aend = λ q → ( aend (automaton A) (proj₁ q) \/ aend (automaton B) (proj₂ q) )
|
|
75 }
|
|
76 }
|
|
77
|
|
78 closed-in-union : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Union (contain A) (contain B)) x ( M-Union A B )
|
|
79 closed-in-union A B [] = lemma where
|
|
80 lemma : aend (automaton A) (astart A) \/ aend (automaton B) (astart B) ≡
|
|
81 aend (automaton A) (astart A) \/ aend (automaton B) (astart B)
|
|
82 lemma = refl
|
|
83 closed-in-union {Σ} A B ( h ∷ t ) = lemma1 t ((δ (automaton A) (astart A) h)) ((δ (automaton B) (astart B) h)) where
|
|
84 lemma1 : (t : List Σ) → (qa : states A ) → (qb : states B ) →
|
|
85 accept (automaton A) qa t \/ accept (automaton B) qb t
|
|
86 ≡ accept (automaton (M-Union A B)) (qa , qb) t
|
|
87 lemma1 [] qa qb = refl
|
|
88 lemma1 (h ∷ t ) qa qb = lemma1 t ((δ (automaton A) qa h)) ((δ (automaton B) qb h))
|
|
89
|
|
90 -- M-Concat : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
|
|
91 -- M-Concat {Σ} A B = record {
|
|
92 -- states = states A ∨ states B
|
|
93 -- ; astart = case1 (astart A )
|
|
94 -- ; automaton = record {
|
|
95 -- δ = {!!}
|
|
96 -- ; aend = {!!}
|
|
97 -- }
|
|
98 -- }
|
|
99 --
|
|
100 -- closed-in-concat : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Concat (contain A) (contain B)) x ( M-Concat A B )
|
|
101 -- closed-in-concat = {!!}
|
70
|
102
|
|
103 open import nfa
|
|
104 open import sbconst2
|
|
105 open FiniteSet
|
86
|
106 open import Data.Nat.Properties hiding ( _≟_ )
|
70
|
107 open import Relation.Binary as B hiding (Decidable)
|
|
108
|
73
|
109 postulate
|
|
110 fin-∨ : {A B : Set} → { a b : ℕ } → FiniteSet A {a} → FiniteSet B {b} → FiniteSet (A ∨ B) {a + b}
|
|
111 fin→ : {A : Set} → { a : ℕ } → FiniteSet A {a} → FiniteSet (A → Bool ) {exp 2 a}
|
70
|
112
|
|
113 Concat-NFA : {Σ : Set} → (A B : RegularLanguage Σ ) → NAutomaton (states A ∨ states B) Σ
|
86
|
114 Concat-NFA {Σ} A B = record { Nδ = δnfa ; Nend = nend }
|
|
115 module Concat-NFA where
|
70
|
116 δnfa : states A ∨ states B → Σ → states A ∨ states B → Bool
|
|
117 δnfa (case1 q) i (case1 q₁) = equal? (afin A) (δ (automaton A) q i) q₁
|
88
|
118 δnfa (case1 qa) i (case2 qb) = (aend (automaton A) qa ) /\
|
|
119 (equal? (afin B) qb (δ (automaton B) (astart B) i) )
|
70
|
120 δnfa (case2 q) i (case2 q₁) = equal? (afin B) (δ (automaton B) q i) q₁
|
|
121 δnfa _ i _ = false
|
|
122 nend : states A ∨ states B → Bool
|
|
123 nend (case2 q) = aend (automaton B) q
|
88
|
124 nend (case1 q) = aend (automaton A) q /\ aend (automaton B) (astart B) -- empty B case
|
70
|
125
|
|
126 Concat-NFA-start : {Σ : Set} → (A B : RegularLanguage Σ ) → states A ∨ states B → Bool
|
75
|
127 Concat-NFA-start A B q = equal? (fin-∨ (afin A) (afin B)) (case1 (astart A)) q
|
70
|
128
|
|
129 M-Concat : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
|
|
130 M-Concat {Σ} A B = record {
|
|
131 states = states A ∨ states B → Bool
|
|
132 ; astart = Concat-NFA-start A B
|
|
133 ; aℕ = finℕ finf
|
|
134 ; afin = finf
|
|
135 ; automaton = subset-construction fin (Concat-NFA A B) (case1 (astart A))
|
|
136 } where
|
|
137 fin : FiniteSet (states A ∨ states B ) {aℕ A + aℕ B}
|
|
138 fin = fin-∨ (afin A) (afin B)
|
|
139 finf : FiniteSet (states A ∨ states B → Bool )
|
|
140 finf = fin→ fin
|
|
141
|
72
|
142 record Split {Σ : Set} (A : List Σ → Bool ) ( B : List Σ → Bool ) (x : List Σ ) : Set where
|
|
143 field
|
|
144 sp0 : List Σ
|
|
145 sp1 : List Σ
|
|
146 sp-concat : sp0 ++ sp1 ≡ x
|
|
147 prop0 : A sp0 ≡ true
|
|
148 prop1 : B sp1 ≡ true
|
|
149
|
|
150 open Split
|
|
151
|
|
152 list-empty++ : {Σ : Set} → (x y : List Σ) → x ++ y ≡ [] → (x ≡ [] ) ∧ (y ≡ [] )
|
|
153 list-empty++ [] [] refl = record { proj1 = refl ; proj2 = refl }
|
|
154 list-empty++ [] (x ∷ y) ()
|
|
155 list-empty++ (x ∷ x₁) y ()
|
|
156
|
|
157 open _∧_
|
|
158
|
74
|
159 open import Relation.Binary.PropositionalEquality hiding ( [_] )
|
71
|
160
|
74
|
161 c-split-lemma : {Σ : Set} → (A B : List Σ → Bool ) → (h : Σ) → ( t : List Σ ) → split A B (h ∷ t ) ≡ true
|
|
162 → ( ¬ (A [] ≡ true )) ∨ ( ¬ (B ( h ∷ t ) ≡ true) )
|
|
163 → split (λ t1 → A (h ∷ t1)) B t ≡ true
|
|
164 c-split-lemma {Σ} A B h t eq (case1 ¬p ) = sym ( begin
|
|
165 true
|
|
166 ≡⟨ sym eq ⟩
|
|
167 split A B (h ∷ t )
|
|
168 ≡⟨⟩
|
|
169 A [] /\ B (h ∷ t) \/ split (λ t1 → A (h ∷ t1)) B t
|
|
170 ≡⟨ cong ( λ k → k \/ split (λ t1 → A (h ∷ t1)) B t ) (bool-and-1 (¬-bool-t ¬p)) ⟩
|
|
171 false \/ split (λ t1 → A (h ∷ t1)) B t
|
|
172 ≡⟨ bool-or-1 refl ⟩
|
|
173 split (λ t1 → A (h ∷ t1)) B t
|
|
174 ∎ ) where open ≡-Reasoning
|
|
175 c-split-lemma {Σ} A B h t eq (case2 ¬p ) = sym ( begin
|
|
176 true
|
|
177 ≡⟨ sym eq ⟩
|
|
178 split A B (h ∷ t )
|
|
179 ≡⟨⟩
|
|
180 A [] /\ B (h ∷ t) \/ split (λ t1 → A (h ∷ t1)) B t
|
|
181 ≡⟨ cong ( λ k → k \/ split (λ t1 → A (h ∷ t1)) B t ) (bool-and-2 (¬-bool-t ¬p)) ⟩
|
|
182 false \/ split (λ t1 → A (h ∷ t1)) B t
|
|
183 ≡⟨ bool-or-1 refl ⟩
|
|
184 split (λ t1 → A (h ∷ t1)) B t
|
|
185 ∎ ) where open ≡-Reasoning
|
|
186
|
87
|
187 split→AB : {Σ : Set} → (A B : List Σ → Bool ) → ( x : List Σ ) → split A B x ≡ true → Split A B x
|
|
188 split→AB {Σ} A B [] eq with bool-≡-? (A []) true | bool-≡-? (B []) true
|
|
189 split→AB {Σ} A B [] eq | yes eqa | yes eqb =
|
73
|
190 record { sp0 = [] ; sp1 = [] ; sp-concat = refl ; prop0 = eqa ; prop1 = eqb }
|
87
|
191 split→AB {Σ} A B [] eq | yes p | no ¬p = ⊥-elim (lemma-∧-1 eq (¬-bool-t ¬p ))
|
|
192 split→AB {Σ} A B [] eq | no ¬p | t = ⊥-elim (lemma-∧-0 eq (¬-bool-t ¬p ))
|
|
193 split→AB {Σ} A B (h ∷ t ) eq with bool-≡-? (A []) true | bool-≡-? (B (h ∷ t )) true
|
74
|
194 ... | yes px | yes py = record { sp0 = [] ; sp1 = h ∷ t ; sp-concat = refl ; prop0 = px ; prop1 = py }
|
87
|
195 ... | no px | _ with split→AB (λ t1 → A ( h ∷ t1 )) B t (c-split-lemma A B h t eq (case1 px) )
|
74
|
196 ... | S = record { sp0 = h ∷ sp0 S ; sp1 = sp1 S ; sp-concat = cong ( λ k → h ∷ k) (sp-concat S) ; prop0 = prop0 S ; prop1 = prop1 S }
|
87
|
197 split→AB {Σ} A B (h ∷ t ) eq | _ | no px with split→AB (λ t1 → A ( h ∷ t1 )) B t (c-split-lemma A B h t eq (case2 px) )
|
74
|
198 ... | S = record { sp0 = h ∷ sp0 S ; sp1 = sp1 S ; sp-concat = cong ( λ k → h ∷ k) (sp-concat S) ; prop0 = prop0 S ; prop1 = prop1 S }
|
|
199
|
87
|
200 AB→split : {Σ : Set} → (A B : List Σ → Bool ) → ( x y : List Σ ) → A x ≡ true → B y ≡ true → split A B (x ++ y ) ≡ true
|
|
201 AB→split {Σ} A B [] [] eqa eqb = begin
|
74
|
202 split A B []
|
|
203 ≡⟨⟩
|
|
204 A [] /\ B []
|
|
205 ≡⟨ cong₂ (λ j k → j /\ k ) eqa eqb ⟩
|
|
206 true
|
|
207 ∎ where open ≡-Reasoning
|
87
|
208 AB→split {Σ} A B [] (h ∷ y ) eqa eqb = begin
|
74
|
209 split A B (h ∷ y )
|
|
210 ≡⟨⟩
|
|
211 A [] /\ B (h ∷ y) \/ split (λ t1 → A (h ∷ t1)) B y
|
|
212 ≡⟨ cong₂ (λ j k → j /\ k \/ split (λ t1 → A (h ∷ t1)) B y ) eqa eqb ⟩
|
|
213 true /\ true \/ split (λ t1 → A (h ∷ t1)) B y
|
|
214 ≡⟨⟩
|
|
215 true \/ split (λ t1 → A (h ∷ t1)) B y
|
|
216 ≡⟨⟩
|
|
217 true
|
|
218 ∎ where open ≡-Reasoning
|
87
|
219 AB→split {Σ} A B (h ∷ t) y eqa eqb = begin
|
74
|
220 split A B ((h ∷ t) ++ y)
|
|
221 ≡⟨⟩
|
|
222 A [] /\ B (h ∷ t ++ y) \/ split (λ t1 → A (h ∷ t1)) B (t ++ y)
|
|
223 ≡⟨ cong ( λ k → A [] /\ B (h ∷ t ++ y) \/ k ) ( begin
|
|
224 split (λ t1 → A (h ∷ t1)) B (t ++ y)
|
87
|
225 ≡⟨ AB→split {Σ} (λ t1 → A (h ∷ t1)) B t y eqa eqb ⟩
|
74
|
226 true
|
|
227 ∎ ) ⟩
|
|
228 A [] /\ B (h ∷ t ++ y) \/ true
|
|
229 ≡⟨ bool-or-3 ⟩
|
|
230 true
|
|
231 ∎ where open ≡-Reasoning
|
|
232
|
86
|
233 -- postulate f-extensionality : { n : Level} → Relation.Binary.PropositionalEquality.Extensionality n n -- (Level.suc n) already in finiteSet
|
75
|
234
|
|
235 open NAutomaton
|
89
|
236 open import Data.List.Properties
|
70
|
237
|
71
|
238 closed-in-concat : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Concat (contain A) (contain B)) x ( M-Concat A B )
|
87
|
239 closed-in-concat {Σ} A B x = ≡-Bool-func closed-in-concat→ closed-in-concat← where
|
|
240 finab = (fin-∨ (afin A) (afin B))
|
76
|
241 NFA = (Concat-NFA A B)
|
|
242 abmove : (q : states A ∨ states B) → (h : Σ ) → states A ∨ states B
|
|
243 abmove (case1 q) h = case1 (δ (automaton A) q h)
|
|
244 abmove (case2 q) h = case2 (δ (automaton B) q h)
|
88
|
245 lemma-nmove-ab : (q : states A ∨ states B) → (h : Σ ) → Nδ NFA q h (abmove q h) ≡ true
|
|
246 lemma-nmove-ab (case1 q) _ = equal?-refl (afin A)
|
|
247 lemma-nmove-ab (case2 q) _ = equal?-refl (afin B)
|
76
|
248 nmove : (q : states A ∨ states B) (nq : states A ∨ states B → Bool ) → (nq q ≡ true) → ( h : Σ ) →
|
87
|
249 exists finab (λ qn → nq qn /\ Nδ NFA qn h (abmove q h)) ≡ true
|
88
|
250 nmove (case1 q) nq nqt h = found finab (case1 q) ( bool-and-tt nqt (lemma-nmove-ab (case1 q) h) )
|
|
251 nmove (case2 q) nq nqt h = found finab (case2 q) ( bool-and-tt nqt (lemma-nmove-ab (case2 q) h) ) where
|
|
252 acceptB : (z : List Σ) → (q : states B) → (nq : states A ∨ states B → Bool ) → (nq (case2 q) ≡ true) → ( accept (automaton B) q z ≡ true )
|
87
|
253 → Naccept NFA finab nq z ≡ true
|
88
|
254 acceptB [] q nq nqt fb = lemma8 where
|
87
|
255 lemma8 : exists finab ( λ q → nq q /\ Nend NFA q ) ≡ true
|
88
|
256 lemma8 = found finab (case2 q) ( bool-and-tt nqt fb )
|
|
257 acceptB (h ∷ t ) q nq nq=q fb = acceptB t (δ (automaton B) q h) (Nmoves NFA finab nq h) (nmove (case2 q) nq nq=q h) fb
|
|
258 acceptA : (y z : List Σ) → (q : states A) → (nq : states A ∨ states B → Bool ) → (nq (case1 q) ≡ true)
|
75
|
259 → ( accept (automaton A) q y ≡ true ) → ( accept (automaton B) (astart B) z ≡ true )
|
87
|
260 → Naccept NFA finab nq (y ++ z) ≡ true
|
88
|
261 acceptA [] [] q nq nqt fa fb = found finab (case1 q) (bool-and-tt nqt (bool-and-tt fa fb ))
|
|
262 acceptA [] (h ∷ z) q nq nq=q fa fb = acceptB z nextb (Nmoves NFA finab nq h) lemma70 fb where
|
87
|
263 nextb : states B
|
|
264 nextb = δ (automaton B) (astart B) h
|
|
265 lemma70 : exists finab (λ qn → nq qn /\ Nδ NFA qn h (case2 nextb)) ≡ true
|
88
|
266 lemma70 = found finab (case1 q) ( bool-and-tt nq=q (bool-and-tt fa (lemma-nmove-ab (case2 (astart B)) h) ))
|
|
267 acceptA (h ∷ t) z q nq nq=q fa fb = acceptA t z (δ (automaton A) q h) (Nmoves NFA finab nq h) (nmove (case1 q) nq nq=q h) fa fb where
|
|
268 acceptAB : Split (contain A) (contain B) x
|
87
|
269 → Naccept NFA finab (equal? finab (case1 (astart A))) x ≡ true
|
88
|
270 acceptAB S = subst ( λ k → Naccept NFA finab (equal? finab (case1 (astart A))) k ≡ true ) ( sp-concat S )
|
|
271 (acceptA (sp0 S) (sp1 S) (astart A) (equal? finab (case1 (astart A))) (equal?-refl finab) (prop0 S) (prop1 S) )
|
87
|
272
|
|
273 closed-in-concat→ : Concat (contain A) (contain B) x ≡ true → contain (M-Concat A B) x ≡ true
|
|
274 closed-in-concat→ concat with split→AB (contain A) (contain B) x concat
|
75
|
275 ... | S = begin
|
87
|
276 accept (subset-construction finab NFA (case1 (astart A))) (Concat-NFA-start A B ) x
|
|
277 ≡⟨ ≡-Bool-func (subset-construction-lemma← finab NFA (case1 (astart A)) x )
|
|
278 (subset-construction-lemma→ finab NFA (case1 (astart A)) x ) ⟩
|
|
279 Naccept NFA finab (equal? finab (case1 (astart A))) x
|
88
|
280 ≡⟨ acceptAB S ⟩
|
75
|
281 true
|
|
282 ∎ where open ≡-Reasoning
|
87
|
283
|
90
|
284 data Next-nq : Set where
|
|
285 case-A : { x : List Σ} → ( nq : states A ∨ states B → Bool ) → Naccept NFA finab nq x ≡ true → Next-nq
|
|
286 case-B : { x : List Σ} → ( nq : states A ∨ states B → Bool ) → Naccept NFA finab nq x ≡ true → Next-nq
|
|
287 all-end : Next-nq
|
|
288 next-nq : (x : List Σ) → (nq : states A ∨ states B → Bool ) → Naccept NFA finab nq x ≡ true → Next-nq
|
|
289 next-nq = {!!}
|
|
290
|
89
|
291 lemma11 : (x y : List Σ) → {z : List Σ} → x ++ y ≡ z → (q : states A) → (nq : states A ∨ states B → Bool ) → (nq (case1 q) ≡ true)
|
|
292 → Naccept NFA finab nq z ≡ true → split (contain A) (contain B) z ≡ true
|
90
|
293 lemma11 (h ∷ t) [] {z} refl q nq nqt CC with bool-≡-? (accept (automaton A) (astart A) (h ∷ t)) true -- first case
|
|
294 ... | yes p = AB→split (contain A) (contain B) (h ∷ t) [] p lemma13 where
|
|
295 lemma14 : accept (automaton A) (astart A) (h ∷ t) ≡ true
|
|
296 lemma14 = {!!}
|
|
297 lemma13 : accept (automaton B) (astart B) [] ≡ true
|
|
298 lemma13 = {!!}
|
|
299 ... | no ¬p = {!!}
|
|
300 lemma11 [] y {z} refl q nq nqt CC = {!!} -- last case
|
|
301 lemma11 (h ∷ t) (hz ∷ tz) {z} refl q nq nqt CC with bool-≡-? (aend (automaton A) q) true
|
|
302 ... | yes p = lemma11 ((h ∷ t) ++ [ hz ] ) tz {z} (++-assoc (h ∷ t) _ _) {!!} {!!} {!!} {!!}
|
|
303 ... | no ¬p = lemma11 ((h ∷ t) ++ [ hz ] ) tz {z} (++-assoc (h ∷ t) _ _) {!!} {!!} {!!} {!!}
|
87
|
304
|
|
305 lemma10 : Naccept NFA finab (equal? finab (case1 (astart A))) x ≡ true → split (contain A) (contain B) x ≡ true
|
90
|
306 lemma10 CC = lemma11 x [] {x} {!!} {!!} {!!} {!!} CC
|
87
|
307
|
|
308 closed-in-concat← : contain (M-Concat A B) x ≡ true → Concat (contain A) (contain B) x ≡ true
|
|
309 closed-in-concat← C with subset-construction-lemma← finab NFA (case1 (astart A)) x C
|
|
310 ... | CC = lemma10 CC
|
|
311
|
|
312 -- AB→split (accept (automaton A) {!!} ) (accept (automaton B) {!!} ) {!!} {!!} {!!} {!!}
|
71
|
313
|
|
314
|
87
|
315
|