annotate automaton-in-agda/src/regular-language.agda @ 405:af8f630b7e60

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 24 Sep 2023 18:02:04 +0900
parents 62a4d1a2c48d
children a60132983557
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 401
diff changeset
1 {-# OPTIONS --cubical-compatible --safe #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 401
diff changeset
2
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 module regular-language where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 open import Level renaming ( suc to Suc ; zero to Zero )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 open import Data.List
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Data.Nat hiding ( _≟_ )
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
8 open import Data.Fin hiding ( _+_ )
72
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 71
diff changeset
9 open import Data.Empty
101
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 100
diff changeset
10 open import Data.Unit
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 open import Data.Product
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 -- open import Data.Maybe
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 open import Relation.Nullary
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 open import Relation.Binary.PropositionalEquality hiding ( [_] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 open import logic
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
16 open import nat
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 open import automaton
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 language : { Σ : Set } → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 language {Σ} = List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 language-L : { Σ : Set } → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 language-L {Σ} = List (List Σ)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 Union : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
330
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 268
diff changeset
26 Union {Σ} A B x = A x \/ B x
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
330
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 268
diff changeset
28 split : {Σ : Set} → (x y : language {Σ} ) → language {Σ}
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 split x y [] = x [] /\ y []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 split x y (h ∷ t) = (x [] /\ y (h ∷ t)) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 Concat : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 Concat {Σ} A B = split A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 401
diff changeset
36 -- {-# TERMINATING #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 401
diff changeset
37 -- Star1 : {Σ : Set} → ( A : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 401
diff changeset
38 -- Star1 {Σ} A [] = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 401
diff changeset
39 -- Star0 {Σ} A (h ∷ t) = split A ( Star1 {Σ} A ) (h ∷ t)
383
708570e55a91 add regex2 (we need source reorganization)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 330
diff changeset
40
401
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
41 -- Terminating version of Star1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
42 --
384
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 383
diff changeset
43 repeat : {Σ : Set} → (x : List Σ → Bool) → (y : List Σ ) → Bool
401
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
44 repeat2 : {Σ : Set} → (x : List Σ → Bool) → (pre y : List Σ ) → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
45 repeat2 x pre [] = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
46 repeat2 x pre (h ∷ y) =
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
47 (x (pre ++ (h ∷ [])) /\ repeat x y )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
48 \/ repeat2 x (pre ++ (h ∷ [])) y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
49
384
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 383
diff changeset
50 repeat {Σ} x [] = true
401
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 384
diff changeset
51 repeat {Σ} x (h ∷ y) = repeat2 x [] (h ∷ y)
383
708570e55a91 add regex2 (we need source reorganization)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 330
diff changeset
52
384
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 383
diff changeset
53 Star : {Σ : Set} → (x : List Σ → Bool) → (y : List Σ ) → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 383
diff changeset
54 Star {Σ} x y = repeat x y
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
56 open import automaton-ex
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
57
87
217ef727574a reverse direction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
58 test-AB→split : {Σ : Set} → {A B : List In2 → Bool} → split A B ( i0 ∷ i1 ∷ i0 ∷ [] ) ≡ (
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
59 ( A [] /\ B ( i0 ∷ i1 ∷ i0 ∷ [] ) ) \/
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
60 ( A ( i0 ∷ [] ) /\ B ( i1 ∷ i0 ∷ [] ) ) \/
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
61 ( A ( i0 ∷ i1 ∷ [] ) /\ B ( i0 ∷ [] ) ) \/
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
62 ( A ( i0 ∷ i1 ∷ i0 ∷ [] ) /\ B [] )
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
63 )
87
217ef727574a reverse direction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
64 test-AB→split {_} {A} {B} = refl
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
65
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
66 star-nil : {Σ : Set} → ( A : language {Σ} ) → Star A [] ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
67 star-nil A = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
68
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
69 open Automaton
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
70 open import finiteSet
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
71 open import finiteSetUtil
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
72
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
73 record RegularLanguage ( Σ : Set ) : Set (Suc Zero) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
74 field
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
75 states : Set
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
76 astart : states
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
77 afin : FiniteSet states
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
78 automaton : Automaton states Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
79 contain : List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
80 contain x = accept automaton astart x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
81
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
82 open RegularLanguage
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
83
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
84 isRegular : {Σ : Set} → (A : language {Σ} ) → ( x : List Σ ) → (r : RegularLanguage Σ ) → Set
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
85 isRegular A x r = A x ≡ contain r x
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
86
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
87 RegularLanguage-is-language : { Σ : Set } → RegularLanguage Σ → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
88 RegularLanguage-is-language {Σ} R = RegularLanguage.contain R
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
89
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
90 RegularLanguage-is-language' : { Σ : Set } → RegularLanguage Σ → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
91 RegularLanguage-is-language' {Σ} R x = accept (automaton R) (astart R) x where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
92 open RegularLanguage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
93
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
94 -- a language is implemented by an automaton
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
126
a79e2c2e1642 finite done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
96 -- postulate
a79e2c2e1642 finite done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
97 -- fin-× : {A B : Set} → { a b : ℕ } → FiniteSet A {a} → FiniteSet B {b} → FiniteSet (A × B) {a * b}
73
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 72
diff changeset
98
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 M-Union : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 M-Union {Σ} A B = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 states = states A × states B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 ; astart = ( astart A , astart B )
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
103 ; afin = fin-× (afin A) (afin B)
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 ; automaton = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 δ = λ q x → ( δ (automaton A) (proj₁ q) x , δ (automaton B) (proj₂ q) x )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 ; aend = λ q → ( aend (automaton A) (proj₁ q) \/ aend (automaton B) (proj₂ q) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 }
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
108 }
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 closed-in-union : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Union (contain A) (contain B)) x ( M-Union A B )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 closed-in-union A B [] = lemma where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 lemma : aend (automaton A) (astart A) \/ aend (automaton B) (astart B) ≡
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 aend (automaton A) (astart A) \/ aend (automaton B) (astart B)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 lemma = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 closed-in-union {Σ} A B ( h ∷ t ) = lemma1 t ((δ (automaton A) (astart A) h)) ((δ (automaton B) (astart B) h)) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 lemma1 : (t : List Σ) → (qa : states A ) → (qb : states B ) →
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 accept (automaton A) qa t \/ accept (automaton B) qb t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 ≡ accept (automaton (M-Union A B)) (qa , qb) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 lemma1 [] qa qb = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 lemma1 (h ∷ t ) qa qb = lemma1 t ((δ (automaton A) qa h)) ((δ (automaton B) qb h))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121