annotate agda/regular-language.agda @ 65:293a2075514b

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 31 Oct 2019 10:08:55 +0900
parents
children f124fceba460
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 module regular-language where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 open import Level renaming ( suc to Suc ; zero to Zero )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 open import Data.List
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 open import Data.Nat hiding ( _≟_ )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 open import Data.Fin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Data.Product
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 -- open import Data.Maybe
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 open import Relation.Nullary
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 open import Relation.Binary.PropositionalEquality hiding ( [_] )
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 open import automaton
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 open import finiteSet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 language : { Σ : Set } → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 language {Σ} = List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 language-L : { Σ : Set } → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 language-L {Σ} = List (List Σ)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 open Automaton
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 record RegularLanguage ( Σ : Set ) : Set (Suc Zero) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 states : Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 astart : states
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 automaton : Automaton states Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 contain : List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 contain x = accept automaton astart x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 Union : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 Union {Σ} A B x = (A x ) \/ (B x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 split : {Σ : Set} → (List Σ → Bool)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 → ( List Σ → Bool) → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 split x y [] = x [] /\ y []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 split x y (h ∷ t) = (x [] /\ y (h ∷ t)) \/
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 Concat : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 Concat {Σ} A B = split A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 {-# TERMINATING #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 Star : {Σ : Set} → ( A : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 Star {Σ} A = split A ( Star {Σ} A )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 open RegularLanguage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 isRegular : {Σ : Set} → (A : language {Σ} ) → ( x : List Σ ) → (r : RegularLanguage Σ ) → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 isRegular A x r = A x ≡ contain r x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 M-Union : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 M-Union {Σ} A B = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 states = states A × states B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 ; astart = ( astart A , astart B )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 ; automaton = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 δ = λ q x → ( δ (automaton A) (proj₁ q) x , δ (automaton B) (proj₂ q) x )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 ; aend = λ q → ( aend (automaton A) (proj₁ q) \/ aend (automaton B) (proj₂ q) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 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
62 closed-in-union A B [] = lemma where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 lemma : aend (automaton A) (astart A) \/ aend (automaton B) (astart B) ≡
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 aend (automaton A) (astart A) \/ aend (automaton B) (astart B)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 lemma = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 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
67 lemma1 : (t : List Σ) → (qa : states A ) → (qb : states B ) →
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 accept (automaton A) qa t \/ accept (automaton B) qb t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 ≡ accept (automaton (M-Union A B)) (qa , qb) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 lemma1 [] qa qb = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 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
72
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 -- M-Concat : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 -- M-Concat {Σ} A B = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 -- states = states A ∨ states B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 -- ; astart = case1 (astart A )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 -- ; automaton = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 -- δ = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 -- ; aend = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 -- }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 -- }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 -- closed-in-concat : {Σ : Set} → (A B : RegularLanguage Σ ) → ( x : List Σ ) → isRegular (Concat (contain A) (contain B)) x ( M-Concat A B )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 -- closed-in-concat = {!!}