annotate automaton-in-agda/src/bijection.agda @ 403:c298981108c1

fix for std-lib 2.0
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 24 Sep 2023 11:32:01 +0900
parents 78e094559ceb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1 {-# OPTIONS --cubical-compatible --safe #-}
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
2
176
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 175
diff changeset
3 module bijection where
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
5
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 open import Level renaming ( zero to Zero ; suc to Suc )
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Data.Nat
142
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
8 open import Data.Maybe
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
9 open import Data.List hiding ([_] ; sum )
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 open import Data.Nat.Properties
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 open import Relation.Nullary
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 open import Data.Empty
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
13 open import Data.Unit using ( tt ; ⊤ )
142
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
14 open import Relation.Binary.Core hiding (_⇔_)
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 open import Relation.Binary.Definitions
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 open import Relation.Binary.PropositionalEquality
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 open import logic
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
19 open import nat
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
264
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 263
diff changeset
21 -- record Bijection {n m : Level} (R : Set n) (S : Set m) : Set (n Level.⊔ m) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 263
diff changeset
22 -- field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 263
diff changeset
23 -- fun← : S → R
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 263
diff changeset
24 -- fun→ : R → S
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
25 -- fiso← : (x : R) → fun← ( fun→ x ) ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
26 -- fiso→ : (x : S ) → fun→ ( fun← x ) ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
27 --
264
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 263
diff changeset
28 -- injection : {n m : Level} (R : Set n) (S : Set m) (f : R → S ) → Set (n Level.⊔ m)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 263
diff changeset
29 -- injection R S f = (x y : R) → f x ≡ f y → x ≡ y
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
30
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
31 open Bijection
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
265
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
33 bi-trans : {n m l : Level} (R : Set n) (S : Set m) (T : Set l) → Bijection R S → Bijection S T → Bijection R T
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
34 bi-trans R S T rs st = record { fun← = λ x → fun← rs ( fun← st x ) ; fun→ = λ x → fun→ st ( fun→ rs x )
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
35 ; fiso← = λ x → trans (cong (λ k → fun← rs k) (fiso← st (fun→ rs x))) ( fiso← rs x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
36 ; fiso→ = λ x → trans (cong (λ k → fun→ st k) (fiso→ rs (fun← st x))) ( fiso→ st x) }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
37
265
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
38 bid : {n : Level} (R : Set n) → Bijection R R
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
39 bid {n} R = record { fun← = λ x → x ; fun→ = λ x → x ; fiso← = λ _ → refl ; fiso→ = λ _ → refl }
265
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
40
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
41 bi-sym : {n m : Level} (R : Set n) (S : Set m) → Bijection R S → Bijection S R
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
42 bi-sym R S eq = record { fun← = fun→ eq ; fun→ = fun← eq ; fiso← = fiso→ eq ; fiso→ = fiso← eq }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
43
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
44 bi-inject← : {n m : Level} {R : Set n} {S : Set m} → (rs : Bijection R S) → {x y : S} → fun← rs x ≡ fun← rs y → x ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
45 bi-inject← rs {x} {y} eq = subst₂ (λ j k → j ≡ k ) (fiso→ rs _) (fiso→ rs _) (cong (fun→ rs) eq)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
46
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
47 bi-inject→ : {n m : Level} {R : Set n} {S : Set m} → (rs : Bijection R S) → {x y : R} → fun→ rs x ≡ fun→ rs y → x ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
48 bi-inject→ rs {x} {y} eq = subst₂ (λ j k → j ≡ k ) (fiso← rs _) (fiso← rs _) (cong (fun← rs) eq)
265
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
49
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
50 open import Relation.Binary.Structures
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
51
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
52 bijIsEquivalence : {n : Level } → IsEquivalence (Bijection {n} {n})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
53 bijIsEquivalence = record { refl = λ {R} → bid R ; sym = λ {R} {S} → bi-sym R S ; trans = λ {R} {S} {T} → bi-trans R S T }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 264
diff changeset
54
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
55 -- ¬ A = A → ⊥
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
56 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
57 -- famous diagnostic function
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
58 --
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
59
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
60 -- 1 1 0 1 0 ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
61 -- 0 1 0 1 0 ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
62 -- 1 0 0 1 0 ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
63 -- 1 1 1 1 0 ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
65 -- 0 0 1 0 1 ... diag
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
66
174
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
67 diag : {S : Set } (b : Bijection ( S → Bool ) S) → S → Bool
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
68 diag b n = not (fun← b n n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
69
174
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
70 diagonal : { S : Set } → ¬ Bijection ( S → Bool ) S
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
71 diagonal {S} b = diagn1 (fun→ b (λ n → diag b n) ) refl where
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
72 diagn1 : (n : S ) → ¬ (fun→ b (λ n → diag b n) ≡ n )
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
73 diagn1 n dn = ¬t=f (diag b n ) ( begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
74 not (diag b n)
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 ≡⟨⟩
334
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 320
diff changeset
76 not (not (fun← b n n))
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 ≡⟨ cong (λ k → not (k n) ) (sym (fiso← b _)) ⟩
164
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 142
diff changeset
78 not (fun← b (fun→ b (diag b)) n)
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 ≡⟨ cong (λ k → not (fun← b k n) ) dn ⟩
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 not (fun← b n n)
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 ≡⟨⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
82 diag b n
141
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 ∎ ) where open ≡-Reasoning
b3f05cd08d24 clean up
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
85 b1 : (b : Bijection ( ℕ → Bool ) ℕ) → ℕ
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
86 b1 b = fun→ b (diag b)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
87
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
88 b-iso : (b : Bijection ( ℕ → Bool ) ℕ) → fun← b (b1 b) ≡ (diag b)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
89 b-iso b = fiso← b _
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
90
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
91 --
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
92 -- ℕ <=> ℕ + 1 (infinite hotel)
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
93 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
94 to1 : {n : Level} {R : Set n} → Bijection ℕ R → Bijection ℕ (⊤ ∨ R )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
95 to1 {n} {R} b = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
96 fun← = to11
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
97 ; fun→ = to12
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
98 ; fiso← = to13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
99 ; fiso→ = to14
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
100 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
101 to11 : ⊤ ∨ R → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
102 to11 (case1 tt) = 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
103 to11 (case2 x) = suc ( fun← b x )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
104 to12 : ℕ → ⊤ ∨ R
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
105 to12 zero = case1 tt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
106 to12 (suc n) = case2 ( fun→ b n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
107 to13 : (x : ℕ) → to11 (to12 x) ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
108 to13 zero = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
109 to13 (suc x) = cong suc (fiso← b x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
110 to14 : (x : ⊤ ∨ R) → to12 (to11 x) ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
111 to14 (case1 x) = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
112 to14 (case2 x) = cong case2 (fiso→ b x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
113
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
114
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
115 open _∧_
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
116
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
117 record NN ( i : ℕ) (nxn→n : ℕ → ℕ → ℕ) : Set where
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
118 field
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
119 j k : ℕ
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
120 k1 : nxn→n j k ≡ i
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
121 nn-unique : {j0 k0 : ℕ } → nxn→n j0 k0 ≡ i → ⟪ j , k ⟫ ≡ ⟪ j0 , k0 ⟫
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
122
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
123 i≤0→i≡0 : {i : ℕ } → i ≤ 0 → i ≡ 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
124 i≤0→i≡0 {0} z≤n = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
125
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
126 ----
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
127 -- (0, 0) (0, 1) (0, 2) ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
128 -- (1, 0) (1, 1) (1, 2) ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
129 -- (2, 0) (2, 1) (2, 2) ....
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
130 -- : : :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
131 -- : : :
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
132 --
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
133
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
134 nxn : Bijection ℕ (ℕ ∧ ℕ)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
135 nxn = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
136 fun← = λ p → nxn→n (proj1 p) (proj2 p)
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
137 ; fun→ = n→nxn
319
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
138 ; fiso← = λ i → NN.k1 (nn i)
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
139 ; fiso→ = λ x → nn-id (proj1 x) (proj2 x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
140 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
141 nxn→n : ℕ → ℕ → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
142 nxn→n zero zero = zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
143 nxn→n zero (suc j) = j + suc (nxn→n zero j)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
144 nxn→n (suc i) zero = suc i + suc (nxn→n i zero)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
145 nxn→n (suc i) (suc j) = suc i + suc j + suc (nxn→n i (suc j))
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
146 nn : ( i : ℕ) → NN i nxn→n
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
147 n→nxn : ℕ → ℕ ∧ ℕ
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
148 n→nxn n = ⟪ NN.j (nn n) , NN.k (nn n) ⟫
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
149 k0 : {i : ℕ } → n→nxn i ≡ ⟪ NN.j (nn i) , NN.k (nn i) ⟫
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
150 k0 {i} = refl
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
151
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
152 nxn→n0 : { j k : ℕ } → nxn→n j k ≡ 0 → ( j ≡ 0 ) ∧ ( k ≡ 0 )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
153 nxn→n0 {zero} {zero} eq = ⟪ refl , refl ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
154 nxn→n0 {zero} {(suc k)} eq = ⊥-elim ( nat-≡< (sym eq) (subst (λ k → 0 < k) (+-comm _ k) (s≤s z≤n)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
155 nxn→n0 {(suc j)} {zero} eq = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
156 nxn→n0 {(suc j)} {(suc k)} eq = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
157
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
158 nid20 : (i : ℕ) → i + (nxn→n 0 i) ≡ nxn→n i 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
159 nid20 zero = refl -- suc (i + (i + suc (nxn→n 0 i))) ≡ suc (i + suc (nxn→n i 0))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
160 nid20 (suc i) = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
161 suc (i + (i + suc (nxn→n 0 i))) ≡⟨ cong (λ k → suc (i + k)) (sym (+-assoc i 1 (nxn→n 0 i))) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
162 suc (i + ((i + 1) + nxn→n 0 i)) ≡⟨ cong (λ k → suc (i + (k + nxn→n 0 i))) (+-comm i 1) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
163 suc (i + suc (i + nxn→n 0 i)) ≡⟨ cong ( λ k → suc (i + suc k)) (nid20 i) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
164 suc (i + suc (nxn→n i 0)) ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
165
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
166 nid4 : {i j : ℕ} → i + 1 + j ≡ i + suc j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
167 nid4 {zero} {j} = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
168 nid4 {suc i} {j} = cong suc (nid4 {i} {j} )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
169 nid5 : {i j k : ℕ} → i + suc (suc j) + suc k ≡ i + suc j + suc (suc k )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
170 nid5 {zero} {j} {k} = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
171 suc (suc j) + suc k ≡⟨ +-assoc 1 (suc j) _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
172 1 + (suc j + suc k) ≡⟨ +-comm 1 _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
173 (suc j + suc k) + 1 ≡⟨ +-assoc (suc j) (suc k) _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
174 suc j + (suc k + 1) ≡⟨ cong (λ k → suc j + k ) (+-comm (suc k) 1) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
175 suc j + suc (suc k) ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
176 nid5 {suc i} {j} {k} = cong suc (nid5 {i} {j} {k} )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
177
320
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 319
diff changeset
178 -- increment in the same stage
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
179 nid2 : (i j : ℕ) → suc (nxn→n i (suc j)) ≡ nxn→n (suc i) j
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
180 nid2 zero zero = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
181 nid2 zero (suc j) = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
182 nid2 (suc i) zero = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
183 suc (nxn→n (suc i) 1) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
184 suc (suc (i + 1 + suc (nxn→n i 1))) ≡⟨ cong (λ k → suc (suc k)) nid4 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
185 suc (suc (i + suc (suc (nxn→n i 1)))) ≡⟨ cong (λ k → suc (suc (i + suc (suc k)))) (nid3 i) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
186 suc (suc (i + suc (suc (i + suc (nxn→n i 0))))) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
187 nxn→n (suc (suc i)) zero ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
188 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
189 nid3 : (i : ℕ) → nxn→n i 1 ≡ i + suc (nxn→n i 0)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
190 nid3 zero = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
191 nid3 (suc i) = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
192 suc (i + 1 + suc (nxn→n i 1)) ≡⟨ cong suc nid4 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
193 suc (i + suc (suc (nxn→n i 1))) ≡⟨ cong (λ k → suc (i + suc (suc k))) (nid3 i) ⟩
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
194 suc (i + suc (suc (i + suc (nxn→n i 0)))) ∎
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
195 nid2 (suc i) (suc j) = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
196 suc (nxn→n (suc i) (suc (suc j))) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
197 suc (suc (i + suc (suc j) + suc (nxn→n i (suc (suc j))))) ≡⟨ cong (λ k → suc (suc (i + suc (suc j) + k))) (nid2 i (suc j)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
198 suc (suc (i + suc (suc j) + suc (i + suc j + suc (nxn→n i (suc j))))) ≡⟨ cong ( λ k → suc (suc k)) nid5 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
199 suc (suc (i + suc j + suc (suc (i + suc j + suc (nxn→n i (suc j)))))) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
200 nxn→n (suc (suc i)) (suc j) ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
201 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
202
320
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 319
diff changeset
203 -- increment the stage
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
204 nid00 : (i : ℕ) → suc (nxn→n i 0) ≡ nxn→n 0 (suc i)
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
205 nid00 zero = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
206 nid00 (suc i) = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
207 suc (suc (i + suc (nxn→n i 0))) ≡⟨ cong (λ k → suc (suc (i + k ))) (nid00 i) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
208 suc (suc (i + (nxn→n 0 (suc i)))) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
209 suc (suc (i + (i + suc (nxn→n 0 i)))) ≡⟨ cong suc (sym ( +-assoc 1 i (i + suc (nxn→n 0 i)))) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
210 suc ((1 + i) + (i + suc (nxn→n 0 i))) ≡⟨ cong (λ k → suc (k + (i + suc (nxn→n 0 i)))) (+-comm 1 i) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
211 suc ((i + 1) + (i + suc (nxn→n 0 i))) ≡⟨ cong suc (+-assoc i 1 (i + suc (nxn→n 0 i))) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
212 suc (i + suc (i + suc (nxn→n 0 i))) ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
213
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
214 -----
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
215 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
216 -- create the invariant NN for all n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
217 --
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
218 nn zero = record { j = 0 ; k = 0 ; k1 = refl
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
219 ; nn-unique = λ {j0} {k0} eq → cong₂ (λ x y → ⟪ x , y ⟫) (sym (proj1 (nxn→n0 eq))) (sym (proj2 (nxn→n0 {j0} {k0} eq))) }
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
220 nn (suc i) with NN.k (nn i) in eq
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
221 ... | zero = record { k = suc (sum ) ; j = 0
319
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 266
diff changeset
222 ; k1 = nn02 ; nn-unique = nn04 } where
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
223 ---
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
224 --- increment the stage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
225 ---
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
226 sum = NN.j (nn i) + NN.k (nn i)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
227 stage = minus i (NN.j (nn i))
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
228 j = NN.j (nn i)
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
229 NNnn : NN.j (nn i) + NN.k (nn i) ≡ sum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
230 NNnn = sym refl
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
231 nn02 : nxn→n 0 (suc sum) ≡ suc i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
232 nn02 = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
233 sum + suc (nxn→n 0 sum) ≡⟨ sym (+-assoc sum 1 (nxn→n 0 sum)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
234 (sum + 1) + nxn→n 0 sum ≡⟨ cong (λ k → k + nxn→n 0 sum ) (+-comm sum 1 )⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
235 suc (sum + nxn→n 0 sum) ≡⟨ cong suc (nid20 sum ) ⟩
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
236 suc (nxn→n sum 0) ≡⟨ cong (λ k → suc (nxn→n k 0 )) (sym (NNnn )) ⟩
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
237 suc (nxn→n (NN.j (nn i) + (NN.k (nn i)) ) 0) ≡⟨ cong₂ (λ j k → suc (nxn→n (NN.j (nn i) + j) k )) eq (sym eq) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
238 suc (nxn→n (NN.j (nn i) + 0 ) (NN.k (nn i))) ≡⟨ cong (λ k → suc ( nxn→n k (NN.k (nn i)))) (+-comm (NN.j (nn i)) 0) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
239 suc (nxn→n (NN.j (nn i)) (NN.k (nn i))) ≡⟨ cong suc (NN.k1 (nn i) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
240 suc i ∎ where open ≡-Reasoning
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
241 nn04 : {j0 k0 : ℕ} → nxn→n j0 k0 ≡ suc i → ⟪ 0 , suc (sum ) ⟫ ≡ ⟪ j0 , k0 ⟫
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
242 nn04 {zero} {suc k0} eq1 = cong (λ k → ⟪ 0 , k ⟫ ) (cong suc (sym nn08)) where -- eq : nxn→n zero (suc k0) ≡ suc i --
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
243 nn07 : nxn→n k0 0 ≡ i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
244 nn07 = cong pred ( begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
245 suc ( nxn→n k0 0 ) ≡⟨ nid00 k0 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
246 nxn→n 0 (suc k0 ) ≡⟨ eq1 ⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
247 suc i ∎ ) where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
248 nn08 : k0 ≡ sum
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
249 nn08 = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
250 k0 ≡⟨ cong proj1 (sym (NN.nn-unique (nn i) nn07)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
251 NN.j (nn i) ≡⟨ +-comm 0 _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
252 NN.j (nn i) + 0 ≡⟨ cong (λ k → NN.j (nn i) + k) (sym eq) ⟩
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
253 NN.j (nn i) + NN.k (nn i) ≡⟨ NNnn ⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
254 sum ∎ where open ≡-Reasoning
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
255 nn04 {suc j0} {k0} eq1 = ⊥-elim ( nat-≡< (cong proj2 (nn06 nn05)) (subst (λ k → k < suc k0) (sym eq) (s≤s z≤n))) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
256 nn05 : nxn→n j0 (suc k0) ≡ i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
257 nn05 = begin
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
258 nxn→n j0 (suc k0) ≡⟨ cong pred ( begin
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
259 suc (nxn→n j0 (suc k0)) ≡⟨ nid2 j0 k0 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
260 nxn→n (suc j0) k0 ≡⟨ eq1 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
261 suc i ∎ ) ⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
262 i ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
263 nn06 : nxn→n j0 (suc k0) ≡ i → ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ j0 , suc k0 ⟫
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
264 nn06 = NN.nn-unique (nn i)
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
265 ... | suc k = record { k = k ; j = suc (NN.j (nn i)) ; k1 = nn11 ; nn-unique = nn13 } where
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
266 ---
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
267 --- increment in a stage
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
268 ---
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
269 sum = NN.j (nn i) + NN.k (nn i)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
270 stage = minus i (NN.j (nn i))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
271 j = NN.j (nn i)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
272 NNnn : NN.j (nn i) + NN.k (nn i) ≡ sum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
273 NNnn = sym refl
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
274 nn10 : suc (NN.j (nn i)) + k ≡ sum
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
275 nn10 = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
276 suc (NN.j (nn i)) + k ≡⟨ cong (λ x → x + k) (+-comm 1 _) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
277 (NN.j (nn i) + 1) + k ≡⟨ +-assoc (NN.j (nn i)) 1 k ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
278 NN.j (nn i) + suc k ≡⟨ cong (λ k → NN.j (nn i) + k) (sym eq) ⟩
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
279 NN.j (nn i) + NN.k (nn i) ≡⟨ NNnn ⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
280 sum ∎ where open ≡-Reasoning
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
281 nn11 : nxn→n (suc (NN.j (nn i))) k ≡ suc i -- nxn→n ( NN.j (nn i)) (NN.k (nn i) ≡ i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
282 nn11 = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
283 nxn→n (suc (NN.j (nn i))) k ≡⟨ sym (nid2 (NN.j (nn i)) k) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
284 suc (nxn→n (NN.j (nn i)) (suc k)) ≡⟨ cong (λ k → suc (nxn→n (NN.j (nn i)) k)) (sym eq) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
285 suc (nxn→n ( NN.j (nn i)) (NN.k (nn i))) ≡⟨ cong suc (NN.k1 (nn i)) ⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
286 suc i ∎ where open ≡-Reasoning
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
287 nn18 : zero < NN.k (nn i)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
288 nn18 = subst (λ k → 0 < k ) ( begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
289 suc k ≡⟨ sym eq ⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
290 NN.k (nn i) ∎ ) (s≤s z≤n ) where open ≡-Reasoning
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
291 nn13 : {j0 k0 : ℕ} → nxn→n j0 k0 ≡ suc i → ⟪ suc (NN.j (nn i)) , k ⟫ ≡ ⟪ j0 , k0 ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
292 nn13 {zero} {suc k0} eq1 = ⊥-elim ( nat-≡< (sym (cong proj2 nn17)) nn18 ) where -- (nxn→n zero (suc k0)) ≡ suc i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
293 nn16 : nxn→n k0 zero ≡ i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
294 nn16 = cong pred ( subst (λ k → k ≡ suc i) (sym ( nid00 k0 )) eq1 )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
295 nn17 : ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ k0 , zero ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
296 nn17 = NN.nn-unique (nn i) nn16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
297 nn13 {suc j0} {k0} eq1 = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
298 ⟪ suc (NN.j (nn i)) , pred (suc k) ⟫ ≡⟨ cong (λ k → ⟪ suc (NN.j (nn i)) , pred k ⟫ ) (sym eq) ⟩
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
299 ⟪ suc (NN.j (nn i)) , pred (NN.k (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ suc (proj1 k) , pred (proj2 k) ⟫) ( begin
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
300 ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡⟨ nn15 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
301 ⟪ j0 , suc k0 ⟫ ∎ ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
302 ⟪ suc j0 , k0 ⟫ ∎ where -- nxn→n (suc j0) k0 ≡ suc i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
303 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
304 nn14 : nxn→n j0 (suc k0) ≡ i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
305 nn14 = cong pred ( subst (λ k → k ≡ suc i) (sym ( nid2 j0 k0 )) eq1 )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
306 nn15 : ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ j0 , suc k0 ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
307 nn15 = NN.nn-unique (nn i) nn14
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
308
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
309 nn-id : (j k : ℕ) → n→nxn (nxn→n j k) ≡ ⟪ j , k ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
310 nn-id j k = begin
266
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 265
diff changeset
311 n→nxn (nxn→n j k) ≡⟨ refl ⟩
256
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
312 ⟪ NN.j (nn (nxn→n j k)) , NN.k (nn (nxn→n j k)) ⟫ ≡⟨ NN.nn-unique (nn (nxn→n j k)) refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
313 ⟪ j , k ⟫ ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
314
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
315
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
316 -- [] 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
317 -- 0 → 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
318 -- 1 → 2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
319 -- 01 → 3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
320 -- 11 → 4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
321 -- ...
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
322
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
323 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
324 -- binary invariant
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
325 --
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
326 record LB (n : ℕ) (lton : List Bool → ℕ ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
327 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
328 nlist : List Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
329 isBin : lton nlist ≡ n
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
330 isUnique : (x : List Bool) → lton x ≡ n → nlist ≡ x
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
331
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
332 lb+1 : List Bool → List Bool
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
333 lb+1 [] = false ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
334 lb+1 (false ∷ t) = true ∷ t
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
335 lb+1 (true ∷ t) = false ∷ lb+1 t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
336
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
337 lb-1 : List Bool → List Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
338 lb-1 [] = []
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
339 lb-1 (true ∷ t) = false ∷ t
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
340 lb-1 (false ∷ t) with lb-1 t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
341 ... | [] = true ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
342 ... | x ∷ t1 = true ∷ x ∷ t1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
343
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
344 LBℕ : Bijection ℕ ( List Bool )
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
345 LBℕ = record {
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
346 fun← = λ x → lton x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
347 ; fun→ = λ n → LB.nlist (lb n)
258
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
348 ; fiso← = λ n → LB.isBin (lb n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
349 ; fiso→ = λ x → LB.isUnique (lb (lton x)) x refl
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
350 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
351 lton1 : List Bool → ℕ
259
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
352 lton1 [] = 1
172
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
353 lton1 (true ∷ t) = suc (lton1 t + lton1 t)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
354 lton1 (false ∷ t) = lton1 t + lton1 t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 164
diff changeset
355 lton : List Bool → ℕ
259
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
356 lton x = pred (lton1 x)
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
357
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
358 lton1>0 : (x : List Bool ) → 0 < lton1 x
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
359 lton1>0 [] = a<sa
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
360 lton1>0 (true ∷ x₁) = 0<s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
361 lton1>0 (false ∷ t) = ≤-trans (lton1>0 t) x≤x+y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
362
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
363 2lton1>0 : (t : List Bool ) → 0 < lton1 t + lton1 t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
364 2lton1>0 t = ≤-trans (lton1>0 t) x≤x+y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
365
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
366 lb=3 : {x y : ℕ} → 0 < x → 0 < y → 1 ≤ pred (x + y)
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
367 lb=3 {suc x} {suc y} (s≤s 0<x) (s≤s 0<y) = subst (λ k → 1 ≤ k ) (+-comm (suc y) _ ) (s≤s z≤n)
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
368
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
369 lton-cons>0 : {x : Bool} {y : List Bool } → 0 < lton (x ∷ y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
370 lton-cons>0 {true} {[]} = refl-≤s
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
371 lton-cons>0 {true} {x ∷ y} = ≤-trans ( lb=3 (lton1>0 (x ∷ y)) (lton1>0 (x ∷ y))) px≤x
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
372 lton-cons>0 {false} {[]} = refl-≤
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
373 lton-cons>0 {false} {x ∷ y} = lb=3 (lton1>0 (x ∷ y)) (lton1>0 (x ∷ y))
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
374
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
375 lb=0 : {x y : ℕ } → pred x < pred y → suc (x + x ∸ 1) < suc (y + y ∸ 1)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
376 lb=0 {0} {suc y} lt = s≤s (subst (λ k → 0 < k ) (+-comm (suc y) y ) 0<s)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
377 lb=0 {suc x} {suc y} lt = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
378 suc (suc ((suc x + suc x) ∸ 1)) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
379 suc (suc x) + suc x ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
380 suc (suc x + suc x) ≤⟨ <-plus (s≤s lt) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
381 suc y + suc x <⟨ <-plus-0 {suc x} {suc y} {suc y} (s≤s lt) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
382 suc y + suc y ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
383 suc ((suc y + suc y) ∸ 1) ∎ where open ≤-Reasoning
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
384 lb=2 : {x y : ℕ } → pred x < pred y → suc (x + x ) < suc (y + y )
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
385 lb=2 {zero} {suc y} lt = s≤s 0<s
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
386 lb=2 {suc x} {suc y} lt = s≤s (lb=0 {suc x} {suc y} lt)
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
387 lb=1 : {x y : List Bool} {z : Bool} → lton (z ∷ x) ≡ lton (z ∷ y) → lton x ≡ lton y
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
388 lb=1 {x} {y} {true} eq with <-cmp (lton x) (lton y)
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
389 ... | tri< a ¬b ¬c = ⊥-elim (nat-≡< (cong suc eq) (lb=2 {lton1 x} {lton1 y} a))
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
390 ... | tri≈ ¬a b ¬c = b
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
391 ... | tri> ¬a ¬b c = ⊥-elim (nat-≡< (cong suc (sym eq)) (lb=2 {lton1 y} {lton1 x} c))
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
392 lb=1 {x} {y} {false} eq with <-cmp (lton x) (lton y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
393 ... | tri< a ¬b ¬c = ⊥-elim (nat-≡< (cong suc eq) (lb=0 {lton1 x} {lton1 y} a))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
394 ... | tri≈ ¬a b ¬c = b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
395 ... | tri> ¬a ¬b c = ⊥-elim (nat-≡< (cong suc (sym eq)) (lb=0 {lton1 y} {lton1 x} c))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
396
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
397 ---
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
398 --- lton is unique in a head
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
399 ---
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
400 lb-tf : {x y : List Bool } → ¬ (lton (true ∷ x) ≡ lton (false ∷ y))
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
401 lb-tf {x} {y} eq with <-cmp (lton1 x) (lton1 y)
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
402 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≡< eq (lb=01 a)) where
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
403 lb=01 : {x y : ℕ } → x < y → x + x < (y + y ∸ 1)
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
404 lb=01 {x} {y} x<y = begin
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
405 suc (x + x) ≡⟨ refl ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
406 suc x + x ≤⟨ ≤-plus x<y ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
407 y + x ≡⟨ refl ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
408 pred (suc y + x) ≡⟨ cong (λ k → pred ( k + x)) (+-comm 1 y) ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
409 pred ((y + 1) + x ) ≡⟨ cong pred (+-assoc y 1 x) ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
410 pred (y + suc x) ≤⟨ px≤py (≤-plus-0 {suc x} {y} {y} x<y) ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
411 (y + y) ∸ 1 ∎ where open ≤-Reasoning
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
412 ... | tri> ¬a ¬b c = ⊥-elim ( nat-≡< (sym eq) (lb=02 c) ) where
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
413 lb=02 : {x y : ℕ } → x < y → x + x ∸ 1 < y + y
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
414 lb=02 {0} {y} lt = ≤-trans lt x≤x+y
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
415 lb=02 {suc x} {y} lt = begin
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
416 suc ( suc x + suc x ∸ 1 ) ≡⟨ refl ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
417 suc x + suc x ≤⟨ ≤-plus {suc x} (<to≤ lt) ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
418 y + suc x ≤⟨ ≤-plus-0 (<to≤ lt) ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
419 y + y ∎ where open ≤-Reasoning
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
420 ... | tri≈ ¬a b ¬c = ⊥-elim ( nat-≡< (sym eq) ( begin
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
421 suc (lton1 y + lton1 y ∸ 1) ≡⟨ sucprd ( 2lton1>0 y) ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
422 lton1 y + lton1 y ≡⟨ cong (λ k → k + k ) (sym b) ⟩
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
423 lton1 x + lton1 x ∎ )) where open ≤-Reasoning
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
424
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
425 ---
320
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 319
diff changeset
426 --- lton injection
263
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 262
diff changeset
427 ---
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
428 lb=b : (x y : List Bool) → lton x ≡ lton y → x ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
429 lb=b [] [] eq = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
430 lb=b [] (x ∷ y) eq = ⊥-elim ( nat-≡< eq (lton-cons>0 {x} {y} ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
431 lb=b (x ∷ y) [] eq = ⊥-elim ( nat-≡< (sym eq) (lton-cons>0 {x} {y} ))
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
432 lb=b (true ∷ x) (false ∷ y) eq = ⊥-elim ( lb-tf {x} {y} eq )
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
433 lb=b (false ∷ x) (true ∷ y) eq = ⊥-elim ( lb-tf {y} {x} (sym eq) )
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
434 lb=b (true ∷ x) (true ∷ y) eq = cong (λ k → true ∷ k ) (lb=b x y (lb=1 {x} {y} {true} eq))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
435 lb=b (false ∷ x) (false ∷ y) eq = cong (λ k → false ∷ k ) (lb=b x y (lb=1 {x} {y} {false} eq))
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
436
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
437 lb : (n : ℕ) → LB n lton
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
438 lb zero = record { nlist = [] ; isBin = refl ; isUnique = lb05 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
439 lb05 : (x : List Bool) → lton x ≡ zero → [] ≡ x
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
440 lb05 x eq = lb=b [] x (sym eq)
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
441 lb (suc n) with LB.nlist (lb n) in eq
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
442 ... | [] = record { nlist = false ∷ [] ; isUnique = lb06 ; isBin = lb10 } where
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
443 open ≡-Reasoning
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
444 lb10 : lton1 (false ∷ []) ∸ 1 ≡ suc n
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
445 lb10 = begin
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
446 lton (false ∷ []) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
447 suc 0 ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
448 suc (lton []) ≡⟨ cong (λ k → suc (lton k)) (sym eq) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
449 suc (lton (LB.nlist (lb n))) ≡⟨ cong suc (LB.isBin (lb n) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
450 suc n ∎
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
451 lb06 : (x : List Bool) → pred (lton1 x ) ≡ suc n → false ∷ [] ≡ x
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
452 lb06 x eq1 = lb=b (false ∷ []) x (trans lb10 (sym eq1)) -- lton (false ∷ []) ≡ lton x
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
453 ... | false ∷ t = record { nlist = true ∷ t ; isBin = lb01 ; isUnique = lb09 } where
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
454 lb01 : lton (true ∷ t) ≡ suc n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
455 lb01 = begin
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
456 lton (true ∷ t) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
457 lton1 t + lton1 t ≡⟨ sym ( sucprd (2lton1>0 t) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
458 suc (pred (lton1 t + lton1 t )) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
459 suc (lton (false ∷ t)) ≡⟨ cong (λ k → suc (lton k )) (sym eq) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
460 suc (lton (LB.nlist (lb n))) ≡⟨ cong suc (LB.isBin (lb n)) ⟩
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
461 suc n ∎ where open ≡-Reasoning
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
462 lb09 : (x : List Bool) → lton1 x ∸ 1 ≡ suc n → true ∷ t ≡ x
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
463 lb09 x eq1 = lb=b (true ∷ t) x (trans lb01 (sym eq1) ) -- lton (true ∷ t) ≡ lton x
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
464 ... | true ∷ t = record { nlist = lb+1 (true ∷ t) ; isBin = lb02 (true ∷ t) lb03 ; isUnique = lb07 } where
258
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
465 lb03 : lton (true ∷ t) ≡ n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
466 lb03 = begin
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
467 lton (true ∷ t) ≡⟨ cong (λ k → lton k ) (sym eq ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
468 lton (LB.nlist (lb n)) ≡⟨ LB.isBin (lb n) ⟩
258
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
469 n ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
470
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
471 add11 : (x1 : ℕ ) → suc x1 + suc x1 ≡ suc (suc (x1 + x1))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
472 add11 zero = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
473 add11 (suc x) = cong (λ k → suc (suc k)) (trans (+-comm x _) (cong suc (+-comm _ x)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 257
diff changeset
474
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
475 lb04 : (t : List Bool) → suc (lton1 t) ≡ lton1 (lb+1 t)
259
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
476 lb04 [] = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
477 lb04 (false ∷ t) = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
478 lb04 (true ∷ []) = refl
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
479 lb04 (true ∷ t0 @ (_ ∷ _)) = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
480 suc (suc (lton1 t0 + lton1 t0)) ≡⟨ sym (add11 (lton1 t0)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
481 suc (lton1 t0) + suc (lton1 t0) ≡⟨ cong (λ k → k + k ) (lb04 t0 ) ⟩
259
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
482 lton1 (lb+1 t0) + lton1 (lb+1 t0) ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
483 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
484
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
485 lb02 : (t : List Bool) → lton t ≡ n → lton (lb+1 t) ≡ suc n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 258
diff changeset
486 lb02 [] refl = refl
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
487 lb02 (t @ (_ ∷ _)) eq1 = begin
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
488 lton (lb+1 t) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
489 pred (lton1 (lb+1 t)) ≡⟨ cong pred (sym (lb04 t)) ⟩
261
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 260
diff changeset
490 pred (suc (lton1 t)) ≡⟨ sym (sucprd (lton1>0 t)) ⟩
260
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
491 suc (pred (lton1 t)) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
492 suc (lton t) ≡⟨ cong suc eq1 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 259
diff changeset
493 suc n ∎ where open ≡-Reasoning
257
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 256
diff changeset
494
262
cb13c38103b1 LBℕ : Bijection ℕ ( List Bool ) done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 261
diff changeset
495 lb07 : (x : List Bool) → pred (lton1 x ) ≡ suc n → lb+1 (true ∷ t) ≡ x
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
496 lb07 x eq1 = lb=b (lb+1 (true ∷ t)) x (trans ( lb02 (true ∷ t) lb03 ) (sym eq1))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
497
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
498 -- Bernstein is non constructive, so we cannot use this without some assumption
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
499 -- but in case of ℕ, we can construct it directly.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
500
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
501 open import Data.List hiding ([_])
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
502 open import Data.List.Relation.Unary.Any
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
503
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
504 record InjectiveF (A B : Set) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
505 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
506 f : A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
507 inject : {x y : A} → f x ≡ f y → x ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
508
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
509 record Is (A C : Set) (f : A → C) (c : C) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
510 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
511 a : A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
512 fa=c : f a ≡ c
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
513
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
514 Countable-Bernstein : (A B C : Set) → Bijection A ℕ → Bijection C ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
515 → (fi : InjectiveF A B ) → (gi : InjectiveF B C )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
516 → (is-A : (c : C ) → Dec (Is A C (λ x → (InjectiveF.f gi (InjectiveF.f fi x))) c ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
517 → (is-B : (c : C ) → Dec (Is B C (InjectiveF.f gi) c) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
518 → Bijection B ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
519 Countable-Bernstein A B C an cn fi gi is-A is-B = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
520 fun→ = λ x → bton x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
521 ; fun← = λ n → ntob n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
522 ; fiso→ = biso
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
523 ; fiso← = biso1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
524 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
525 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
526 -- an f g cn
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
527 -- ℕ ↔ A → B → C ↔ ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
528 -- B = Image A f ∪ (B \ Image A f )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
529 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
530 open Bijection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
531 f = InjectiveF.f fi
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
532 g = InjectiveF.f gi
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
533
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
534 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
535 -- count number of valid A and B in C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
536 -- the count of B is the numner of B in Bijection B ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
537 -- if we have a , number a of A is larger than the numner of B C, so we have the inverse
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
538 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
539
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
540 count-B : ℕ → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
541 count-B zero with is-B (fun← cn zero)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
542 ... | yes isb = 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
543 ... | no nisb = 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
544 count-B (suc n) with is-B (fun← cn (suc n))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
545 ... | yes isb = suc (count-B n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
546 ... | no nisb = count-B n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
547
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
548 count-A : ℕ → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
549 count-A zero with is-A (fun← cn zero)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
550 ... | yes isb = 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
551 ... | no nisb = 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
552 count-A (suc n) with is-A (fun← cn (suc n))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
553 ... | yes isb = suc (count-A n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
554 ... | no nisb = count-A n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
555
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
556 ¬isA∧isB : (y : C ) → Is A C (λ x → g ( f x)) y → ¬ Is B C g y → ⊥
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
557 ¬isA∧isB y isa nisb = ⊥-elim ( nisb record { a = f (Is.a isa) ; fa=c = lem } ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
558 lem : g (f (Is.a isa)) ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
559 lem = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
560 g (f (Is.a isa)) ≡⟨ Is.fa=c isa ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
561 y ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
562 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
563
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
564 ca≤cb0 : (n : ℕ) → count-A n ≤ count-B n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
565 ca≤cb0 zero with is-A (fun← cn zero) | is-B (fun← cn zero)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
566 ... | yes isA | yes isB = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
567 ... | yes isA | no nisB = ⊥-elim ( ¬isA∧isB _ isA nisB )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
568 ... | no nisA | yes isB = px≤x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
569 ... | no nisA | no nisB = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
570 ca≤cb0 (suc n) with is-A (fun← cn (suc n)) | is-B (fun← cn (suc n))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
571 ... | yes isA | yes isB = s≤s (ca≤cb0 n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
572 ... | yes isA | no nisB = ⊥-elim ( ¬isA∧isB _ isA nisB )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
573 ... | no nisA | yes isB = ≤-trans (ca≤cb0 n) px≤x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
574 ... | no nisA | no nisB = ca≤cb0 n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
575
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
576 -- (c n) is
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
577 -- fun→ c, where c contains all "a" less than n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
578 -- (i n : ℕ) → i < suc n → fun→ cn (g (f (fun← an i))) < suc (c n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
579 c : (n : ℕ) → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
580 c zero = fun→ cn (g (f (fun← an zero)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
581 c (suc n) = max (fun→ cn (g (f (fun← an (suc n))))) (c n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
582
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
583 c< : (i : ℕ) → fun→ cn (g (f (fun← an i))) ≤ c i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
584 c< zero = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
585 c< (suc i) = x≤max _ _
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
586
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
587 c-mono1 : (i : ℕ) → c i ≤ c (suc i)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
588 c-mono1 i = y≤max _ _
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
589 c-mono : (i j : ℕ ) → i ≤ j → c i ≤ c j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
590 c-mono i j i≤j with ≤-∨ i≤j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
591 ... | case1 refl = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
592 c-mono zero (suc j) z≤n | case2 lt = ≤-trans (c-mono zero j z≤n ) (c-mono1 j)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
593 c-mono (suc i) (suc j) (s≤s i≤j) | case2 (s≤s lt) = ≤-trans (c-mono (suc i) j lt ) (c-mono1 j)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
594
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
595 inject-cgf : {i j : ℕ} → fun→ cn (g (f (fun← an i))) ≡ fun→ cn (g (f (fun← an j))) → i ≡ j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
596 inject-cgf {i} {j} eq = bi-inject← an (InjectiveF.inject fi (InjectiveF.inject gi ( bi-inject→ cn eq )))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
597
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
598 ani : (i : ℕ) → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
599 ani i = fun→ cn (g (f (fun← an i)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
600
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
601 ncfi = λ n → (fun→ cn (g (f (fun← an n) )))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
602 cfi = λ n → (g (f (fun← an n) ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
603
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
604 clist : (n : ℕ) → List C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
605 clist 0 = fun← cn 0 ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
606 clist (suc n) = fun← cn (suc n) ∷ clist n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
607
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
608 clist-more : {i j : ℕ} → i ≤ j → {c : C} → Any (_≡_ c) (clist i) → Any (_≡_ c) (clist j)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
609 clist-more {zero} {zero} z≤n a = a
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
610 clist-more {zero} {suc n} i≤n a = there (clist-more {zero} {n} z≤n a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
611 clist-more {suc i} {suc n} (s≤s le) {c} (there a) = there (clist-more {i} {n} le a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
612 clist-more {suc i} {suc n} (s≤s le) {c} (here px) with ≤-∨ le
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
613 ... | case1 refl = here px
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
614 ... | case2 lt = there (clist-more {suc i} {n} lt {c} (here px) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
615
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
616 clist-any : (n i : ℕ) → i ≤ n → Any (_≡_ (g (f (fun← an i)))) (clist (c n))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
617 clist-any n i i≤n = clist-more (c-mono _ _ i≤n) (lem00 (c i) (c< i)) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
618 lem00 : (j : ℕ ) → fun→ cn (g (f (fun← an i))) ≤ j → Any (_≡_ (g (f (fun← an i)))) (clist j)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
619 lem00 0 f≤j with ≤-∨ f≤j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
620 ... | case1 eq = here ( trans (sym (fiso← cn _)) ( cong (fun← cn) eq ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
621 ... | case2 le = ⊥-elim (nat-≤> z≤n le )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
622 lem00 (suc j) f≤j with ≤-∨ f≤j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
623 ... | case1 eq = here ( trans (sym (fiso← cn _)) ( cong (fun← cn) eq ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
624 ... | case2 (s≤s le) = there (lem00 j le)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
625
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
626 ca-list : List C → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
627 ca-list [] = 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
628 ca-list (h ∷ t) with is-A h
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
629 ... | yes _ = suc (ca-list t)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
630 ... | no _ = ca-list t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
631
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
632 ca-list=count-A : (n : ℕ) → ca-list (clist n) ≡ count-A n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
633 ca-list=count-A n = lem02 n (clist n) refl where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
634 lem02 : (n : ℕ) → (cl : List C) → cl ≡ clist n → ca-list cl ≡ count-A n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
635 lem02 zero [] ()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
636 lem02 zero (h ∷ t) refl with is-A (fun← cn zero)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
637 ... | yes _ = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
638 ... | no _ = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
639 lem02 (suc n) (h ∷ t) refl with is-A (fun← cn (suc n))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
640 ... | yes _ = cong suc (lem02 n t refl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
641 ... | no _ = lem02 n t refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
642
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
643 -- remove (ani i) from clist (c n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
644 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
645 a-list : (i : ℕ) → (cl : List C) → Any (_≡_ (g (f (fun← an i)))) cl → List C
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
646 a-list i (_ ∷ t) (here px) = t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
647 a-list i (h ∷ t) (there a) = h ∷ ( a-list i t a )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
648
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
649 -- count of a in a-list is one step reduced
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
650 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
651 a-list-ca : (i : ℕ) → (cl : List C) → (a : Any (_≡_ (g (f (fun← an i)))) cl )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
652 → suc (ca-list (a-list i cl a)) ≡ ca-list cl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
653 a-list-ca i cl a = lem03 i cl _ a refl where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
654 lem03 : (i : ℕ) → (cl cal : List C) → (a : Any (_≡_ (g (f (fun← an i)))) cl ) → cal ≡ (a-list i cl a) → suc (ca-list cal) ≡ ca-list cl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
655 lem03 i (h ∷ t) (h1 ∷ t1) (here px) refl with is-A h
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
656 ... | yes _ = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
657 ... | no nisa = ⊥-elim ( nisa record { a = _ ; fa=c = px } )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
658 lem03 i (h ∷ t) (h ∷ t1) (there ah) refl with is-A h
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
659 ... | yes y = cong suc (lem03 i t t1 ah refl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
660 ... | no _ = lem03 i t t1 ah refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
661 lem03 i (x ∷ []) [] (here px) refl with is-A x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
662 ... | yes y = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
663 ... | no nisa = ⊥-elim ( nisa record { a = _ ; fa=c = px } )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
664
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
665 -- reduced list still have all ani j < i
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
666 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
667 a-list-any : (i : ℕ) → (cl : List C) → (a : Any (_≡_ (g (f (fun← an i)))) cl )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
668 → (j : ℕ) → j < i → Any (_≡_ (g (f (fun← an j)))) cl → Any (_≡_ (g (f (fun← an j)))) (a-list i cl a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
669 a-list-any i cl a j j<i b = lem03 i cl _ a refl j j<i b where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
670 lem03 : (i : ℕ) → (cl cal : List C) → (a : Any (_≡_ (g (f (fun← an i)))) cl )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
671 → cal ≡ (a-list i cl a)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
672 → (j : ℕ) → j < i → Any (_≡_ (g (f (fun← an j)))) cl → Any (_≡_ (g (f (fun← an j)))) cal
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
673 lem03 i (h ∷ t) cal (here px) eq j j<i (here px₁) = ⊥-elim ( nat-≡<
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
674 ( bi-inject← an (InjectiveF.inject fi (InjectiveF.inject gi (trans px₁ (sym px))))) j<i )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
675 lem03 i (h ∷ t) cal (here px) eq j j<i (there b) = subst (λ k → Any (_≡_ (g (f (fun← an j)))) k) (sym eq) b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
676 lem03 i (h ∷ t) cal (there a) eq j j<i (here px) = subst (λ k → Any (_≡_ (g (f (fun← an j)))) k) (sym eq) (here px)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
677 lem03 i (h ∷ t) (h1 ∷ cal) (there a) refl j j<i (there b) = there (lem03 i t cal a refl j j<i b)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
678
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
679 any-cl : (i : ℕ) → (cl : List C) → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
680 any-cl i cl = (j : ℕ) → j ≤ i → Any (_≡_ (g (f (fun← an j)))) cl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
681
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
682 n<ca-list : (n : ℕ) → n < ca-list (clist (c n))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
683 n<ca-list n = lem30 n (clist (c n)) ≤-refl (λ j le → clist-any n j le ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
684 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
685 -- we have ANY i on i ≤ n, so we can remove n element from clist (c n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
686 -- induction on n is no good, because (ani (suc n)) may happen in clist (c n)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
687 -- so we cannot recurse on n<ca-list itself.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
688 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
689
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
690 del : (i : ℕ) → (cl : List C) → any-cl i cl → List C -- del 0 contains ani 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
691 del i cl a = a-list i cl (a i ≤-refl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
692 del-any : (i : ℕ) → (cl : List C) → (a : any-cl (suc i) cl) → any-cl i (del (suc i) cl a )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
693 del-any i cl a j le = lem41 cl (del (suc i) cl a ) (a (suc i) ≤-refl ) (a j (≤-trans le a≤sa) ) refl where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
694 lem41 : (cl dl : List C)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
695 → (ai : Any (_≡_ (g (f (fun← an (suc i))))) cl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
696 → (aj : Any (_≡_ (g (f (fun← an j)))) cl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
697 → dl ≡ a-list (suc i) cl ai → Any (_≡_ (g (f (fun← an j)))) dl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
698 lem41 (h ∷ t) y (here px) (here px₁) eq = ⊥-elim ( nat-≡<
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
699 ( bi-inject← an (InjectiveF.inject fi (InjectiveF.inject gi (trans px₁ (sym px))))) (x≤y→x<sy le) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
700 lem41 (h ∷ t) y (here px) (there b0) eq = subst (λ k → Any (_≡_ (g (f (fun← an j)))) k) (sym eq) b0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
701 lem41 (h ∷ t) y (there a0) (here px) refl = here px
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
702 lem41 (h ∷ t) (x ∷ y) (there a0) (there b0) refl = there (lem41 t (a-list (suc i) t a0) a0 b0 refl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
703
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
704 del-ca : (i : ℕ) → (cl : List C) → (a : any-cl i cl )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
705 → suc (ca-list (del i cl a)) ≡ ca-list cl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
706 del-ca i cl a = a-list-ca i cl (a i ≤-refl)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
707
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
708 lem30 : (i : ℕ) → (cl : List C) → (i≤n : i ≤ n) → (a : any-cl i cl) → i < ca-list cl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
709 lem30 0 cl i≤n a = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
710 1 ≤⟨ s≤s z≤n ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
711 suc (ca-list (del 0 cl a) ) ≡⟨ del-ca 0 cl a ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
712 ca-list cl ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
713 open ≤-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
714 lem30 (suc i) cl i≤n a = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
715 suc (suc i) ≤⟨ s≤s (lem30 i _ (≤-trans a≤sa i≤n) (del-any i cl a) ) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
716 suc (ca-list (del (suc i) cl a)) ≡⟨ del-ca (suc i) cl a ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
717 ca-list cl ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
718 open ≤-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
719
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
720 record maxAC (n : ℕ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
721 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
722 ac : ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
723 n<ca : n < count-A ac
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
724
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
725 lem02 : (n : ℕ) → maxAC n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
726 lem02 n = record { ac = c n ; n<ca = subst (λ k → n < k) (ca-list=count-A (c n)) (n<ca-list n ) }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
727
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
728 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
729 -- countB record create ℕ → B and its injection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
730 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
731 record CountB (n : ℕ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
732 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
733 b : B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
734 cb : ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
735 b=cn : fun← cn cb ≡ g b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
736 cb=n : count-B cb ≡ suc n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
737 cb-inject : (cb1 : ℕ) → Is B C g (fun← cn cb1) → count-B cb ≡ count-B cb1 → cb ≡ cb1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
738
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
739 count-B-mono : {i j : ℕ} → i ≤ j → count-B i ≤ count-B j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
740 count-B-mono {i} {j} i≤j with ≤-∨ i≤j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
741 ... | case1 refl = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
742 ... | case2 i<j = lem00 _ _ i<j where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
743 lem00 : (i j : ℕ) → i < j → count-B i ≤ count-B j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
744 lem00 i (suc j) (s≤s i<j) = ≤-trans (count-B-mono i<j) (lem01 j) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
745 lem01 : (j : ℕ) → count-B j ≤ count-B (suc j)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
746 lem01 zero with is-B (fun← cn (suc zero))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
747 ... | yes isb = refl-≤s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
748 ... | no nisb = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
749 lem01 (suc n) with is-B (fun← cn (suc (suc n)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
750 ... | yes isb = refl-≤s
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
751 ... | no nisb = ≤-refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
752
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
753 lem01 : (n i : ℕ) → suc n ≤ count-B i → CountB n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
754 lem01 n i le = lem09 i (count-B i) le refl where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
755 -- injection of count-B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
756 ---
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
757 lem06 : (i j : ℕ ) → Is B C g (fun← cn i) → Is B C g (fun← cn j) → count-B i ≡ count-B j → i ≡ j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
758 lem06 i j bi bj eq = lem08 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
759 lem20 : (i j : ℕ) → i < j → Is B C g (fun← cn i) → Is B C g (fun← cn j) → count-B j ≡ count-B i → ⊥
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
760 lem20 zero (suc j) i<j bi bj le with is-B (fun← cn 0) in eq1 | is-B (fun← cn (suc j)) in eq2
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
761 ... | no nisc | _ = ⊥-elim (nisc bi)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
762 ... | yes _ | no nisc = ⊥-elim (nisc bj)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
763 ... | yes _ | yes _ = ⊥-elim ( nat-≤> lem25 a<sa) where
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
764 lem22 : 1 ≡ count-B 0
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
765 lem22 with is-B (fun← cn 0) in eq1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
766 ... | yes _ = refl
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
767 ... | no nisa = ⊥-elim ( nisa bi )
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
768 lem24 : count-B j ≡ 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
769 lem24 = cong pred le
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
770 lem25 : 1 ≤ 0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
771 lem25 = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
772 1 ≡⟨ lem22 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
773 count-B 0 ≤⟨ count-B-mono {0} {j} z≤n ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
774 count-B j ≡⟨ lem24 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
775 0 ∎ where open ≤-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
776 lem20 (suc i) zero () bi bj le
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
777 lem20 (suc i) (suc j) (s≤s i<j) bi bj le = ⊥-elim ( nat-≡< lem24 lem21 ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
778 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
779 -- i < suc i ≤ j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
780 -- cb i < suc (cb i) < cb (suc i) ≤ cb j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
781 -- suc (cb i) ≡ suc (cb j) → cb i ≡ cb j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
782 lem22 : suc (count-B i) ≡ count-B (suc i)
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
783 lem22 with is-B (fun← cn (suc i)) in eq1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
784 ... | yes _ = refl
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
785 ... | no nisa = ⊥-elim ( nisa bi )
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
786 lem23 : suc (count-B j) ≡ count-B (suc j)
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
787 lem23 with is-B (fun← cn (suc j)) in eq1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
788 ... | yes _ = refl
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
789 ... | no nisa = ⊥-elim ( nisa bj )
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
790 lem24 : count-B i ≡ count-B j
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
791 lem24 with is-B (fun← cn (suc i)) in eq1 | is-B (fun← cn (suc j)) in eq2
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
792 ... | no nisc | _ = ⊥-elim (nisc bi)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
793 ... | yes _ | no nisc = ⊥-elim (nisc bj)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
794 ... | yes _ | yes _ = sym (cong pred le)
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
795 lem21 : suc (count-B i) ≤ count-B j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
796 lem21 = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
797 suc (count-B i) ≡⟨ lem22 ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
798 count-B (suc i) ≤⟨ count-B-mono i<j ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
799 count-B j ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
800 open ≤-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
801 lem08 : i ≡ j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
802 lem08 with <-cmp i j
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
803 ... | tri< a ¬b ¬c = ⊥-elim ( lem20 i j a bi bj (sym eq) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
804 ... | tri≈ ¬a b ¬c = b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
805 ... | tri> ¬a ¬b c₁ = ⊥-elim ( lem20 j i c₁ bj bi eq )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
806
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
807 lem07 : (n i : ℕ) → count-B i ≡ suc n → CountB n
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
808 lem07 n 0 eq with is-B (fun← cn 0)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
809 ... | yes isb = lem13 where
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
810 cb1 = count-B 0
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
811 lem14 : count-B 0 ≡ 1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
812 lem14 with is-B (fun← cn 0)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
813 ... | yes _ = refl
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
814 ... | no ne = ⊥-elim (ne isb)
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
815 lem12 : (cb1 : ℕ) → Is B C g (fun← cn cb1) → 1 ≡ count-B cb1 → 0 ≡ cb1
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
816 lem12 cb1 iscb1 cbeq = lem06 0 cb1 isb iscb1 (trans lem14 cbeq)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
817 lem13 : CountB n
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
818 lem13 = record { b = Is.a isb ; cb = 0 ; b=cn = sym (Is.fa=c isb) ; cb=n = trans lem14 eq
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
819 ; cb-inject = λ cb1 iscb1 cb1eq → lem12 cb1 iscb1 (subst (λ k → k ≡ count-B cb1) lem14 cb1eq) }
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
820 ... | no nisb = ⊥-elim ( nat-≡< eq (s≤s z≤n ) )
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
821 lem07 n (suc i) eq with is-B (fun← cn (suc i))
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
822 ... | yes isb = record { b = Is.a isb ; cb = suc i ; b=cn = sym (Is.fa=c isb) ; cb=n = trans lem14 eq
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
823 ; cb-inject = λ cb1 iscb1 cb1eq → lem12 cb1 iscb1 (subst (λ k → k ≡ count-B cb1) lem14 cb1eq) } where
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
824 cbs = count-B (suc i)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
825 lem14 : count-B (suc i) ≡ suc (count-B i)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
826 lem14 with is-B (fun← cn (suc i))
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
827 ... | yes _ = refl
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
828 ... | no ne = ⊥-elim (ne isb)
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
829 lem12 : (cb1 : ℕ) → Is B C g (fun← cn cb1) → suc (count-B i) ≡ count-B cb1 → suc i ≡ cb1
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
830 lem12 cb1 iscb1 cbeq = lem06 (suc i) cb1 isb iscb1 (trans lem14 cbeq)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
831 ... | no nisb = lem07 n i eq
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
832
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
833 -- starting from 0, if count B i ≡ suc n, this is it
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
834
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
835 lem09 : (i j : ℕ) → suc n ≤ j → j ≡ count-B i → CountB n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
836 lem09 0 (suc j) (s≤s le) eq with ≤-∨ (s≤s le)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
837 ... | case1 eq1 = lem07 n 0 (sym (trans eq1 eq ))
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
838 ... | case2 (s≤s lt) with is-B (fun← cn 0) in eq1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
839 ... | yes isb = ⊥-elim ( nat-≤> (≤-trans (s≤s lt) (refl-≤≡ eq) ) (s≤s (s≤s z≤n)) )
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
840 ... | no nisb = ⊥-elim (nat-≡< (sym eq) (s≤s z≤n))
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
841 lem09 (suc i) (suc j) (s≤s le) eq with ≤-∨ (s≤s le)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
842 ... | case1 eq1 = lem07 n (suc i) (sym (trans eq1 eq ))
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
843 ... | case2 (s≤s lt) with is-B (fun← cn (suc i)) in eq1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
844 ... | yes isb = lem09 i j lt (cong pred eq)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
845 ... | no nisb = lem09 i (suc j) (≤-trans lt a≤sa) eq
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
846
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
847 bton : B → ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
848 bton b = pred (count-B (fun→ cn (g b)))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
849
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
850 ntob : (n : ℕ) → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
851 ntob n = CountB.b (lem01 n (maxAC.ac (lem02 n)) (≤-trans (maxAC.n<ca (lem02 n)) (ca≤cb0 (maxAC.ac (lem02 n))) ))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
852
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
853 biso : (n : ℕ) → bton (ntob n) ≡ n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
854 biso n = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
855 bton (ntob n) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
856 pred (count-B (fun→ cn (g (CountB.b CB)))) ≡⟨ sym ( cong (λ k → pred (count-B (fun→ cn k))) ( CountB.b=cn CB)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
857 pred (count-B (fun→ cn (fun← cn (CountB.cb CB)))) ≡⟨ cong (λ k → pred (count-B k)) (fiso→ cn _) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
858 pred (count-B (CountB.cb CB)) ≡⟨ cong pred (CountB.cb=n CB) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
859 pred (suc n) ≡⟨ refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
860 n ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
861 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
862 CB = lem01 n (maxAC.ac (lem02 n)) (≤-trans (maxAC.n<ca (lem02 n)) (ca≤cb0 (maxAC.ac (lem02 n))) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
863
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
864 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
865 -- uniqueness of ntob is proved by injection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
866 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
867 biso1 : (b : B) → ntob (bton b) ≡ b
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
868 biso1 b with count-B (fun→ cn (g b)) in eq1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
869 ... | zero = ⊥-elim ( nat-≡< (sym lem20) (lem21 _ refl) ) where
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
870 lem20 : count-B (fun→ cn (InjectiveF.f gi b)) ≡ zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
871 lem20 = eq1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
872 lem21 : (i : ℕ) → i ≡ fun→ cn (InjectiveF.f gi b) → 0 < count-B i
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
873 lem21 0 eq with is-B (fun← cn 0) in eq1
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
874 ... | yes isb = ≤-refl
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
875 ... | no nisb = ⊥-elim ( nisb record { a = b ; fa=c = trans (sym (fiso← cn _)) (cong (fun← cn) (sym eq)) } )
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
876 lem21 (suc i) eq with is-B (fun← cn (suc i)) in eq2
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
877 ... | yes isb = s≤s z≤n
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
878 ... | no nisb = ⊥-elim ( nisb record { a = b ; fa=c = trans (sym (fiso← cn _)) (cong (fun← cn) (sym eq)) } )
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
879 ... | suc n = begin
337
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
880 CountB.b CB ≡⟨ InjectiveF.inject gi (bi-inject→ cn (begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
881 fun→ cn (g (CountB.b CB)) ≡⟨ cong (fun→ cn) (sym (CountB.b=cn CB)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
882 fun→ cn (fun← cn (CountB.cb CB)) ≡⟨ fiso→ cn _ ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
883 CountB.cb CB ≡⟨ CountB.cb-inject CB _ record { a = b ; fa=c = sym (fiso← cn _) } (trans (CountB.cb=n CB) (sym eq1)) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
884 fun→ cn (InjectiveF.f gi b) ∎ )) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
885 b ∎ where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
886 open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
887 CB = lem01 n (maxAC.ac (lem02 n)) (≤-trans (maxAC.n<ca (lem02 n)) (ca≤cb0 (maxAC.ac (lem02 n))) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
888
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
889 bi-∧ : {A B C D : Set} → Bijection A B → Bijection C D → Bijection (A ∧ C) (B ∧ D)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
890 bi-∧ {A} {B} {C} {D} ab cd = record {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
891 fun← = λ x → ⟪ fun← ab (proj1 x) , fun← cd (proj2 x) ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
892 ; fun→ = λ n → ⟪ fun→ ab (proj1 n) , fun→ cd (proj2 n) ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
893 ; fiso← = lem0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
894 ; fiso→ = lem1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
895 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
896 open Bijection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
897 lem0 : (x : A ∧ C) → ⟪ fun← ab (fun→ ab (proj1 x)) , fun← cd (fun→ cd (proj2 x)) ⟫ ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
898 lem0 ⟪ x , y ⟫ = cong₂ ⟪_,_⟫ (fiso← ab x) (fiso← cd y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
899 lem1 : (x : B ∧ D) → ⟪ fun→ ab (fun← ab (proj1 x)) , fun→ cd (fun← cd (proj2 x)) ⟫ ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
900 lem1 ⟪ x , y ⟫ = cong₂ ⟪_,_⟫ (fiso→ ab x) (fiso→ cd y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
901
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
902
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
903 LM1 : (A : Set ) → Bijection (List A ) ℕ → Bijection (List A ∧ List Bool) ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
904 LM1 A Ln = bi-trans (List A ∧ List Bool) (ℕ ∧ ℕ) ℕ (bi-∧ Ln (bi-sym _ _ LBℕ) ) (bi-sym _ _ nxn)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
905
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
906 open import Data.List.Properties
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
907 open import Data.Maybe.Properties
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
908
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
909 --- ℕ ⊆ List A ⊆ List (Maybe A) ⊆ List A ∧ List Bool ⊆ ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
910
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
911 LMℕ : (A : Set ) → Bijection (List A) ℕ → Bijection (List (Maybe A)) ℕ
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
912 LMℕ A Ln = Countable-Bernstein (List A) (List (Maybe A)) (List A ∧ List Bool) Ln (LM1 A Ln) fi gi dec0 dec1 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
913 f : List A → List (Maybe A)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
914 f [] = []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
915 f (x ∷ t) = just x ∷ f t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
916 f-inject : {x y : List A} → f x ≡ f y → x ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
917 f-inject {[]} {[]} refl = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
918 f-inject {x ∷ xt} {y ∷ yt} eq = cong₂ (λ j k → j ∷ k ) (just-injective (∷-injectiveˡ eq)) (f-inject (∷-injectiveʳ eq) )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
919 g : List (Maybe A) → List A ∧ List Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
920 g [] = ⟪ [] , [] ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
921 g (just h ∷ t) = ⟪ h ∷ proj1 (g t) , true ∷ proj2 (g t) ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
922 g (nothing ∷ t) = ⟪ proj1 (g t) , false ∷ proj2 (g t) ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
923 g⁻¹ : List A ∧ List Bool → List (Maybe A)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
924 g⁻¹ ⟪ [] , [] ⟫ = []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
925 g⁻¹ ⟪ x ∷ xt , [] ⟫ = just x ∷ g⁻¹ ⟪ xt , [] ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
926 g⁻¹ ⟪ [] , true ∷ y ⟫ = []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
927 g⁻¹ ⟪ x ∷ xt , true ∷ yt ⟫ = just x ∷ g⁻¹ ⟪ xt , yt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
928 g⁻¹ ⟪ [] , false ∷ y ⟫ = nothing ∷ g⁻¹ ⟪ [] , y ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
929 g⁻¹ ⟪ x ∷ x₁ , false ∷ y ⟫ = nothing ∷ g⁻¹ ⟪ x ∷ x₁ , y ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
930 g-iso : {x : List (Maybe A)} → g⁻¹ (g x) ≡ x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
931 g-iso {[]} = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
932 g-iso {just x ∷ xt} = cong ( λ k → just x ∷ k) ( g-iso )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
933 g-iso {nothing ∷ []} = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
934 g-iso {nothing ∷ just x ∷ xt} = cong (λ k → nothing ∷ k ) ( g-iso {_} )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
935 g-iso {nothing ∷ nothing ∷ xt} with g-iso {nothing ∷ xt}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
936 ... | t = trans (lemma01 (proj1 (g xt)) (proj2 (g xt)) ) ( cong (λ k → nothing ∷ k ) t ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
937 lemma01 : (x : List A) (y : List Bool ) → g⁻¹ ⟪ x , false ∷ false ∷ y ⟫ ≡ nothing ∷ g⁻¹ ⟪ x , false ∷ y ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
938 lemma01 [] y = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
939 lemma01 (x ∷ x₁) y = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
940 g-inject : {x y : List (Maybe A)} → g x ≡ g y → x ≡ y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
941 g-inject {x} {y} eq = subst₂ (λ j k → j ≡ k ) g-iso g-iso (cong g⁻¹ eq )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
942 fi : InjectiveF (List A) (List (Maybe A))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
943 fi = record { f = f ; inject = f-inject }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
944 gi : InjectiveF (List (Maybe A)) (List A ∧ List Bool )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
945 gi = record { f = g ; inject = g-inject }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
946 dec0 : (c : List A ∧ List Bool) → Dec (Is (List A) (List A ∧ List Bool) (λ x → g (f x)) c)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
947 dec0 ⟪ [] , [] ⟫ = yes record { a = [] ; fa=c = refl }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
948 dec0 ⟪ h ∷ t , [] ⟫ = no ( lem00 ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
949 lem00 : Is (List A) (List A ∧ List Bool) (λ x → g (f x)) ⟪ h ∷ t , [] ⟫ → ⊥
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
950 lem00 record { a = [] ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
951 lem00 record { a = (x ∷ a) ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
952 dec0 ⟪ [] , true ∷ bt ⟫ = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
953 lem00 : Is (List A) (List A ∧ List Bool) (λ x → g (f x)) ⟪ [] , true ∷ bt ⟫ → ⊥
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
954 lem00 record { a = [] ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
955 dec0 ⟪ [] , false ∷ bt ⟫ = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
956 lem00 : Is (List A) (List A ∧ List Bool) (λ x → g (f x)) ⟪ [] , false ∷ bt ⟫ → ⊥
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
957 lem00 record { a = [] ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
958 dec0 ⟪ h ∷ t , (true ∷ bt) ⟫ with dec0 ⟪ t , bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
959 ... | yes y = yes record { a = h ∷ Is.a y ; fa=c = cong₂ (λ j k → ⟪ h ∷ j , true ∷ k ⟫ ) (cong proj1 (Is.fa=c y)) (cong proj2 (Is.fa=c y)) }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
960 ... | no n = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
961 lem00 : ¬ Is (List A) (List A ∧ List Bool) (λ x → g (f x)) ⟪ h ∷ t , true ∷ bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
962 lem00 record { a = (x ∷ a) ; fa=c = refl } = ⊥-elim ( n record { a = a ; fa=c = refl } )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
963 dec0 ⟪ (h ∷ t) , (false ∷ bt) ⟫ = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
964 lem00 : ¬ Is (List A) (List A ∧ List Bool) (λ x → g (f x)) ⟪ h ∷ t , false ∷ bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
965 lem00 record { a = [] ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
966 lem00 record { a = (x ∷ a) ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
967 dec1 : (c : List A ∧ List Bool) → Dec (Is (List (Maybe A)) (List A ∧ List Bool) g c)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
968 dec1 ⟪ [] , [] ⟫ = yes record { a = [] ; fa=c = refl }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
969 dec1 ⟪ h ∷ t , [] ⟫ = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
970 lem00 : ¬ Is (List (Maybe A)) (List A ∧ List Bool) g ⟪ h ∷ t , [] ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
971 lem00 record { a = (just x ∷ a) ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
972 lem00 record { a = (nothing ∷ a) ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
973 dec1 ⟪ [] , true ∷ bt ⟫ = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
974 lem00 : ¬ Is (List (Maybe A)) (List A ∧ List Bool) g ⟪ [] , true ∷ bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
975 lem00 record { a = (just x ∷ a) ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
976 lem00 record { a = (nothing ∷ a) ; fa=c = () }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
977 dec1 ⟪ [] , false ∷ bt ⟫ with dec1 ⟪ [] , bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
978 ... | yes record { a = a ; fa=c = fa=c } = yes record { a = nothing ∷ a ; fa=c = cong₂ (λ j k → ⟪ j , false ∷ k ⟫) (cong proj1 fa=c) (cong proj2 fa=c) }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
979 ... | no n = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
980 lem00 : ¬ Is (List (Maybe A)) (List A ∧ List Bool) g ⟪ [] , false ∷ bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
981 lem00 record { a = (nothing ∷ a) ; fa=c = eq } = n record { a = a ; fa=c = cong₂ (λ j k → ⟪ j , k ⟫) (cong proj1 eq) lem01 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
982 lem01 : proj2 (g a) ≡ bt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
983 lem01 with cong proj2 eq
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
984 ... | refl = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
985 dec1 ⟪ h ∷ t , true ∷ bt ⟫ with dec1 ⟪ t , bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
986 ... | yes y = yes record { a = just h ∷ Is.a y ; fa=c = cong₂ (λ j k → ⟪ h ∷ j , true ∷ k ⟫ ) (cong proj1 (Is.fa=c y)) (cong proj2 (Is.fa=c y)) }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
987 ... | no n = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
988 lem00 : ¬ Is (List (Maybe A)) (List A ∧ List Bool) g ⟪ h ∷ t , true ∷ bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
989 lem00 record { a = (just x ∷ a) ; fa=c = refl } = n record { a = a ; fa=c = refl }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
990 dec1 ⟪ h ∷ t , false ∷ bt ⟫ with dec1 ⟪ h ∷ t , bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
991 ... | yes record { a = a ; fa=c = fa=c } = yes record { a = nothing ∷ a ; fa=c = cong₂ (λ j k → ⟪ j , false ∷ k ⟫) (cong proj1 fa=c) (cong proj2 fa=c) }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
992 ... | no n = no lem00 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
993 lem00 : ¬ Is (List (Maybe A)) (List A ∧ List Bool) g ⟪ h ∷ t , false ∷ bt ⟫
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
994 lem00 record { a = (nothing ∷ a) ; fa=c = eq } = n record { a = a ; fa=c = cong₂ (λ j k → ⟪ j , k ⟫) (cong proj1 eq) lem01 } where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
995 lem01 : proj2 (g a) ≡ bt
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
996 lem01 with cong proj2 eq
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
997 ... | refl = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
998
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
999 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
1000 -- ( Bool ∷ Bool ∷ [] ) ( Bool ∷ Bool ∷ [] ) ( Bool ∷ [] )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
1001 -- true ∷ true ∷ false ∷ true ∷ true ∷ false ∷ true ∷ []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
1002
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
1003 -- LMℕ A Ln = Countable-Bernstein (List A) (List (Maybe A)) (List A ∧ List Bool) Ln (LM1 A Ln) fi gi dec0 dec1 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
1004 -- someday ...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 334
diff changeset
1005
403
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1006 -- LBBℕ : Bijection (List (List Bool)) ℕ
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1007 -- LBBℕ = Countable-Bernstein (List Bool ∧ List Bool) (List (List Bool)) (List Bool ∧ List Bool ) (LM1 Bool (bi-sym _ _ LBℕ)) (LM1 Bool (bi-sym _ _ LBℕ))
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1008 -- ? ? ? ? where
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1009 --
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1010 -- atob : List (List Bool) → List Bool ∧ List Bool
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1011 -- atob [] = ⟪ [] , [] ⟫
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1012 -- atob ( [] ∷ t ) = ⟪ false ∷ proj1 ( atob t ) , false ∷ proj2 ( atob t ) ⟫
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1013 -- atob ( (h ∷ t1) ∷ t ) = ⟪ h ∷ proj1 ( atob t ) , true ∷ proj2 ( atob t ) ⟫
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1014 --
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1015 -- btoa : List Bool ∧ List Bool → List (List Bool)
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1016 -- btoa ⟪ [] , _ ⟫ = []
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1017 -- btoa ⟪ _ ∷ _ , [] ⟫ = []
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1018 -- btoa ⟪ _ ∷ t0 , false ∷ t1 ⟫ = [] ∷ btoa ⟪ t0 , t1 ⟫
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1019 -- btoa ⟪ h ∷ t0 , true ∷ t1 ⟫ with btoa ⟪ t0 , t1 ⟫
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1020 -- ... | [] = ( h ∷ [] ) ∷ []
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1021 -- ... | x ∷ y = (h ∷ x ) ∷ y
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1022 --
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1023 -- Lℕ=ℕ : Bijection (List ℕ) ℕ
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1024 -- Lℕ=ℕ = record {
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1025 -- fun→ = λ x → ?
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1026 -- ; fun← = λ n → ?
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1027 -- ; fiso→ = ?
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1028 -- ; fiso← = ?
c298981108c1 fix for std-lib 2.0
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 337
diff changeset
1029 -- }