annotate automaton-in-agda/src/regular-language.agda @ 410:db02b6938e04

StarProp and Ntrace
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 22 Nov 2023 17:07:01 +0900
parents 4e4acdc43dee
children 207e6c4e155c
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
410
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
45 repeat2 x pre [] = true
401
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
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
56 -- We have to prove definitions of Concat and Star are equivalent to the set theoretic definitions
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
57
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
58 -- 1. A ∪ B = { x | x ∈ A \/ x ∈ B }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
59 -- 2. A ∘ B = { x | ∃ y ∈ A, z ∈ B, x = y ++ z }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
60 -- 3. A* = { x | ∃ n ∈ ℕ, y1, y2, ..., yn ∈ A, x = y1 ++ y2 ++ ... ++ yn }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
61
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
62 -- lemma-Union : {Σ : Set} → ( A B : language {Σ} ) → ( x : List Σ ) → Union A B x ≡ ( A x \/ B x )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
63 -- lemma-Union = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
65 -- lemma-Concat : {Σ : Set} → ( A B : language {Σ} ) → ( x : List Σ )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
66 -- → Concat A B x ≡ ( ∃ λ y → ∃ λ z → A y /\ B z /\ x ≡ y ++ z )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
67 -- lemma-Concat = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
68
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
69 open import automaton-ex
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
70
87
217ef727574a reverse direction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
71 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
72 ( A [] /\ B ( i0 ∷ i1 ∷ i0 ∷ [] ) ) \/
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
73 ( A ( i0 ∷ [] ) /\ B ( i1 ∷ i0 ∷ [] ) ) \/
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
74 ( A ( i0 ∷ i1 ∷ [] ) /\ B ( i0 ∷ [] ) ) \/
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
75 ( A ( i0 ∷ i1 ∷ i0 ∷ [] ) /\ B [] )
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
76 )
87
217ef727574a reverse direction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
77 test-AB→split {_} {A} {B} = refl
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
78
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
79 star-nil : {Σ : Set} → ( A : language {Σ} ) → Star A [] ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
80 star-nil A = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
81
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
82 open Automaton
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
83 open import finiteSet
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
84 open import finiteSetUtil
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
85
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
86 record RegularLanguage ( Σ : Set ) : Set (Suc Zero) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
87 field
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
88 states : Set
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
89 astart : states
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
90 afin : FiniteSet states
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
91 automaton : Automaton states Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
92 contain : List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
93 contain x = accept automaton astart x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
94
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
95 open RegularLanguage
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
96
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
97 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
98 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
99
267
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
100 RegularLanguage-is-language : { Σ : Set } → RegularLanguage Σ → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
101 RegularLanguage-is-language {Σ} R = RegularLanguage.contain R
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
102
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
103 RegularLanguage-is-language' : { Σ : Set } → RegularLanguage Σ → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
104 RegularLanguage-is-language' {Σ} R x = accept (automaton R) (astart R) x where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
105 open RegularLanguage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
106
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
107 -- a language is implemented by an automaton
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
126
a79e2c2e1642 finite done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
109 -- postulate
a79e2c2e1642 finite done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
110 -- 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
111
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 M-Union : {Σ : Set} → (A B : RegularLanguage Σ ) → RegularLanguage Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 M-Union {Σ} A B = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 states = states A × states B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 ; astart = ( astart A , astart B )
268
8006cbd87b20 fix concat dfa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 267
diff changeset
116 ; afin = fin-× (afin A) (afin B)
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 ; automaton = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 δ = λ q x → ( δ (automaton A) (proj₁ q) x , δ (automaton B) (proj₂ q) x )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 ; aend = λ q → ( aend (automaton A) (proj₁ q) \/ aend (automaton B) (proj₂ q) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 }
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 138
diff changeset
121 }
65
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 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
124 closed-in-union A B [] = lemma where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 lemma : aend (automaton A) (astart A) \/ aend (automaton B) (astart B) ≡
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 aend (automaton A) (astart A) \/ aend (automaton B) (astart B)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 lemma = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 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
129 lemma1 : (t : List Σ) → (qa : states A ) → (qb : states B ) →
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 accept (automaton A) qa t \/ accept (automaton B) qb t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 ≡ accept (automaton (M-Union A B)) (qa , qb) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 lemma1 [] qa qb = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 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
134
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
135
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
136
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
137 record Split {Σ : Set} (A : List Σ → Bool ) ( B : List Σ → Bool ) (x : List Σ ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
138 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
139 sp0 sp1 : List Σ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
140 sp-concat : sp0 ++ sp1 ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
141 prop0 : A sp0 ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
142 prop1 : B sp1 ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
143
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
144 open Split
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
145
408
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
146 AB→split1 : {Σ : Set} → (A B : List Σ → Bool ) → ( x y : List Σ ) → {z : List Σ} → A x ≡ true → B y ≡ true → z ≡ x ++ y → Split A B z
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
147 AB→split1 {Σ} A B x y {z} ax by z=xy = record { sp0 = x ; sp1 = y ; sp-concat = sym z=xy ; prop0 = ax ; prop1 = by }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
148
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
149 list-empty++ : {Σ : Set} → (x y : List Σ) → x ++ y ≡ [] → (x ≡ [] ) ∧ (y ≡ [] )
408
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
150 list-empty++ [] [] _ = record { proj1 = refl ; proj2 = refl }
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
151 list-empty++ [] (x ∷ y) ()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
152 list-empty++ (x ∷ x₁) y ()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
153
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
154 open _∧_
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
155
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
156 open import Relation.Binary.PropositionalEquality hiding ( [_] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
157
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
158 c-split-lemma : {Σ : Set} → (A B : List Σ → Bool ) → (h : Σ) → ( t : List Σ ) → split A B (h ∷ t ) ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
159 → ( ¬ (A [] ≡ true )) ∨ ( ¬ (B ( h ∷ t ) ≡ true) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
160 → split (λ t1 → A (h ∷ t1)) B t ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
161 c-split-lemma {Σ} A B h t eq p = sym ( begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
162 true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
163 ≡⟨ sym eq ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
164 split A B (h ∷ t )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
165 ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
166 A [] /\ B (h ∷ t) \/ split (λ t1 → A (h ∷ t1)) B t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
167 ≡⟨ cong ( λ k → k \/ split (λ t1 → A (h ∷ t1)) B t ) (lemma-p p ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
168 false \/ split (λ t1 → A (h ∷ t1)) B t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
169 ≡⟨ bool-or-1 refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
170 split (λ t1 → A (h ∷ t1)) B t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
171 ∎ ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
172 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
173 lemma-p : ( ¬ (A [] ≡ true )) ∨ ( ¬ (B ( h ∷ t ) ≡ true) ) → A [] /\ B (h ∷ t) ≡ false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
174 lemma-p (case1 ¬A ) = bool-and-1 ( ¬-bool-t ¬A )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
175 lemma-p (case2 ¬B ) = bool-and-2 ( ¬-bool-t ¬B )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
176
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
177 split→AB : {Σ : Set} → (A B : List Σ → Bool ) → ( x : List Σ ) → split A B x ≡ true → Split A B x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
178 split→AB {Σ} A B [] eq with bool-≡-? (A []) true | bool-≡-? (B []) true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
179 split→AB {Σ} A B [] eq | yes eqa | yes eqb =
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
180 record { sp0 = [] ; sp1 = [] ; sp-concat = refl ; prop0 = eqa ; prop1 = eqb }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
181 split→AB {Σ} A B [] eq | yes p | no ¬p = ⊥-elim (lemma-∧-1 eq (¬-bool-t ¬p ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
182 split→AB {Σ} A B [] eq | no ¬p | t = ⊥-elim (lemma-∧-0 eq (¬-bool-t ¬p ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
183 split→AB {Σ} A B (h ∷ t ) eq with bool-≡-? (A []) true | bool-≡-? (B (h ∷ t )) true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
184 ... | yes px | yes py = record { sp0 = [] ; sp1 = h ∷ t ; sp-concat = refl ; prop0 = px ; prop1 = py }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
185 ... | no px | _ with split→AB (λ t1 → A ( h ∷ t1 )) B t (c-split-lemma A B h t eq (case1 px) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
186 ... | S = record { sp0 = h ∷ sp0 S ; sp1 = sp1 S ; sp-concat = cong ( λ k → h ∷ k) (sp-concat S) ; prop0 = prop0 S ; prop1 = prop1 S }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
187 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) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
188 ... | S = record { sp0 = h ∷ sp0 S ; sp1 = sp1 S ; sp-concat = cong ( λ k → h ∷ k) (sp-concat S) ; prop0 = prop0 S ; prop1 = prop1 S }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
189
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
190 AB→split : {Σ : Set} → (A B : List Σ → Bool ) → ( x y : List Σ ) → A x ≡ true → B y ≡ true → split A B (x ++ y ) ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
191 AB→split {Σ} A B [] [] eqa eqb = begin
408
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
192 split A B [] ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
193 A [] /\ B [] ≡⟨ cong₂ (λ j k → j /\ k ) eqa eqb ⟩
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
194 true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
195 ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
196 AB→split {Σ} A B [] (h ∷ y ) eqa eqb = begin
408
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
197 split A B (h ∷ y ) ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
198 A [] /\ B (h ∷ y) \/ split (λ t1 → A (h ∷ t1)) B y ≡⟨ cong₂ (λ j k → j /\ k \/ split (λ t1 → A (h ∷ t1)) B y ) eqa eqb ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
199 true /\ true \/ split (λ t1 → A (h ∷ t1)) B y ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
200 true \/ split (λ t1 → A (h ∷ t1)) B y ≡⟨⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
201 true ∎ where open ≡-Reasoning
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
202 AB→split {Σ} A B (h ∷ t) y eqa eqb = begin
408
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
203 split A B ((h ∷ t) ++ y) ≡⟨⟩
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
204 A [] /\ B (h ∷ t ++ y) \/ split (λ t1 → A (h ∷ t1)) B (t ++ y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
205 ≡⟨ cong ( λ k → A [] /\ B (h ∷ t ++ y) \/ k ) (AB→split {Σ} (λ t1 → A (h ∷ t1)) B t y eqa eqb ) ⟩
408
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
206 A [] /\ B (h ∷ t ++ y) \/ true ≡⟨ bool-or-3 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
207 true ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
208
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
209
409
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 408
diff changeset
210 split→AB1 : {Σ : Set} → (A B : List Σ → Bool ) → ( x : List Σ ) → Split A B x → split A B x ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 408
diff changeset
211 split→AB1 {Σ} A B x S = subst (λ k → split A B k ≡ true ) (sp-concat S) ( AB→split A B _ _ (prop0 S) (prop1 S) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 408
diff changeset
212
408
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 406
diff changeset
213
410
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
214 -- low of exclude middle of Split A B x
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
215 lemma-concat : {Σ : Set} → ( A B : language {Σ} ) → (x : List Σ) → Split A B x ∨ ( ¬ Split A B x )
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
216 lemma-concat {Σ} A B x with split A B x in eq
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
217 ... | true = case1 (split→AB A B x eq )
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
218 ... | false = case2 (λ p → ¬-bool eq (split→AB1 A B x p ))
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
219
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
220 -- Concat : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
221 -- Concat {Σ} A B = split A B
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
222
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
223 Concat' : {Σ : Set} → ( A B : language {Σ} ) → (x : List Σ) → Set
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
224 Concat' {Σ} A B = λ x → Split A B x
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
225
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
226 record StarProp {Σ : Set} (A : List Σ → Bool ) (x : List Σ ) : Set where
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
227 field
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
228 spn : List ( List Σ )
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
229 spn-concat : foldr (λ k → k ++_ ) [] spn ≡ x
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
230 propn : foldr (λ k → λ j → A k /\ j ) true spn ≡ true
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
231
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
232 open StarProp
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
233
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
234 Star→StarProp : {Σ : Set} → ( A : language {Σ} ) → (x : List Σ) → Star A x ≡ true → StarProp A x
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
235 Star→StarProp = ?
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
236
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
237 StarProp→Star : {Σ : Set} → ( A : language {Σ} ) → (x : List Σ) → StarProp A x → Star A x ≡ true
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
238 StarProp→Star {Σ} A x sp = subst (λ k → Star A k ≡ true ) (spsx (spn sp) refl) ( sps1 (spn sp) refl ) where
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
239 spsx : (y : List ( List Σ ) ) → spn sp ≡ y → foldr (λ k → k ++_ ) [] y ≡ x
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
240 spsx y refl = spn-concat sp
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
241 sps1 : (y : List ( List Σ ) ) → spn sp ≡ y → Star A (foldr (λ k → k ++_ ) [] y) ≡ true
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
242 sps1 = ?
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
243
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
244
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
245 lemma-starprop : {Σ : Set} → ( A : language {Σ} ) → (x : List Σ) → StarProp A x ∨ ( ¬ StarProp A x )
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
246 lemma-starprop = ?
db02b6938e04 StarProp and Ntrace
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 409
diff changeset
247