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