annotate automaton-in-agda/src/flcagl.agda @ 406:a60132983557

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 08 Nov 2023 21:35:54 +0900
parents af8f630b7e60
children 3d0aa205edf9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
1 {-# OPTIONS --cubical-compatible #-}
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
2 {-# OPTIONS --sized-types #-}
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
3
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
4 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
5 -- induction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
6 -- data aaa where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
7 -- aend : aaa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
8 -- bb : (y : aaa) → aaa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
9 -- cc : (y : aaa) → aaa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
10 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
11 -- (x : aaa) → bb → cc → aend
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
12 -- induction : ( P : aaa → Set ) → (x : aaa) → P x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
13 -- induction P aend = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
14 -- induction P (bb y) = ? where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
15 -- lemma : P y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
16 -- lemma = induction P y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
17 -- induction P (cc y) = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
18 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
19 -- ∙
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
20 -- / \
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
21 -- bb cc
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
22 -- /
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
23 -- aend
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
25 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
26 -- coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
27 -- record AAA : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
28 -- field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
29 -- bb : (y : AAA)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
30 -- cc : (y : AAA)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
31
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
32
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 open import Relation.Nullary
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 open import Relation.Binary.PropositionalEquality
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 module flcagl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 (A : Set)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 ( _≟_ : (a b : A) → Dec ( a ≡ b ) ) where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 open import Data.Bool hiding ( _≟_ )
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 -- open import Data.Maybe
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 open import Level renaming ( zero to Zero ; suc to succ )
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 open import Size
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
43 open import Data.Empty
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 module List where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 data List (i : Size) (A : Set) : Set where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 [] : List i A
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 _∷_ : {j : Size< i} (x : A) (xs : List j A) → List i A
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 map : ∀{i A B} → (A → B) → List i A → List i B
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 map f [] = []
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 map f ( x ∷ xs)= f x ∷ map f xs
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 foldr : ∀{i} {A B : Set} → (A → B → B) → B → List i A → B
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 foldr c n [] = n
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 foldr c n (x ∷ xs) = c x (foldr c n xs)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 any : ∀{i A} → (A → Bool) → List i A → Bool
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 any p xs = foldr _∨_ false (map p xs)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 module Lang where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 open List
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 record Lang (i : Size) : Set where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 coinductive
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 field
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 ν : Bool
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 δ : ∀{j : Size< i} → A → Lang j
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 open Lang
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 _∋_ : ∀{i} → Lang i → List i A → Bool
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 l ∋ [] = ν l
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 l ∋ ( a ∷ as ) = δ l a ∋ as
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 trie : ∀{i} (f : List i A → Bool) → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 ν (trie f) = f []
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 δ (trie f) a = trie (λ as → f (a ∷ as))
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
83 -- trie' : ∀{i} (f : List i A → Bool) → Lang i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
84 -- trie' {i} f = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
85 -- ν = f []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
86 -- ; δ = λ {j} a → lem {j} a -- we cannot write in this way
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
87 -- } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
88 -- lem : {j : Size< i} → A → Lang j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
89 -- lem {j} a = trie' (λ as → f (a ∷ as))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
90
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 ∅ : ∀{i} → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 ν ∅ = false
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 δ ∅ x = ∅
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 ε : ∀{i} → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 ν ε = true
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 δ ε x = ∅
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 open import Relation.Nullary.Decidable
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 char : ∀{i} (a : A) → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 ν (char a) = false
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 δ (char a) x = if ⌊ a ≟ x ⌋ then ε else ∅
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 compl : ∀{i} (l : Lang i) → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 ν (compl l) = not (ν l)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 δ (compl l) x = compl (δ l x)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 _∪_ : ∀{i} (k l : Lang i) → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 ν (k ∪ l) = ν k ∨ ν l
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 δ (k ∪ l) x = δ k x ∪ δ l x
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
115 _·_ : ∀{i} (k l : Lang i) → Lang i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
116 ν (k · l) = ν k ∧ ν l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
117 δ (k · l) x = let k′l = δ k x · l in if ν k then k′l ∪ δ l x else k′l
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
119 _+_ : ∀{i} (k l : Lang i) → Lang i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
120 ν (k + l) = ν k ∧ ν l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
121 δ (k + l) x with ν k
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
122 ... | false = δ k x + l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
123 ... | true = (δ k x + l ) ∪ δ l x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
124
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
125 language : { Σ : Set } → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
126 language {Σ} = List ∞ Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
127
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
128 split : {Σ : Set} → {i : Size } → (x y : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
129 split x y [] = x [] ∨ y []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
130 split x y (h ∷ t) = (x [] ∧ y (h ∷ t)) ∨
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
131 split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
132
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
133 LtoSplit : (x y : Lang ∞ ) → (z : List ∞ A) → ((x + y ) ∋ z) ≡ true → split (λ w → x ∋ w) (λ w → y ∋ w) z ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
134 LtoSplit x y [] xy with ν x | ν y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
135 ... | true | true = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
136 LtoSplit x y (h ∷ z) xy = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
137
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
138 SplitoL : (x y : Lang ∞ ) → (z : List ∞ A) → ((x + y ) ∋ z) ≡ false → split (λ w → x ∋ w) (λ w → y ∋ w) z ≡ false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
139 SplitoL x y [] xy with ν x | ν y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
140 ... | false | false = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
141 ... | false | true = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
142 ... | true | false = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
143 SplitoL x y (h ∷ z) xy = ?
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
144
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
145
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
146 _*_ : ∀{i} (k l : Lang i ) → Lang i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
147 ν (k * l) = ν k ∧ ν l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
148 δ (_*_ {i} k l) {j} x =
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 let
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 k′l : Lang j
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
151 k′l = _*_ {j} (δ k {j} x) l
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 in if ν k then _∪_ {j} k′l (δ l {j} x) else k′l
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 _* : ∀{i} (l : Lang i) → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 ν (l *) = true
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 δ (l *) x = δ l x · (l *)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 record _≅⟨_⟩≅_ (l : Lang ∞ ) i (k : Lang ∞) : Set where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 coinductive
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 field ≅ν : ν l ≡ ν k
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 ≅δ : ∀ {j : Size< i } (a : A ) → δ l a ≅⟨ j ⟩≅ δ k a
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 open _≅⟨_⟩≅_
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 ≅refl : ∀{i} {l : Lang ∞} → l ≅⟨ i ⟩≅ l
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 ≅ν ≅refl = refl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 ≅δ ≅refl a = ≅refl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 ≅sym : ∀{i} {k l : Lang ∞} (p : l ≅⟨ i ⟩≅ k) → k ≅⟨ i ⟩≅ l
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 ≅ν (≅sym p) = sym (≅ν p)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 ≅δ (≅sym p) a = ≅sym (≅δ p a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 ≅trans : ∀{i} {k l m : Lang ∞}
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 ( p : k ≅⟨ i ⟩≅ l ) ( q : l ≅⟨ i ⟩≅ m ) → k ≅⟨ i ⟩≅ m
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 ≅ν (≅trans p q) = trans (≅ν p) (≅ν q)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 ≅δ (≅trans p q) a = ≅trans (≅δ p a) (≅δ q a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 open import Relation.Binary
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 ≅isEquivalence : ∀(i : Size) → IsEquivalence _≅⟨ i ⟩≅_
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 ≅isEquivalence i = record { refl = ≅refl; sym = ≅sym; trans = ≅trans }
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 Bis : ∀(i : Size) → Setoid _ _
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 Setoid.Carrier (Bis i) = Lang ∞
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 Setoid._≈_ (Bis i) = _≅⟨ i ⟩≅_
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 Setoid.isEquivalence (Bis i) = ≅isEquivalence i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
189 -- import Relation.Binary.EqReasoning as EqR
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
190 import Relation.Binary.Reasoning.Setoid as EqR
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 ≅trans′ : ∀ i (k l m : Lang ∞)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 ( p : k ≅⟨ i ⟩≅ l ) ( q : l ≅⟨ i ⟩≅ m ) → k ≅⟨ i ⟩≅ m
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 ≅trans′ i k l m p q = begin
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 k ≈⟨ p ⟩
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 l ≈⟨ q ⟩
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 m ∎ where open EqR (Bis i)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 open import Data.Bool.Properties
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 union-assoc : ∀{i} (k {l m} : Lang ∞) → ((k ∪ l) ∪ m ) ≅⟨ i ⟩≅ ( k ∪ (l ∪ m) )
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 ≅ν (union-assoc k) = ∨-assoc (ν k) _ _
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 ≅δ (union-assoc k) a = union-assoc (δ k a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 union-comm : ∀{i} (l k : Lang ∞) → (l ∪ k ) ≅⟨ i ⟩≅ ( k ∪ l )
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 ≅ν (union-comm l k) = ∨-comm (ν l) _
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 ≅δ (union-comm l k) a = union-comm (δ l a) (δ k a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 union-idem : ∀{i} (l : Lang ∞) → (l ∪ l ) ≅⟨ i ⟩≅ l
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 ≅ν (union-idem l) = ∨-idem _
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 ≅δ (union-idem l) a = union-idem (δ l a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 union-emptyl : ∀{i}{l : Lang ∞} → (∅ ∪ l ) ≅⟨ i ⟩≅ l
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 ≅ν union-emptyl = refl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 ≅δ union-emptyl a = union-emptyl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 union-cong : ∀{i}{k k′ l l′ : Lang ∞}
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
215 (p : k ≅⟨ i ⟩≅ k′) (q : l ≅⟨ i ⟩≅ l′ ) → ( k ∪ l ) ≅⟨ i ⟩≅ ( k′ ∪ l′ )
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 ≅ν (union-cong p q) = cong₂ _∨_ (≅ν p) (≅ν q)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 ≅δ (union-cong p q) a = union-cong (≅δ p a) (≅δ q a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 withExample : (P : Bool → Set) (p : P true) (q : P false) →
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 {A : Set} (g : A → Bool) (x : A) → P (g x)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 withExample P p q g x with g x
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 ... | true = p
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 ... | false = q
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 rewriteExample : {A : Set} {P : A → Set} {x : A} (p : P x)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 {g : A → A} (e : g x ≡ x) → P (g x)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 rewriteExample p e rewrite e = p
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
228
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
229 infixr 6 _∪_
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 infixr 7 _·_
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 infix 5 _≅⟨_⟩≅_
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
232
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
233 union-congl : ∀{i}{k k′ l : Lang ∞}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
234 (p : k ≅⟨ i ⟩≅ k′) → ( k ∪ l ) ≅⟨ i ⟩≅ ( k′ ∪ l )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
235 union-congl eq = union-cong eq ≅refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
236
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
237 union-congr : ∀{i}{k l l′ : Lang ∞}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
238 (p : l ≅⟨ i ⟩≅ l′) → ( k ∪ l ) ≅⟨ i ⟩≅ ( k ∪ l′ )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
239 union-congr eq = union-cong ≅refl eq
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
240
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
241 union-swap24 : ∀{i} ({x y z w} : Lang ∞) → (x ∪ y) ∪ z ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
242 ≅⟨ i ⟩≅ (x ∪ z) ∪ y ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
243 union-swap24 {_} {x} {y} {z} {w} = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
244 (x ∪ y) ∪ z ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
245 ≈⟨ union-assoc x ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
246 x ∪ y ∪ z ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
247 ≈⟨ union-congr (≅sym ( union-assoc y)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
248 x ∪ ((y ∪ z) ∪ w)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
249 ≈⟨ ≅sym ( union-assoc x ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
250 (x ∪ ( y ∪ z)) ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
251 ≈⟨ union-congl (union-congr (union-comm y z )) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
252 ( x ∪ (z ∪ y)) ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
253 ≈⟨ union-congl (≅sym ( union-assoc x )) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
254 ((x ∪ z) ∪ y) ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
255 ≈⟨ union-assoc (x ∪ z) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
256 (x ∪ z) ∪ y ∪ w
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
258 where open EqR (Bis _)
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 concat-union-distribr : ∀{i} (k {l m} : Lang ∞) → k · ( l ∪ m ) ≅⟨ i ⟩≅ ( k · l ) ∪ ( k · m )
48
68e5f56cf01f fix coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
261 ≅ν (concat-union-distribr k) = ∧-distribˡ-∨ (ν k) _ _
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 ≅δ (concat-union-distribr k) a with ν k
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 ≅δ (concat-union-distribr k {l} {m}) a | true = begin
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
264 δ k a · (l ∪ m) ∪ (δ l a ∪ δ m a)
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
265 ≈⟨ union-congl (concat-union-distribr _) ⟩
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
266 (δ k a · l ∪ δ k a · m) ∪ (δ l a ∪ δ m a)
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
267 ≈⟨ union-swap24 ⟩
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
268 (δ k a · l ∪ δ l a) ∪ (δ k a · m ∪ δ m a)
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
269
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 where open EqR (Bis _)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 ≅δ (concat-union-distribr k) a | false = concat-union-distribr (δ k a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
273 concat-union-distribl : ∀{i} (k {l m} : Lang ∞) → ( k ∪ l ) · m ≅⟨ i ⟩≅ ( k · m ) ∪ ( l · m )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
274 ≅ν (concat-union-distribl k {l} {m}) = ∧-distribʳ-∨ _ (ν k) _
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
275 ≅δ (concat-union-distribl k {l} {m}) a with ν k | ν l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
276 ≅δ (concat-union-distribl k {l} {m}) a | false | false = concat-union-distribl (δ k a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
277 ≅δ (concat-union-distribl k {l} {m}) a | false | true = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
278 (if false ∨ true then (δ k a ∪ δ l a) · m ∪ δ m a else (δ k a ∪ δ l a) · m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
279 ≈⟨ ≅refl ⟩
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
280 ((δ k a ∪ δ l a) · m ) ∪ δ m a
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
281 ≈⟨ union-congl (concat-union-distribl _) ⟩
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
282 (δ k a · m ∪ δ l a · m) ∪ δ m a
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
283 ≈⟨ union-assoc _ ⟩
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
284 (δ k a · m) ∪ ( δ l a · m ∪ δ m a )
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
285 ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
286 (if false then δ k a · m ∪ δ m a else δ k a · m) ∪ (if true then δ l a · m ∪ δ m a else δ l a · m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
287
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
288 where open EqR (Bis _)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
289 ≅δ (concat-union-distribl k {l} {m}) a | true | false = begin
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
290 (if true ∨ false then (δ k a ∪ δ l a) · m ∪ δ m a else (δ k a ∪ δ l a) · m) ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
291 ((δ k a ∪ δ l a) · m ) ∪ δ m a ≈⟨ union-congl (concat-union-distribl _) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
292 (δ k a · m ∪ δ l a · m) ∪ δ m a ≈⟨ union-assoc _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
293 δ k a · m ∪ ( δ l a · m ∪ δ m a ) ≈⟨ union-congr ( union-comm _ _) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
294 δ k a · m ∪ δ m a ∪ δ l a · m ≈⟨ ≅sym ( union-assoc _ ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
295 (δ k a · m ∪ δ m a) ∪ δ l a · m ≈⟨ ≅refl ⟩
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
296 ((if true then δ k a · m ∪ δ m a else δ k a · m) ∪ (if false then δ l a · m ∪ δ m a else δ l a · m))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
297
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
298 where open EqR (Bis _)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
299 ≅δ (concat-union-distribl k {l} {m}) a | true | true = begin
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
300 (if true ∨ true then (δ k a ∪ δ l a) · m ∪ δ m a else (δ k a ∪ δ l a) · m) ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
301 (δ k a ∪ δ l a) · m ∪ δ m a ≈⟨ union-congl ( concat-union-distribl _ ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
302 (δ k a · m ∪ δ l a · m) ∪ δ m a ≈⟨ union-assoc _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
303 δ k a · m ∪ ( δ l a · m ∪ δ m a ) ≈⟨ ≅sym ( union-congr ( union-congr ( union-idem _ ) ) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
304 δ k a · m ∪ ( δ l a · m ∪ (δ m a ∪ δ m a) ) ≈⟨ ≅sym ( union-congr ( union-assoc _ )) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
305 δ k a · m ∪ ( (δ l a · m ∪ δ m a ) ∪ δ m a ) ≈⟨ union-congr ( union-congl ( union-comm _ _) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
306 δ k a · m ∪ ( (δ m a ∪ δ l a · m ) ∪ δ m a ) ≈⟨ ≅sym ( union-assoc _ ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
307 ( δ k a · m ∪ (δ m a ∪ δ l a · m )) ∪ δ m a ≈⟨ ≅sym ( union-congl ( union-assoc _ ) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
308 ((δ k a · m ∪ δ m a) ∪ δ l a · m) ∪ δ m a ≈⟨ union-assoc _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
309 (δ k a · m ∪ δ m a) ∪ δ l a · m ∪ δ m a ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
310 ((if true then δ k a · m ∪ δ m a else δ k a · m) ∪ (if true then δ l a · m ∪ δ m a else δ l a · m))
50
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
311
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
312 where open EqR (Bis _)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
313
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
314 postulate
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
315 concat-emptyl : ∀{i} l → ∅ · l ≅⟨ i ⟩≅ ∅
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
316 concat-emptyr : ∀{i} l → l · ∅ ≅⟨ i ⟩≅ ∅
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
317 concat-unitl : ∀{i} l → ε · l ≅⟨ i ⟩≅ l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
318 concat-unitr : ∀{i} l → l · ε ≅⟨ i ⟩≅ l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
319 star-empty : ∀{i} → ∅ * ≅⟨ i ⟩≅ ε
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
320
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
321 concat-congl : ∀{i} {m l k : Lang ∞} → l ≅⟨ i ⟩≅ k → l · m ≅⟨ i ⟩≅ k · m
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
322 ≅ν (concat-congl {i} {m} p ) = cong (λ x → x ∧ ( ν m )) ( ≅ν p )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
323 ≅δ (concat-congl {i} {m} {l} {k} p ) a with ν k | ν l | ≅ν p
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
324 ≅δ (concat-congl {i} {m} {l} {k} p) a | false | false | refl = concat-congl (≅δ p a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
325 ≅δ (concat-congl {i} {m} {l} {k} p) a | true | true | refl = union-congl (concat-congl (≅δ p a))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
326
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
327 concat-congr : ∀{i} {m l k : Lang ∞} → l ≅⟨ i ⟩≅ k → m · l ≅⟨ i ⟩≅ m · k
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
328 ≅ν (concat-congr {i} {m} {_} {k} p ) = cong (λ x → ( ν m ) ∧ x ) ( ≅ν p )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
329 ≅δ (concat-congr {i} {m} {l} {k} p ) a with ν m | ν k | ν l | ≅ν p
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
330 ≅δ (concat-congr {i} {m} {l} {k} p) a | false | x | .x | refl = concat-congr p
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
331 ≅δ (concat-congr {i} {m} {l} {k} p) a | true | x | .x | refl = union-cong (concat-congr p ) ( ≅δ p a )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
332
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
333 concat-assoc : ∀{i} (k {l m} : Lang ∞) → (k · l) · m ≅⟨ i ⟩≅ k · (l · m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
334 ≅ν (concat-assoc {i} k {l} {m} ) = ∧-assoc ( ν k ) ( ν l ) ( ν m )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
335 ≅δ (concat-assoc {i} k {l} {m} ) a with ν k
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
336 ≅δ (concat-assoc {i} k {l} {m}) a | false = concat-assoc _
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
337 ≅δ (concat-assoc {i} k {l} {m}) a | true with ν l
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
338 ≅δ (concat-assoc {i} k {l} {m}) a | true | false = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
339 ( if false then (δ k a · l ∪ δ l a) · m ∪ δ m a else (δ k a · l ∪ δ l a) · m )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
340 ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
341 (δ k a · l ∪ δ l a) · m
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
342 ≈⟨ concat-union-distribl _ ⟩
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
343 ((δ k a · l) · m ) ∪ ( δ l a · m )
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
344 ≈⟨ union-congl (concat-assoc _) ⟩
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
345 (δ k a · l · m ) ∪ ( δ l a · m )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
346 ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
347 δ k a · l · m ∪ (if false then δ l a · m ∪ δ m a else δ l a · m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
348 ∎ where open EqR (Bis _)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
349 ≅δ (concat-assoc {i} k {l} {m}) a | true | true = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
350 (if true then (δ k a · l ∪ δ l a) · m ∪ δ m a else (δ k a · l ∪ δ l a) · m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
351 ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
352 ((( δ k a · l ) ∪ δ l a) · m ) ∪ δ m a
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
353 ≈⟨ union-congl (concat-union-distribl _ ) ⟩
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
354 ((δ k a · l) · m ∪ ( δ l a · m )) ∪ δ m a
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
355 ≈⟨ union-congl ( union-congl (concat-assoc _)) ⟩
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
356 (( δ k a · l · m ) ∪ ( δ l a · m )) ∪ δ m a
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
357 ≈⟨ union-assoc _ ⟩
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
358 ( δ k a · l · m ) ∪ ( ( δ l a · m ) ∪ δ m a )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
359 ≈⟨ ≅refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
360 δ k a · l · m ∪ (if true then δ l a · m ∪ δ m a else δ l a · m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
361 ∎ where open EqR (Bis _)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
362
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 star-concat-idem : ∀{i} (l : Lang ∞) → l * · l * ≅⟨ i ⟩≅ l *
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 ≅ν (star-concat-idem l) = refl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 ≅δ (star-concat-idem l) a = begin
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
366 δ ((l *) · (l *)) a ≈⟨ union-congl (concat-assoc _) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
367 δ l a · (l * · l *) ∪ δ l a · l * ≈⟨ union-congl (concat-congr (star-concat-idem _)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
368 δ l a · l * ∪ δ l a · l * ≈⟨ union-idem _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
369 δ (l *) a ∎ where open EqR (Bis _)
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
370
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 star-idem : ∀{i} (l : Lang ∞) → (l *) * ≅⟨ i ⟩≅ l *
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 ≅ν (star-idem l) = refl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 ≅δ (star-idem l) a = begin
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
374 δ ((l *) *) a ≈⟨ concat-assoc (δ l a) ⟩
48
68e5f56cf01f fix coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
375 δ l a · ((l *) · ((l *) *)) ≈⟨ concat-congr ( concat-congr (star-idem l )) ⟩
68e5f56cf01f fix coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
376 δ l a · ((l *) · (l *)) ≈⟨ concat-congr (star-concat-idem l ) ⟩
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
377 δ l a · l *
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 ∎ where open EqR (Bis _)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
379
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
380 postulate
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
381 star-rec : ∀{i} (l : Lang ∞) → l * ≅⟨ i ⟩≅ ε ∪ (l · l *)
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
382
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
383 star-from-rec : ∀{i} (k {l m} : Lang ∞)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
384 → ν k ≡ false
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
385 → l ≅⟨ i ⟩≅ k · l ∪ m
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 → l ≅⟨ i ⟩≅ k * · m
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 ≅ν (star-from-rec k n p) with ≅ν p
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
388 ... | b rewrite n = b
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
389 ≅δ (star-from-rec k {l} {m} n p) a with ≅δ p a
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
390 ... | q rewrite n = begin
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 (δ l a)
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
392 ≈⟨ q ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
393 δ k a · l ∪ δ m a
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
394 ≈⟨ union-congl (concat-congr (star-from-rec k {l} {m} n p)) ⟩
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
395 (δ k a · (k * · m) ∪ δ m a)
51
bc0400528027 flcagl finish
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
396 ≈⟨ union-congl (≅sym (concat-assoc _)) ⟩
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
397 (δ k a · (k *)) · m ∪ δ m a
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 ∎ where open EqR (Bis _)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
399
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
400
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
401 open List
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
402
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
403 record DA (S : Set) : Set where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 field ν : (s : S) → Bool
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 δ : (s : S)(a : A) → S
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
406 νs : ∀{i} (ss : List.List i S) → Bool
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
407 νs ss = List.any ν ss
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 δs : ∀{i} (ss : List.List i S) (a : A) → List.List i S
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 δs ss a = List.map (λ s → δ s a) ss
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
410
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 open Lang
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
412
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
413 lang : ∀{i} {S} (da : DA S) (s : S) → Lang i
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 Lang.ν (lang da s) = DA.ν da s
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 Lang.δ (lang da s) a = lang da (DA.δ da s a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
416
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 open import Data.Unit hiding ( _≟_ )
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
418
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 open DA
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
420
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 ∅A : DA ⊤
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
422 ν ∅A s = false
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 δ ∅A s a = s
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
424
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 εA : DA Bool
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 ν εA b = b
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 δ εA b a = false
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
429 open import Relation.Nullary.Decidable
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
430
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 data 3States : Set where
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 init acc err : 3States
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
433
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 charA : (a : A) → DA 3States
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 ν (charA a) init = false
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 ν (charA a) acc = true
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 ν (charA a) err = false
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 δ (charA a) init x =
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
439 if ⌊ a ≟ x ⌋ then acc else err
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 δ (charA a) acc x = err
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 δ (charA a) err x = err
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
443
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
444 complA : ∀{S} (da : DA S) → DA S
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 ν (complA da) s = not (ν da s)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 δ (complA da) s a = δ da s a
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 open import Data.Product
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
449
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 _⊕_ : ∀{S1 S2} (da1 : DA S1) (da2 : DA S2) → DA (S1 × S2)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 ν (da1 ⊕ da2) (s1 , s2) = ν da1 s1 ∨ ν da2 s2
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 δ (da1 ⊕ da2) (s1 , s2) a = δ da1 s1 a , δ da2 s2 a
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
453
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 powA : ∀{S} (da : DA S) → DA (List ∞ S)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 ν (powA da) ss = νs da ss
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 δ (powA da) ss a = δs da ss a
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 open _≅⟨_⟩≅_
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
459
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 powA-nil : ∀{i S} (da : DA S) → lang (powA da) [] ≅⟨ i ⟩≅ ∅
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
461 ≅ν (powA-nil da) = refl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 ≅δ (powA-nil da) a = powA-nil da
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
463
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 powA-cons : ∀{i S} (da : DA S) {s : S} {ss : List ∞ S} →
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 lang (powA da) (s ∷ ss) ≅⟨ i ⟩≅ lang da s ∪ lang (powA da) ss
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 ≅ν (powA-cons da) = refl
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 ≅δ (powA-cons da) a = powA-cons da
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
468
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 composeA : ∀{S1 S2} (da1 : DA S1)(s2 : S2)(da2 : DA S2) → DA (S1 × List ∞ S2)
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
470 ν (composeA da1 s2 da2) (s1 , ss2) = (ν da1 s1 ∧ ν da2 s2) ∨ νs da2 ss2
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 δ (composeA da1 s2 da2) (s1 , ss2) a =
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
472 δ da1 s1 a , δs da2 (if ν da1 s1 then s2 ∷ ss2 else ss2) a
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
473
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
474 -- import Relation.Binary.EqReasoning as EqR
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
475 import Relation.Binary.Reasoning.Setoid as EqR
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
476
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
477 composeA-gen : ∀{i S1 S2} (da1 : DA S1) (da2 : DA S2) → ∀(s1 : S1)(s2 : S2)(ss : List ∞ S2) →
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
478 lang (composeA da1 s2 da2) (s1 , ss) ≅⟨ i ⟩≅ lang da1 s1 · lang da2 s2 ∪ lang (powA da2) ss
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
479 ≅ν (composeA-gen da1 da2 s1 s2 ss) = refl
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 ≅δ (composeA-gen da1 da2 s1 s2 ss) a with ν da1 s1
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
481 ... | false = composeA-gen da1 da2 (δ da1 s1 a) s2 (δs da2 ss a)
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 ... | true = begin
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
483 lang (composeA da1 s2 da2) (δ da1 s1 a , δ da2 s2 a ∷ δs da2 ss a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
484 ≈⟨ composeA-gen da1 da2 (δ da1 s1 a) s2 (δs da2 (s2 ∷ ss) a) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
485 lang da1 (δ da1 s1 a) · lang da2 s2 ∪ lang (powA da2) (δs da2 (s2 ∷ ss) a)
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
486 ≈⟨ union-congr (powA-cons da2) ⟩
48
68e5f56cf01f fix coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
487 lang da1 (δ da1 s1 a) · lang da2 s2 ∪
68e5f56cf01f fix coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
488 (lang da2 (δ da2 s2 a) ∪ lang (powA da2) (δs da2 ss a))
68e5f56cf01f fix coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
489 ≈⟨ ≅sym (union-assoc _) ⟩
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
490 (lang da1 (δ da1 s1 a) · lang da2 s2 ∪ lang da2 (δ da2 s2 a)) ∪ lang (powA da2) (δs da2 ss a)
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 ∎ where open EqR (Bis _)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
492
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
493 postulate
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
494 composeA-correct : ∀{i S1 S2} (da1 : DA S1) (da2 : DA S2) s1 s2 →
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
495 lang (composeA da1 s2 da2) (s1 , []) ≅⟨ i ⟩≅ lang da1 s1 · lang da2 s2
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
496
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
497
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
498 open import Data.Maybe
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
499
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
500 acceptingInitial : ∀{S} (s0 : S) (da : DA S) → DA (Maybe S)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
501 ν (acceptingInitial s0 da) (just s) = ν da s
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
502 δ (acceptingInitial s0 da) (just s) a = just (δ da s a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 ν (acceptingInitial s0 da) nothing = true
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
504 δ (acceptingInitial s0 da) nothing a = just (δ da s0 a)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
505
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
506
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
507
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
508 finalToInitial : ∀{S} (da : DA (Maybe S)) → DA (List ∞ (Maybe S))
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
509 ν (finalToInitial da) ss = νs da ss
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 δ (finalToInitial da) ss a =
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
511 let ss′ = δs da ss a
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
512 in if νs da ss then δ da nothing a ∷ ss′ else ss′
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
513
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
514
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
515 starA : ∀{S}(s0 : S)(da : DA S) → DA (List ∞(Maybe S))
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 starA s0 da = finalToInitial (acceptingInitial s0 da)
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
517
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
518
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
519 postulate
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
520 acceptingInitial-just : ∀{i S} (s0 : S) (da : DA S) {s : S} →
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
521 lang (acceptingInitial s0 da) (just s) ≅⟨ i ⟩≅ lang da s
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
522 acceptingInitial-nothing : ∀{i S} (s0 : S) (da : DA S) →
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
523 lang (acceptingInitial s0 da) nothing ≅⟨ i ⟩≅ ε ∪ lang da s0
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
524 starA-lemma : ∀{i S}(da : DA S)(s0 : S)(ss : List ∞ (Maybe S))→
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
525 lang (starA s0 da) ss ≅⟨ i ⟩≅
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 lang (powA (acceptingInitial s0 da)) ss · (lang da s0) *
47
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
527 starA-correct : ∀{i S} (da : DA S) (s0 : S) →
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
528 lang (starA s0 da) (nothing ∷ []) ≅⟨ i ⟩≅ (lang da s0) *
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
529
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
530 record NAutomaton ( Q : Set ) ( Σ : Set )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
531 : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
532 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
533 Nδ : Q → Σ → Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
534 Nstart : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
535 Nend : Q → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
536
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
537 postulate
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
538 exists : { S : Set} → ( S → Bool ) → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
539
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
540 nlang : ∀{i} {S} (nfa : NAutomaton S A ) (s : S → Bool ) → Lang i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
541 Lang.ν (nlang nfa s) = exists ( λ x → (s x ∧ NAutomaton.Nend nfa x ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
542 Lang.δ (nlang nfa s) a = nlang nfa (λ x → s x ∧ (NAutomaton.Nδ nfa x a) x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
543
406
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
544 -- nlang1 : ∀{i} {S} (nfa : NAutomaton S A ) (s : S → Bool ) → Lang i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
545 -- Lang.ν (nlang1 nfa s) = NAutomaton.Nend nfa {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 405
diff changeset
546 -- Lang.δ (nlang1 nfa s) a = nlang1 nfa (λ x → s x ∧ (NAutomaton.Nδ nfa x a) x)
119
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
547
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
548 -- nlang' : ∀{i} {S} (nfa : DA (S → Bool) ) (s : S → Bool ) → Lang i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
549 -- Lang.ν (nlang' nfa s) = DA.ν nfa s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
550 -- Lang.δ (nlang' nfa s) a = nlang' nfa (DA.δ nfa s a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 51
diff changeset
551