Mercurial > hg > Members > kono > Proof > automaton
comparison automaton-in-agda/src/finiteSetUtil.agda @ 405:af8f630b7e60
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 24 Sep 2023 18:02:04 +0900 |
parents | dfaf230f7b9a |
children | a60132983557 |
comparison
equal
deleted
inserted
replaced
404:dfaf230f7b9a | 405:af8f630b7e60 |
---|---|
25 open import Axiom.Extensionality.Propositional | 25 open import Axiom.Extensionality.Propositional |
26 open import Level hiding (suc ; zero) | 26 open import Level hiding (suc ; zero) |
27 | 27 |
28 module _ {Q : Set } (F : FiniteSet Q) where | 28 module _ {Q : Set } (F : FiniteSet Q) where |
29 open FiniteSet F | 29 open FiniteSet F |
30 equal?-refl : { x : Q } → equal? x x ≡ true | 30 equal?-refl : { x : Q } → equal? x x ≡ true |
31 equal?-refl {x} with F←Q x ≟ F←Q x | 31 equal?-refl {x} with F←Q x ≟ F←Q x |
32 ... | yes eq = refl | 32 ... | yes eq = refl |
33 ... | no ne = ⊥-elim (ne refl) | 33 ... | no ne = ⊥-elim (ne refl) |
34 equal→refl : { x y : Q } → equal? x y ≡ true → x ≡ y | 34 equal→refl : { x y : Q } → equal? x y ≡ true → x ≡ y |
35 equal→refl {q0} {q1} eq with F←Q q0 ≟ F←Q q1 | 35 equal→refl {q0} {q1} eq with F←Q q0 ≟ F←Q q1 |
45 eqP : (x y : Q) → Dec ( x ≡ y ) | 45 eqP : (x y : Q) → Dec ( x ≡ y ) |
46 eqP x y with F←Q x ≟ F←Q y | 46 eqP x y with F←Q x ≟ F←Q y |
47 ... | yes eq = yes (subst₂ (λ j k → j ≡ k ) (finiso→ x) (finiso→ y) (cong Q←F eq) ) | 47 ... | yes eq = yes (subst₂ (λ j k → j ≡ k ) (finiso→ x) (finiso→ y) (cong Q←F eq) ) |
48 ... | no n = no (λ eq → n (cong F←Q eq)) | 48 ... | no n = no (λ eq → n (cong F←Q eq)) |
49 End : (m : ℕ ) → (p : Q → Bool ) → Set | 49 End : (m : ℕ ) → (p : Q → Bool ) → Set |
50 End m p = (i : Fin finite) → m ≤ toℕ i → p (Q←F i ) ≡ false | 50 End m p = (i : Fin finite) → m ≤ toℕ i → p (Q←F i ) ≡ false |
51 first-end : ( p : Q → Bool ) → End finite p | 51 first-end : ( p : Q → Bool ) → End finite p |
52 first-end p i i>n = ⊥-elim (nat-≤> i>n (fin<n {finite} i) ) | 52 first-end p i i>n = ⊥-elim (nat-≤> i>n (fin<n {finite} i) ) |
53 next-end : {m : ℕ } → ( p : Q → Bool ) → End (suc m) p | 53 next-end : {m : ℕ } → ( p : Q → Bool ) → End (suc m) p |
54 → (m<n : m < finite ) → p (Q←F (fromℕ< m<n )) ≡ false | 54 → (m<n : m < finite ) → p (Q←F (fromℕ< m<n )) ≡ false |
55 → End m p | 55 → End m p |
56 next-end {m} p prev m<n np i m<i with NP.<-cmp m (toℕ i) | 56 next-end {m} p prev m<n np i m<i with NP.<-cmp m (toℕ i) |
57 next-end p prev m<n np i m<i | tri< a ¬b ¬c = prev i a | 57 next-end p prev m<n np i m<i | tri< a ¬b ¬c = prev i a |
58 next-end p prev m<n np i m<i | tri> ¬a ¬b c = ⊥-elim ( nat-≤> m<i c ) | 58 next-end p prev m<n np i m<i | tri> ¬a ¬b c = ⊥-elim ( nat-≤> m<i c ) |
59 next-end {m} p prev m<n np i m<i | tri≈ ¬a b ¬c = subst ( λ k → p (Q←F k) ≡ false) (m<n=i i b m<n ) np where | 59 next-end {m} p prev m<n np i m<i | tri≈ ¬a b ¬c = subst ( λ k → p (Q←F k) ≡ false) (m<n=i i b m<n ) np where |
60 m<n=i : {n : ℕ } (i : Fin n) {m : ℕ } → m ≡ (toℕ i) → (m<n : m < n ) → fromℕ< m<n ≡ i | 60 m<n=i : {n : ℕ } (i : Fin n) {m : ℕ } → m ≡ (toℕ i) → (m<n : m < n ) → fromℕ< m<n ≡ i |
61 m<n=i i refl m<n = fromℕ<-toℕ i m<n | 61 m<n=i i refl m<n = fromℕ<-toℕ i m<n |
62 found : { p : Q → Bool } → (q : Q ) → p q ≡ true → exists p ≡ true | 62 found : { p : Q → Bool } → (q : Q ) → p q ≡ true → exists p ≡ true |
63 found {p} q pt = found1 finite (NP.≤-refl ) ( first-end p ) where | 63 found {p} q pt = found1 finite (NP.≤-refl ) ( first-end p ) where |
64 found1 : (m : ℕ ) (m<n : m Data.Nat.≤ finite ) → ((i : Fin finite) → m ≤ toℕ i → p (Q←F i ) ≡ false ) → exists1 m m<n p ≡ true | 64 found1 : (m : ℕ ) (m<n : m Data.Nat.≤ finite ) → ((i : Fin finite) → m ≤ toℕ i → p (Q←F i ) ≡ false ) → exists1 m m<n p ≡ true |
65 found1 0 m<n end = ⊥-elim ( ¬-bool (subst (λ k → k ≡ false ) (cong (λ k → p k) (finiso→ q) ) (end (F←Q q) z≤n )) pt ) | 65 found1 0 m<n end = ⊥-elim ( ¬-bool (subst (λ k → k ≡ false ) (cong (λ k → p k) (finiso→ q) ) (end (F←Q q) z≤n )) pt ) |
66 found1 (suc m) m<n end with bool-≡-? (p (Q←F (fromℕ< m<n))) true | 66 found1 (suc m) m<n end with bool-≡-? (p (Q←F (fromℕ< m<n))) true |
67 found1 (suc m) m<n end | yes eq = subst (λ k → k \/ exists1 m (<to≤ m<n) p ≡ true ) (sym eq) (bool-or-4 {exists1 m (<to≤ m<n) p} ) | 67 found1 (suc m) m<n end | yes eq = subst (λ k → k \/ exists1 m (<to≤ m<n) p ≡ true ) (sym eq) (bool-or-4 {exists1 m (<to≤ m<n) p} ) |
68 found1 (suc m) m<n end | no np = begin | 68 found1 (suc m) m<n end | no np = begin |
69 p (Q←F (fromℕ< m<n)) \/ exists1 m (<to≤ m<n) p | 69 p (Q←F (fromℕ< m<n)) \/ exists1 m (<to≤ m<n) p |
70 ≡⟨ bool-or-1 (¬-bool-t np ) ⟩ | 70 ≡⟨ bool-or-1 (¬-bool-t np ) ⟩ |
71 exists1 m (<to≤ m<n) p | 71 exists1 m (<to≤ m<n) p |
72 ≡⟨ found1 m (<to≤ m<n) (next-end p end m<n (¬-bool-t np )) ⟩ | 72 ≡⟨ found1 m (<to≤ m<n) (next-end p end m<n (¬-bool-t np )) ⟩ |
76 not-found {p} pn = not-found2 finite NP.≤-refl where | 76 not-found {p} pn = not-found2 finite NP.≤-refl where |
77 not-found2 : (m : ℕ ) → (m<n : m Data.Nat.≤ finite ) → exists1 m m<n p ≡ false | 77 not-found2 : (m : ℕ ) → (m<n : m Data.Nat.≤ finite ) → exists1 m m<n p ≡ false |
78 not-found2 zero _ = refl | 78 not-found2 zero _ = refl |
79 not-found2 ( suc m ) m<n with pn (Q←F (fromℕ< {m} {finite} m<n)) | 79 not-found2 ( suc m ) m<n with pn (Q←F (fromℕ< {m} {finite} m<n)) |
80 not-found2 (suc m) m<n | eq = begin | 80 not-found2 (suc m) m<n | eq = begin |
81 p (Q←F (fromℕ< m<n)) \/ exists1 m (<to≤ m<n) p | 81 p (Q←F (fromℕ< m<n)) \/ exists1 m (<to≤ m<n) p |
82 ≡⟨ bool-or-1 eq ⟩ | 82 ≡⟨ bool-or-1 eq ⟩ |
83 exists1 m (<to≤ m<n) p | 83 exists1 m (<to≤ m<n) p |
84 ≡⟨ not-found2 m (<to≤ m<n) ⟩ | 84 ≡⟨ not-found2 m (<to≤ m<n) ⟩ |
85 false | 85 false |
86 ∎ where open ≡-Reasoning | 86 ∎ where open ≡-Reasoning |
87 found← : { p : Q → Bool } → exists p ≡ true → Found Q p | 87 found← : { p : Q → Bool } → exists p ≡ true → Found Q p |
88 found← {p} exst = found2 finite NP.≤-refl (first-end p ) where | 88 found← {p} exst = found2 finite NP.≤-refl (first-end p ) where |
90 found2 0 m<n end = ⊥-elim ( ¬-bool f01 exst ) where | 90 found2 0 m<n end = ⊥-elim ( ¬-bool f01 exst ) where |
91 f01 : exists p ≡ false | 91 f01 : exists p ≡ false |
92 f01 = not-found (λ q → subst ( λ k → p k ≡ false ) (finiso→ _) (end (F←Q q) z≤n )) | 92 f01 = not-found (λ q → subst ( λ k → p k ≡ false ) (finiso→ _) (end (F←Q q) z≤n )) |
93 found2 (suc m) m<n end with bool-≡-? (p (Q←F (fromℕ< m<n))) true | 93 found2 (suc m) m<n end with bool-≡-? (p (Q←F (fromℕ< m<n))) true |
94 found2 (suc m) m<n end | yes eq = record { found-q = Q←F (fromℕ< m<n) ; found-p = eq } | 94 found2 (suc m) m<n end | yes eq = record { found-q = Q←F (fromℕ< m<n) ; found-p = eq } |
95 found2 (suc m) m<n end | no np = | 95 found2 (suc m) m<n end | no np = |
96 found2 m (<to≤ m<n) (next-end p end m<n (¬-bool-t np )) | 96 found2 m (<to≤ m<n) (next-end p end m<n (¬-bool-t np )) |
97 not-found← : { p : Q → Bool } → exists p ≡ false → (q : Q ) → p q ≡ false | 97 not-found← : { p : Q → Bool } → exists p ≡ false → (q : Q ) → p q ≡ false |
98 not-found← {p} np q = ¬-bool-t ( contra-position {_} {_} {_} {exists p ≡ true} (found q) (λ ep → ¬-bool np ep ) ) | 98 not-found← {p} np q = ¬-bool-t ( contra-position {_} {_} {_} {exists p ≡ true} (found q) (λ ep → ¬-bool np ep ) ) |
99 Q←F-inject : {x y : Fin finite} → Q←F x ≡ Q←F y → x ≡ y | 99 Q←F-inject : {x y : Fin finite} → Q←F x ≡ Q←F y → x ≡ y |
100 Q←F-inject eq = subst₂ (λ j k → j ≡ k ) (finiso← _) (finiso← _) (cong F←Q eq) | 100 Q←F-inject eq = subst₂ (λ j k → j ≡ k ) (finiso← _) (finiso← _) (cong F←Q eq) |
101 F←Q-inject : {x y : Q } → F←Q x ≡ F←Q y → x ≡ y | 101 F←Q-inject : {x y : Q } → F←Q x ≡ F←Q y → x ≡ y |
102 F←Q-inject eq = subst₂ (λ j k → j ≡ k ) (finiso→ _) (finiso→ _) (cong Q←F eq) | 102 F←Q-inject eq = subst₂ (λ j k → j ≡ k ) (finiso→ _) (finiso→ _) (cong Q←F eq) |
103 | 103 |
104 | 104 |
105 | 105 |
106 iso-fin : {A B : Set} → FiniteSet A → Bijection A B → FiniteSet B | 106 iso-fin : {A B : Set} → FiniteSet A → Bijection A B → FiniteSet B |
107 iso-fin {A} {B} fin iso = record { | 107 iso-fin {A} {B} fin iso = record { |
108 Q←F = λ f → fun→ iso ( FiniteSet.Q←F fin f ) | 108 Q←F = λ f → fun→ iso ( FiniteSet.Q←F fin f ) |
109 ; F←Q = λ b → FiniteSet.F←Q fin (fun← iso b ) | 109 ; F←Q = λ b → FiniteSet.F←Q fin (fun← iso b ) |
110 ; finiso→ = finiso→ | 110 ; finiso→ = finiso→ |
111 ; finiso← = finiso← | 111 ; finiso← = finiso← |
112 } where | 112 } where |
113 finiso→ : (q : B) → fun→ iso (FiniteSet.Q←F fin (FiniteSet.F←Q fin (Bijection.fun← iso q))) ≡ q | 113 finiso→ : (q : B) → fun→ iso (FiniteSet.Q←F fin (FiniteSet.F←Q fin (Bijection.fun← iso q))) ≡ q |
114 finiso→ q = begin | 114 finiso→ q = begin |
115 fun→ iso (FiniteSet.Q←F fin (FiniteSet.F←Q fin (Bijection.fun← iso q))) | 115 fun→ iso (FiniteSet.Q←F fin (FiniteSet.F←Q fin (Bijection.fun← iso q))) |
116 ≡⟨ cong (λ k → fun→ iso k ) (FiniteSet.finiso→ fin _ ) ⟩ | 116 ≡⟨ cong (λ k → fun→ iso k ) (FiniteSet.finiso→ fin _ ) ⟩ |
117 fun→ iso (Bijection.fun← iso q) | 117 fun→ iso (Bijection.fun← iso q) |
118 ≡⟨ fiso→ iso _ ⟩ | 118 ≡⟨ fiso→ iso _ ⟩ |
119 q | 119 q |
120 ∎ where open ≡-Reasoning | 120 ∎ where open ≡-Reasoning |
121 finiso← : (f : Fin (FiniteSet.finite fin ))→ FiniteSet.F←Q fin (Bijection.fun← iso (Bijection.fun→ iso (FiniteSet.Q←F fin f))) ≡ f | 121 finiso← : (f : Fin (FiniteSet.finite fin ))→ FiniteSet.F←Q fin (Bijection.fun← iso (Bijection.fun→ iso (FiniteSet.Q←F fin f))) ≡ f |
122 finiso← f = begin | 122 finiso← f = begin |
123 FiniteSet.F←Q fin (Bijection.fun← iso (Bijection.fun→ iso (FiniteSet.Q←F fin f))) | 123 FiniteSet.F←Q fin (Bijection.fun← iso (Bijection.fun→ iso (FiniteSet.Q←F fin f))) |
124 ≡⟨ cong (λ k → FiniteSet.F←Q fin k ) (Bijection.fiso← iso _) ⟩ | 124 ≡⟨ cong (λ k → FiniteSet.F←Q fin k ) (Bijection.fiso← iso _) ⟩ |
125 FiniteSet.F←Q fin (FiniteSet.Q←F fin f) | 125 FiniteSet.F←Q fin (FiniteSet.Q←F fin f) |
126 ≡⟨ FiniteSet.finiso← fin _ ⟩ | 126 ≡⟨ FiniteSet.finiso← fin _ ⟩ |
127 f | 127 f |
128 ∎ where | 128 ∎ where |
129 open ≡-Reasoning | 129 open ≡-Reasoning |
130 | 130 |
134 finOne : FiniteSet One | 134 finOne : FiniteSet One |
135 finOne = record { finite = 1 ; Q←F = λ _ → one ; F←Q = λ _ → # 0 ; finiso→ = fin00 ; finiso← = fin1≡0 } where | 135 finOne = record { finite = 1 ; Q←F = λ _ → one ; F←Q = λ _ → # 0 ; finiso→ = fin00 ; finiso← = fin1≡0 } where |
136 fin00 : (q : One) → one ≡ q | 136 fin00 : (q : One) → one ≡ q |
137 fin00 one = refl | 137 fin00 one = refl |
138 | 138 |
139 fin-∨1 : {B : Set} → (fb : FiniteSet B ) → FiniteSet (One ∨ B) | 139 fin-∨1 : {B : Set} → (fb : FiniteSet B ) → FiniteSet (One ∨ B) |
140 fin-∨1 {B} fb = record { | 140 fin-∨1 {B} fb = record { |
141 Q←F = Q←F | 141 Q←F = Q←F |
142 ; F←Q = F←Q | 142 ; F←Q = F←Q |
143 ; finiso→ = finiso→ | 143 ; finiso→ = finiso→ |
144 ; finiso← = finiso← | 144 ; finiso← = finiso← |
147 Q←F : Fin (suc b) → One ∨ B | 147 Q←F : Fin (suc b) → One ∨ B |
148 Q←F zero = case1 one | 148 Q←F zero = case1 one |
149 Q←F (suc f) = case2 (FiniteSet.Q←F fb f) | 149 Q←F (suc f) = case2 (FiniteSet.Q←F fb f) |
150 F←Q : One ∨ B → Fin (suc b) | 150 F←Q : One ∨ B → Fin (suc b) |
151 F←Q (case1 one) = zero | 151 F←Q (case1 one) = zero |
152 F←Q (case2 f ) = suc (FiniteSet.F←Q fb f) | 152 F←Q (case2 f ) = suc (FiniteSet.F←Q fb f) |
153 finiso→ : (q : One ∨ B) → Q←F (F←Q q) ≡ q | 153 finiso→ : (q : One ∨ B) → Q←F (F←Q q) ≡ q |
154 finiso→ (case1 one) = refl | 154 finiso→ (case1 one) = refl |
155 finiso→ (case2 b) = cong (λ k → case2 k ) (FiniteSet.finiso→ fb b) | 155 finiso→ (case2 b) = cong (λ k → case2 k ) (FiniteSet.finiso→ fb b) |
156 finiso← : (q : Fin (suc b)) → F←Q (Q←F q) ≡ q | 156 finiso← : (q : Fin (suc b)) → F←Q (Q←F q) ≡ q |
157 finiso← zero = refl | 157 finiso← zero = refl |
158 finiso← (suc f) = cong ( λ k → suc k ) (FiniteSet.finiso← fb f) | 158 finiso← (suc f) = cong ( λ k → suc k ) (FiniteSet.finiso← fb f) |
159 | 159 |
160 | 160 |
161 fin-∨2 : {B : Set} → ( a : ℕ ) → FiniteSet B → FiniteSet (Fin a ∨ B) | 161 fin-∨2 : {B : Set} → ( a : ℕ ) → FiniteSet B → FiniteSet (Fin a ∨ B) |
162 fin-∨2 {B} zero fb = iso-fin fb iso where | 162 fin-∨2 {B} zero fb = iso-fin fb iso where |
163 iso : Bijection B (Fin zero ∨ B) | 163 iso : Bijection B (Fin zero ∨ B) |
164 iso = record { | 164 iso = record { |
165 fun← = fun←1 | 165 fun← = fun←1 |
166 ; fun→ = λ b → case2 b | 166 ; fun→ = λ b → case2 b |
167 ; fiso→ = fiso→1 | 167 ; fiso→ = fiso→1 |
168 ; fiso← = λ _ → refl | 168 ; fiso← = λ _ → refl |
169 } where | 169 } where |
170 fun←1 : Fin zero ∨ B → B | 170 fun←1 : Fin zero ∨ B → B |
171 fun←1 (case2 x) = x | 171 fun←1 (case2 x) = x |
172 fiso→1 : (f : Fin zero ∨ B ) → case2 (fun←1 f) ≡ f | 172 fiso→1 : (f : Fin zero ∨ B ) → case2 (fun←1 f) ≡ f |
173 fiso→1 (case2 x) = refl | 173 fiso→1 (case2 x) = refl |
174 fin-∨2 {B} (suc a) fb = iso-fin (fin-∨1 (fin-∨2 a fb) ) iso | 174 fin-∨2 {B} (suc a) fb = iso-fin (fin-∨1 (fin-∨2 a fb) ) iso |
175 where | 175 where |
176 iso : Bijection (One ∨ (Fin a ∨ B) ) (Fin (suc a) ∨ B) | 176 iso : Bijection (One ∨ (Fin a ∨ B) ) (Fin (suc a) ∨ B) |
191 FiniteSet→Fin : {A : Set} → (fin : FiniteSet A ) → Bijection (Fin (FiniteSet.finite fin)) A | 191 FiniteSet→Fin : {A : Set} → (fin : FiniteSet A ) → Bijection (Fin (FiniteSet.finite fin)) A |
192 fun← (FiniteSet→Fin fin) f = FiniteSet.F←Q fin f | 192 fun← (FiniteSet→Fin fin) f = FiniteSet.F←Q fin f |
193 fun→ (FiniteSet→Fin fin) f = FiniteSet.Q←F fin f | 193 fun→ (FiniteSet→Fin fin) f = FiniteSet.Q←F fin f |
194 fiso← (FiniteSet→Fin fin) = FiniteSet.finiso← fin | 194 fiso← (FiniteSet→Fin fin) = FiniteSet.finiso← fin |
195 fiso→ (FiniteSet→Fin fin) = FiniteSet.finiso→ fin | 195 fiso→ (FiniteSet→Fin fin) = FiniteSet.finiso→ fin |
196 | 196 |
197 | 197 |
198 fin-∨ : {A B : Set} → FiniteSet A → FiniteSet B → FiniteSet (A ∨ B) | 198 fin-∨ : {A B : Set} → FiniteSet A → FiniteSet B → FiniteSet (A ∨ B) |
199 fin-∨ {A} {B} fa fb = iso-fin (fin-∨2 a fb ) iso2 where | 199 fin-∨ {A} {B} fa fb = iso-fin (fin-∨2 a fb ) iso2 where |
200 a = FiniteSet.finite fa | 200 a = FiniteSet.finite fa |
201 ia = FiniteSet→Fin fa | 201 ia = FiniteSet→Fin fa |
202 iso2 : Bijection (Fin a ∨ B ) (A ∨ B) | 202 iso2 : Bijection (Fin a ∨ B ) (A ∨ B) |
203 fun← iso2 (case1 x) = case1 (fun← ia x ) | 203 fun← iso2 (case1 x) = case1 (fun← ia x ) |
209 fiso→ iso2 (case1 x) = cong ( λ k → case1 k ) (Bijection.fiso→ ia x) | 209 fiso→ iso2 (case1 x) = cong ( λ k → case1 k ) (Bijection.fiso→ ia x) |
210 fiso→ iso2 (case2 x) = refl | 210 fiso→ iso2 (case2 x) = refl |
211 | 211 |
212 open import Data.Product hiding ( map ) | 212 open import Data.Product hiding ( map ) |
213 | 213 |
214 fin-× : {A B : Set} → FiniteSet A → FiniteSet B → FiniteSet (A × B) | 214 fin-× : {A B : Set} → FiniteSet A → FiniteSet B → FiniteSet (A × B) |
215 fin-× {A} {B} fa fb with FiniteSet→Fin fa | 215 fin-× {A} {B} fa fb with FiniteSet→Fin fa |
216 ... | a=f = iso-fin (fin-×-f a ) iso-1 where | 216 ... | a=f = iso-fin (fin-×-f a ) iso-1 where |
217 a = FiniteSet.finite fa | 217 a = FiniteSet.finite fa |
218 b = FiniteSet.finite fb | 218 b = FiniteSet.finite fb |
219 iso-1 : Bijection (Fin a × B) ( A × B ) | 219 iso-1 : Bijection (Fin a × B) ( A × B ) |
220 fun← iso-1 x = ( FiniteSet.F←Q fa (proj₁ x) , proj₂ x) | 220 fun← iso-1 x = ( FiniteSet.F←Q fa (proj₁ x) , proj₂ x) |
221 fun→ iso-1 x = ( FiniteSet.Q←F fa (proj₁ x) , proj₂ x) | 221 fun→ iso-1 x = ( FiniteSet.Q←F fa (proj₁ x) , proj₂ x) |
222 fiso← iso-1 x = lemma where | 222 fiso← iso-1 x = lemma where |
223 lemma : (FiniteSet.F←Q fa (FiniteSet.Q←F fa (proj₁ x)) , proj₂ x) ≡ ( proj₁ x , proj₂ x ) | 223 lemma : (FiniteSet.F←Q fa (FiniteSet.Q←F fa (proj₁ x)) , proj₂ x) ≡ ( proj₁ x , proj₂ x ) |
224 lemma = cong ( λ k → ( k , proj₂ x ) ) (FiniteSet.finiso← fa _ ) | 224 lemma = cong ( λ k → ( k , proj₂ x ) ) (FiniteSet.finiso← fa _ ) |
225 fiso→ iso-1 x = cong ( λ k → ( k , proj₂ x ) ) (FiniteSet.finiso→ fa _ ) | 225 fiso→ iso-1 x = cong ( λ k → ( k , proj₂ x ) ) (FiniteSet.finiso→ fa _ ) |
226 | 226 |
232 fiso← iso-2 (case1 x) = refl | 232 fiso← iso-2 (case1 x) = refl |
233 fiso← iso-2 (case2 x) = refl | 233 fiso← iso-2 (case2 x) = refl |
234 fiso→ iso-2 (zero , b ) = refl | 234 fiso→ iso-2 (zero , b ) = refl |
235 fiso→ iso-2 (suc a , b ) = refl | 235 fiso→ iso-2 (suc a , b ) = refl |
236 | 236 |
237 fin-×-f : ( a : ℕ ) → FiniteSet ((Fin a) × B) | 237 fin-×-f : ( a : ℕ ) → FiniteSet ((Fin a) × B) |
238 fin-×-f zero = record { Q←F = λ () ; F←Q = λ () ; finiso→ = λ () ; finiso← = λ () ; finite = 0 } | 238 fin-×-f zero = record { Q←F = λ () ; F←Q = λ () ; finiso→ = λ () ; finiso← = λ () ; finite = 0 } |
239 fin-×-f (suc a) = iso-fin ( fin-∨ fb ( fin-×-f a ) ) iso-2 | 239 fin-×-f (suc a) = iso-fin ( fin-∨ fb ( fin-×-f a ) ) iso-2 |
240 | 240 |
241 open _∧_ | 241 open _∧_ |
242 | 242 |
243 fin-∧ : {A B : Set} → FiniteSet A → FiniteSet B → FiniteSet (A ∧ B) | 243 fin-∧ : {A B : Set} → FiniteSet A → FiniteSet B → FiniteSet (A ∧ B) |
244 fin-∧ {A} {B} fa fb with FiniteSet→Fin fa -- same thing for our tool | 244 fin-∧ {A} {B} fa fb with FiniteSet→Fin fa -- same thing for our tool |
245 ... | a=f = iso-fin (fin-×-f a ) iso-1 where | 245 ... | a=f = iso-fin (fin-×-f a ) iso-1 where |
246 a = FiniteSet.finite fa | 246 a = FiniteSet.finite fa |
247 b = FiniteSet.finite fb | 247 b = FiniteSet.finite fb |
248 iso-1 : Bijection (Fin a ∧ B) ( A ∧ B ) | 248 iso-1 : Bijection (Fin a ∧ B) ( A ∧ B ) |
249 fun← iso-1 x = record { proj1 = FiniteSet.F←Q fa (proj1 x) ; proj2 = proj2 x} | 249 fun← iso-1 x = record { proj1 = FiniteSet.F←Q fa (proj1 x) ; proj2 = proj2 x} |
250 fun→ iso-1 x = record { proj1 = FiniteSet.Q←F fa (proj1 x) ; proj2 = proj2 x} | 250 fun→ iso-1 x = record { proj1 = FiniteSet.Q←F fa (proj1 x) ; proj2 = proj2 x} |
251 fiso← iso-1 x = lemma where | 251 fiso← iso-1 x = lemma where |
252 lemma : record { proj1 = FiniteSet.F←Q fa (FiniteSet.Q←F fa (proj1 x)) ; proj2 = proj2 x} ≡ record {proj1 = proj1 x ; proj2 = proj2 x } | 252 lemma : record { proj1 = FiniteSet.F←Q fa (FiniteSet.Q←F fa (proj1 x)) ; proj2 = proj2 x} ≡ record {proj1 = proj1 x ; proj2 = proj2 x } |
253 lemma = cong ( λ k → record {proj1 = k ; proj2 = proj2 x } ) (FiniteSet.finiso← fa _ ) | 253 lemma = cong ( λ k → record {proj1 = k ; proj2 = proj2 x } ) (FiniteSet.finiso← fa _ ) |
254 fiso→ iso-1 x = cong ( λ k → record {proj1 = k ; proj2 = proj2 x } ) (FiniteSet.finiso→ fa _ ) | 254 fiso→ iso-1 x = cong ( λ k → record {proj1 = k ; proj2 = proj2 x } ) (FiniteSet.finiso→ fa _ ) |
261 fiso← iso-2 (case1 x) = refl | 261 fiso← iso-2 (case1 x) = refl |
262 fiso← iso-2 (case2 x) = refl | 262 fiso← iso-2 (case2 x) = refl |
263 fiso→ iso-2 (record { proj1 = zero ; proj2 = b }) = refl | 263 fiso→ iso-2 (record { proj1 = zero ; proj2 = b }) = refl |
264 fiso→ iso-2 (record { proj1 = suc a ; proj2 = b }) = refl | 264 fiso→ iso-2 (record { proj1 = suc a ; proj2 = b }) = refl |
265 | 265 |
266 fin-×-f : ( a : ℕ ) → FiniteSet ((Fin a) ∧ B) | 266 fin-×-f : ( a : ℕ ) → FiniteSet ((Fin a) ∧ B) |
267 fin-×-f zero = record { Q←F = λ () ; F←Q = λ () ; finiso→ = λ () ; finiso← = λ () ; finite = 0 } | 267 fin-×-f zero = record { Q←F = λ () ; F←Q = λ () ; finiso→ = λ () ; finiso← = λ () ; finite = 0 } |
268 fin-×-f (suc a) = iso-fin ( fin-∨ fb ( fin-×-f a ) ) iso-2 | 268 fin-×-f (suc a) = iso-fin ( fin-∨ fb ( fin-×-f a ) ) iso-2 |
269 | 269 |
270 -- import Data.Nat.DivMod | 270 -- import Data.Nat.DivMod |
271 | 271 |
290 cast-iso : {n m : ℕ } → (eq : n ≡ m ) → (f : Fin m ) → Data.Fin.cast eq ( Data.Fin.cast (sym eq ) f) ≡ f | 290 cast-iso : {n m : ℕ } → (eq : n ≡ m ) → (f : Fin m ) → Data.Fin.cast eq ( Data.Fin.cast (sym eq ) f) ≡ f |
291 cast-iso refl zero = refl | 291 cast-iso refl zero = refl |
292 cast-iso refl (suc f) = cong ( λ k → suc k ) ( cast-iso refl f ) | 292 cast-iso refl (suc f) = cong ( λ k → suc k ) ( cast-iso refl f ) |
293 | 293 |
294 | 294 |
295 fin2List : {n : ℕ } → FiniteSet (Vec Bool n) | 295 fin2List : {n : ℕ } → FiniteSet (Vec Bool n) |
296 fin2List {zero} = record { | 296 fin2List {zero} = record { |
297 Q←F = λ _ → Vec.[] | 297 Q←F = λ _ → Vec.[] |
298 ; F←Q = λ _ → # 0 | 298 ; F←Q = λ _ → # 0 |
299 ; finiso→ = finiso→ | 299 ; finiso→ = finiso→ |
300 ; finiso← = finiso← | 300 ; finiso← = finiso← |
301 } where | 301 } where |
302 Q = Vec Bool zero | 302 Q = Vec Bool zero |
303 finiso→ : (q : Q) → [] ≡ q | 303 finiso→ : (q : Q) → [] ≡ q |
304 finiso→ [] = refl | 304 finiso→ [] = refl |
305 finiso← : (f : Fin (exp 2 zero)) → # 0 ≡ f | 305 finiso← : (f : Fin (exp 2 zero)) → # 0 ≡ f |
307 fin2List {suc n} = subst (λ k → FiniteSet (Vec Bool (suc n)) ) (sym (exp2 n)) ( iso-fin (fin-∨ (fin2List ) (fin2List )) iso ) | 307 fin2List {suc n} = subst (λ k → FiniteSet (Vec Bool (suc n)) ) (sym (exp2 n)) ( iso-fin (fin-∨ (fin2List ) (fin2List )) iso ) |
308 where | 308 where |
309 QtoR : Vec Bool (suc n) → Vec Bool n ∨ Vec Bool n | 309 QtoR : Vec Bool (suc n) → Vec Bool n ∨ Vec Bool n |
310 QtoR ( true ∷ x ) = case1 x | 310 QtoR ( true ∷ x ) = case1 x |
311 QtoR ( false ∷ x ) = case2 x | 311 QtoR ( false ∷ x ) = case2 x |
312 RtoQ : Vec Bool n ∨ Vec Bool n → Vec Bool (suc n) | 312 RtoQ : Vec Bool n ∨ Vec Bool n → Vec Bool (suc n) |
313 RtoQ ( case1 x ) = true ∷ x | 313 RtoQ ( case1 x ) = true ∷ x |
314 RtoQ ( case2 x ) = false ∷ x | 314 RtoQ ( case2 x ) = false ∷ x |
315 isoRQ : (x : Vec Bool (suc n) ) → RtoQ ( QtoR x ) ≡ x | 315 isoRQ : (x : Vec Bool (suc n) ) → RtoQ ( QtoR x ) ≡ x |
316 isoRQ (true ∷ _ ) = refl | 316 isoRQ (true ∷ _ ) = refl |
317 isoRQ (false ∷ _ ) = refl | 317 isoRQ (false ∷ _ ) = refl |
327 lemma6 : toℕ (FiniteSet.F←Q fin (FiniteSet.Q←F fin (fromℕ< n<m))) < suc n | 327 lemma6 : toℕ (FiniteSet.F←Q fin (FiniteSet.Q←F fin (fromℕ< n<m))) < suc n |
328 lemma6 = subst (λ k → toℕ k < suc n ) (sym (FiniteSet.finiso← fin _ )) (subst (λ k → k < suc n) (sym (toℕ-fromℕ< n<m )) a<sa ) | 328 lemma6 = subst (λ k → toℕ k < suc n ) (sym (FiniteSet.finiso← fin _ )) (subst (λ k → k < suc n) (sym (toℕ-fromℕ< n<m )) a<sa ) |
329 qb1 : (q : Q) → toℕ (FiniteSet.F←Q fin q) < n → Bool | 329 qb1 : (q : Q) → toℕ (FiniteSet.F←Q fin q) < n → Bool |
330 qb1 q q<n = Q→B q (NP.<-trans q<n a<sa) | 330 qb1 q q<n = Q→B q (NP.<-trans q<n a<sa) |
331 | 331 |
332 List2Func : { Q : Set } → {n : ℕ } → (fin : FiniteSet Q ) → n < suc (FiniteSet.finite fin) → Vec Bool n → Q → Bool | 332 List2Func : { Q : Set } → {n : ℕ } → (fin : FiniteSet Q ) → n < suc (FiniteSet.finite fin) → Vec Bool n → Q → Bool |
333 List2Func {Q} {zero} fin (s≤s z≤n) [] q = false | 333 List2Func {Q} {zero} fin (s≤s z≤n) [] q = false |
334 List2Func {Q} {suc n} fin (s≤s n<m) (h ∷ t) q with FiniteSet.F←Q fin q ≟ fromℕ< n<m | 334 List2Func {Q} {suc n} fin (s≤s n<m) (h ∷ t) q with FiniteSet.F←Q fin q ≟ fromℕ< n<m |
335 ... | yes _ = h | 335 ... | yes _ = h |
336 ... | no _ = List2Func {Q} fin (NP.<-trans n<m a<sa ) t q | 336 ... | no _ = List2Func {Q} fin (NP.<-trans n<m a<sa ) t q |
337 | 337 |
338 open import Level renaming ( suc to Suc ; zero to Zero) | 338 open import Level renaming ( suc to Suc ; zero to Zero) |
339 | 339 |
340 | 340 |
341 L2F : {Q : Set } {n : ℕ } → (fin : FiniteSet Q ) → n < suc (FiniteSet.finite fin) → Vec Bool n → (q : Q ) → toℕ (FiniteSet.F←Q fin q ) < n → Bool | 341 L2F : {Q : Set } {n : ℕ } → (fin : FiniteSet Q ) → n < suc (FiniteSet.finite fin) → Vec Bool n → (q : Q ) → toℕ (FiniteSet.F←Q fin q ) < n → Bool |
342 L2F fin n<m x q q<n = List2Func fin n<m x q | 342 L2F fin n<m x q q<n = List2Func fin n<m x q |
343 | 343 |
344 L2F-iso : { Q : Set } → (fin : FiniteSet Q ) → (f : Q → Bool ) → (q : Q ) → (L2F fin a<sa (F2L fin a<sa (λ q _ → f q) )) q (toℕ<n _) ≡ f q | 344 L2F-iso : { Q : Set } → (fin : FiniteSet Q ) → (f : Q → Bool ) → (q : Q ) → (L2F fin a<sa (F2L fin a<sa (λ q _ → f q) )) q (toℕ<n _) ≡ f q |
345 L2F-iso {Q} fin f q = l2f m a<sa (toℕ<n _) where | 345 L2F-iso {Q} fin f q = l2f m a<sa (toℕ<n _) where |
346 m = FiniteSet.finite fin | 346 m = FiniteSet.finite fin |
347 lemma11f : {n : ℕ } → (n<m : n < m ) → ¬ ( FiniteSet.F←Q fin q ≡ fromℕ< n<m ) → toℕ (FiniteSet.F←Q fin q) ≤ n → toℕ (FiniteSet.F←Q fin q) < n | 347 lemma11f : {n : ℕ } → (n<m : n < m ) → ¬ ( FiniteSet.F←Q fin q ≡ fromℕ< n<m ) → toℕ (FiniteSet.F←Q fin q) ≤ n → toℕ (FiniteSet.F←Q fin q) < n |
350 lemma13 {0} {0} (s≤s z≤n) nt z≤n = ⊥-elim ( nt refl ) | 350 lemma13 {0} {0} (s≤s z≤n) nt z≤n = ⊥-elim ( nt refl ) |
351 lemma13 {suc _} {0} (s≤s (s≤s n<m)) nt z≤n = s≤s z≤n | 351 lemma13 {suc _} {0} (s≤s (s≤s n<m)) nt z≤n = s≤s z≤n |
352 lemma13 {suc n} {suc nq} n<m nt (s≤s nq≤n) = s≤s (lemma13 {n} {nq} (NP.<-trans a<sa n<m ) (λ eq → nt ( cong ( λ k → suc k ) eq )) nq≤n) | 352 lemma13 {suc n} {suc nq} n<m nt (s≤s nq≤n) = s≤s (lemma13 {n} {nq} (NP.<-trans a<sa n<m ) (λ eq → nt ( cong ( λ k → suc k ) eq )) nq≤n) |
353 lemma3f : {a b : ℕ } → (lt : a < b ) → fromℕ< (s≤s lt) ≡ suc (fromℕ< lt) | 353 lemma3f : {a b : ℕ } → (lt : a < b ) → fromℕ< (s≤s lt) ≡ suc (fromℕ< lt) |
354 lemma3f (s≤s lt) = refl | 354 lemma3f (s≤s lt) = refl |
355 lemma12f : {n m : ℕ } → (n<m : n < m ) → (f : Fin m ) → toℕ f ≡ n → f ≡ fromℕ< n<m | 355 lemma12f : {n m : ℕ } → (n<m : n < m ) → (f : Fin m ) → toℕ f ≡ n → f ≡ fromℕ< n<m |
356 lemma12f {zero} {suc m} (s≤s z≤n) zero refl = refl | 356 lemma12f {zero} {suc m} (s≤s z≤n) zero refl = refl |
357 lemma12f {suc n} {suc m} (s≤s n<m) (suc f) refl = subst ( λ k → suc f ≡ k ) (sym (lemma3f n<m) ) ( cong ( λ k → suc k ) ( lemma12f {n} {m} n<m f refl ) ) | 357 lemma12f {suc n} {suc m} (s≤s n<m) (suc f) refl = subst ( λ k → suc f ≡ k ) (sym (lemma3f n<m) ) ( cong ( λ k → suc k ) ( lemma12f {n} {m} n<m f refl ) ) |
358 l2f : (n : ℕ ) → (n<m : n < suc m ) → (q<n : toℕ (FiniteSet.F←Q fin q ) < n ) → (L2F fin n<m (F2L fin n<m (λ q _ → f q))) q q<n ≡ f q | 358 l2f : (n : ℕ ) → (n<m : n < suc m ) → (q<n : toℕ (FiniteSet.F←Q fin q ) < n ) → (L2F fin n<m (F2L fin n<m (λ q _ → f q))) q q<n ≡ f q |
359 l2f zero (s≤s z≤n) () | 359 l2f zero (s≤s z≤n) () |
360 l2f (suc n) (s≤s n<m) (s≤s n<q) with FiniteSet.F←Q fin q ≟ fromℕ< n<m | 360 l2f (suc n) (s≤s n<m) (s≤s n<q) with FiniteSet.F←Q fin q ≟ fromℕ< n<m |
361 l2f (suc n) (s≤s n<m) (s≤s n<q) | yes p = begin | 361 l2f (suc n) (s≤s n<m) (s≤s n<q) | yes p = begin |
362 f (FiniteSet.Q←F fin (fromℕ< n<m)) | 362 f (FiniteSet.Q←F fin (fromℕ< n<m)) |
363 ≡⟨ cong ( λ k → f (FiniteSet.Q←F fin k )) (sym p) ⟩ | 363 ≡⟨ cong ( λ k → f (FiniteSet.Q←F fin k )) (sym p) ⟩ |
364 f (FiniteSet.Q←F fin ( FiniteSet.F←Q fin q )) | 364 f (FiniteSet.Q←F fin ( FiniteSet.F←Q fin q )) |
365 ≡⟨ cong ( λ k → f k ) (FiniteSet.finiso→ fin _ ) ⟩ | 365 ≡⟨ cong ( λ k → f k ) (FiniteSet.finiso→ fin _ ) ⟩ |
366 f q | 366 f q |
367 ∎ where | 367 ∎ where |
368 open ≡-Reasoning | 368 open ≡-Reasoning |
369 l2f (suc n) (s≤s n<m) (s≤s n<q) | no ¬p = l2f n (NP.<-trans n<m a<sa) (lemma11f n<m ¬p n<q) | 369 l2f (suc n) (s≤s n<m) (s≤s n<q) | no ¬p = l2f n (NP.<-trans n<m a<sa) (lemma11f n<m ¬p n<q) |
370 | 370 |
371 Fin2Finite : ( n : ℕ ) → FiniteSet (Fin n) | 371 Fin2Finite : ( n : ℕ ) → FiniteSet (Fin n) |
372 Fin2Finite n = record { F←Q = λ x → x ; Q←F = λ x → x ; finiso← = λ q → refl ; finiso→ = λ q → refl } | 372 Fin2Finite n = record { F←Q = λ x → x ; Q←F = λ x → x ; finiso← = λ q → refl ; finiso→ = λ q → refl } |
373 | |
374 data fin-less { n : ℕ } { A : Set } (fa : FiniteSet A ) (n<m : n < FiniteSet.finite fa ) : Set where | |
375 elm1 : (elm : A ) → toℕ (FiniteSet.F←Q fa elm ) < n → fin-less fa n<m | |
376 | |
377 get-elm : { n : ℕ } { A : Set } {fa : FiniteSet A } {n<m : n < FiniteSet.finite fa } → fin-less fa n<m → A | |
378 get-elm (elm1 a _ ) = a | |
379 | |
380 get-< : { n : ℕ } { A : Set } {fa : FiniteSet A } {n<m : n < FiniteSet.finite fa }→ (f : fin-less fa n<m ) → toℕ (FiniteSet.F←Q fa (get-elm f )) < n | |
381 get-< (elm1 _ b ) = b | |
382 | |
383 fin-< : {A : Set} → { n : ℕ } → (fa : FiniteSet A ) → (n<m : n < FiniteSet.finite fa ) → FiniteSet (fin-less fa n<m ) | |
384 fin-< {A} {n} fa n<m = iso-fin (Fin2Finite n) iso where | |
385 m = FiniteSet.finite fa | |
386 iso : Bijection (Fin n) (fin-less fa n<m ) | |
387 lemma11f : {n : ℕ } {x : Fin n } → (n<m : n < m ) → toℕ (fromℕ< (NP.<-trans (toℕ<n x) n<m)) ≡ toℕ x | |
388 lemma11f {n} {x} n<m = begin | |
389 toℕ (fromℕ< (NP.<-trans (toℕ<n x) n<m)) | |
390 ≡⟨ toℕ-fromℕ< _ ⟩ | |
391 toℕ x | |
392 ∎ where | |
393 open ≡-Reasoning | |
394 fun← iso (elm1 elm x) = fromℕ< x | |
395 fun→ iso x = elm1 (FiniteSet.Q←F fa (fromℕ< (NP.<-trans x<n n<m ))) to<n where | |
396 x<n : toℕ x < n | |
397 x<n = toℕ<n x | |
398 to<n : toℕ (FiniteSet.F←Q fa (FiniteSet.Q←F fa (fromℕ< (NP.<-trans x<n n<m)))) < n | |
399 to<n = subst (λ k → toℕ k < n ) (sym (FiniteSet.finiso← fa _ )) (subst (λ k → k < n ) (sym ( toℕ-fromℕ< (NP.<-trans x<n n<m) )) x<n ) | |
400 fiso← iso x = lemma2 where | |
401 lemma2 : fromℕ< (subst (λ k → toℕ k < n) (sym | |
402 (FiniteSet.finiso← fa (fromℕ< (NP.<-trans (toℕ<n x) n<m)))) (subst (λ k → k < n) | |
403 (sym (toℕ-fromℕ< (NP.<-trans (toℕ<n x) n<m))) (toℕ<n x))) ≡ x | |
404 lemma2 = begin | |
405 fromℕ< (subst (λ k → toℕ k < n) (sym | |
406 (FiniteSet.finiso← fa (fromℕ< (NP.<-trans (toℕ<n x) n<m)))) (subst (λ k → k < n) | |
407 (sym (toℕ-fromℕ< (NP.<-trans (toℕ<n x) n<m))) (toℕ<n x))) | |
408 ≡⟨⟩ | |
409 fromℕ< ( subst (λ k → toℕ ( k ) < n ) (sym (FiniteSet.finiso← fa _ )) lemma6 ) | |
410 ≡⟨ lemma10 (cong (λ k → toℕ k) (FiniteSet.finiso← fa _ ) ) ⟩ | |
411 fromℕ< lemma6 | |
412 ≡⟨ lemma10 (lemma11 n<m ) ⟩ | |
413 fromℕ< ( toℕ<n x ) | |
414 ≡⟨ fromℕ<-toℕ _ _ ⟩ | |
415 x | |
416 ∎ where | |
417 open ≡-Reasoning | |
418 lemma6 : toℕ (fromℕ< (NP.<-trans (toℕ<n x) n<m)) < n | |
419 lemma6 = subst ( λ k → k < n ) (sym (toℕ-fromℕ< (NP.<-trans (toℕ<n x) n<m))) (toℕ<n x ) | |
420 fiso→ iso (elm1 elm x) = ? where -- fin-less-cong fa n<m _ _ lemma (lemma8 (cong (λ k → toℕ (FiniteSet.F←Q fa k) ) lemma ) ) where | |
421 lemma13 : toℕ (fromℕ< x) ≡ toℕ (FiniteSet.F←Q fa elm) | |
422 lemma13 = begin | |
423 toℕ (fromℕ< x) | |
424 ≡⟨ toℕ-fromℕ< _ ⟩ | |
425 toℕ (FiniteSet.F←Q fa elm) | |
426 ∎ where open ≡-Reasoning | |
427 lemma : FiniteSet.Q←F fa (fromℕ< (NP.<-trans (toℕ<n (Bijection.fun← iso (elm1 elm x))) n<m)) ≡ elm | |
428 lemma = begin | |
429 FiniteSet.Q←F fa (fromℕ< (NP.<-trans (toℕ<n (Bijection.fun← iso (elm1 elm x))) n<m)) | |
430 ≡⟨⟩ | |
431 FiniteSet.Q←F fa (fromℕ< ( NP.<-trans (toℕ<n ( fromℕ< x ) ) n<m)) | |
432 ≡⟨ cong (λ k → FiniteSet.Q←F fa k) (lemma10 lemma13 ) ⟩ | |
433 FiniteSet.Q←F fa (fromℕ< ( NP.<-trans x n<m)) | |
434 ≡⟨ cong (λ k → FiniteSet.Q←F fa k) (lemma10 refl ) ⟩ | |
435 FiniteSet.Q←F fa (fromℕ< ( toℕ<n (FiniteSet.F←Q fa elm))) | |
436 ≡⟨ cong (λ k → FiniteSet.Q←F fa k ) ( fromℕ<-toℕ _ _ ) ⟩ | |
437 FiniteSet.Q←F fa (FiniteSet.F←Q fa elm ) | |
438 ≡⟨ FiniteSet.finiso→ fa _ ⟩ | |
439 elm | |
440 ∎ where open ≡-Reasoning | |
441 | 373 |
442 open import Data.List | 374 open import Data.List |
443 | 375 |
444 open FiniteSet | 376 open FiniteSet |
445 | 377 |
471 phase1 finq q (x ∷ qs) with equal? finq q x | 403 phase1 finq q (x ∷ qs) with equal? finq q x |
472 ... | true = phase2 finq q qs | 404 ... | true = phase2 finq q qs |
473 ... | false = phase1 finq q qs | 405 ... | false = phase1 finq q qs |
474 | 406 |
475 dup-in-list : { Q : Set } (finq : FiniteSet Q) (q : Q) (qs : List Q ) → Bool | 407 dup-in-list : { Q : Set } (finq : FiniteSet Q) (q : Q) (qs : List Q ) → Bool |
476 dup-in-list {Q} finq q qs = phase1 finq q qs | 408 dup-in-list {Q} finq q qs = phase1 finq q qs |
477 | 409 |
478 -- | 410 -- |
479 -- if length of the list is longer than kinds of a finite set, there is a duplicate | 411 -- if length of the list is longer than kinds of a finite set, there is a duplicate |
480 -- prove this based on the theorem on Data.Fin | 412 -- prove this based on the theorem on Data.Fin |
481 -- | 413 -- |
482 | 414 |
483 dup-in-list+fin : { Q : Set } (finq : FiniteSet Q) | 415 dup-in-list+fin : { Q : Set } (finq : FiniteSet Q) |
484 → (q : Q) (qs : List Q ) | 416 → (q : Q) (qs : List Q ) |
485 → fin-dup-in-list (F←Q finq q) (map (F←Q finq) qs) ≡ true | 417 → fin-dup-in-list (F←Q finq q) (map (F←Q finq) qs) ≡ true |
486 → dup-in-list finq q qs ≡ true | 418 → dup-in-list finq q qs ≡ true |
487 dup-in-list+fin {Q} finq q qs p = i-phase1 qs p where | 419 dup-in-list+fin {Q} finq q qs p = i-phase1 qs p where |
488 i-phase2 : (qs : List Q) → fin-phase2 (F←Q finq q) (map (F←Q finq) qs) ≡ true | 420 i-phase2 : (qs : List Q) → fin-phase2 (F←Q finq q) (map (F←Q finq) qs) ≡ true |
489 → phase2 finq q qs ≡ true | 421 → phase2 finq q qs ≡ true |
490 i-phase2 (x ∷ qs) p with equal? finq q x in eq | <-fcmp (F←Q finq q) (F←Q finq x) | 422 i-phase2 (x ∷ qs) p with equal? finq q x in eq | <-fcmp (F←Q finq q) (F←Q finq x) |
491 ... | true | t = refl | 423 ... | true | t = refl |
492 ... | false | tri< a ¬b ¬c = i-phase2 qs p | 424 ... | false | tri< a ¬b ¬c = i-phase2 qs p |
493 ... | false | tri≈ ¬a b ¬c = ⊥-elim (¬-bool eq | 425 ... | false | tri≈ ¬a b ¬c = ⊥-elim (¬-bool eq |
494 (subst₂ (λ j k → equal? finq j k ≡ true) (finiso→ finq q) (subst (λ k → Q←F finq k ≡ x) (sym b) (finiso→ finq x)) ( equal?-refl finq ))) | 426 (subst₂ (λ j k → equal? finq j k ≡ true) (finiso→ finq q) (subst (λ k → Q←F finq k ≡ x) (sym b) (finiso→ finq x)) ( equal?-refl finq ))) |
495 ... | false | tri> ¬a ¬b c = i-phase2 qs p | 427 ... | false | tri> ¬a ¬b c = i-phase2 qs p |
496 i-phase1 : (qs : List Q) → fin-phase1 (F←Q finq q) (map (F←Q finq) qs) ≡ true | 428 i-phase1 : (qs : List Q) → fin-phase1 (F←Q finq q) (map (F←Q finq) qs) ≡ true |
497 → phase1 finq q qs ≡ true | 429 → phase1 finq q qs ≡ true |
498 i-phase1 (x ∷ qs) p with equal? finq q x in eq | <-fcmp (F←Q finq q) (F←Q finq x) | 430 i-phase1 (x ∷ qs) p with equal? finq q x in eq | <-fcmp (F←Q finq q) (F←Q finq x) |
499 ... | true | tri< a ¬b ¬c = ⊥-elim ( nat-≡< (cong (λ x → toℕ (F←Q finq x)) ( equal→refl finq eq )) a ) | 431 ... | true | tri< a ¬b ¬c = ⊥-elim ( nat-≡< (cong (λ x → toℕ (F←Q finq x)) ( equal→refl finq eq )) a ) |
500 ... | true | tri≈ ¬a b ¬c = i-phase2 qs p | 432 ... | true | tri≈ ¬a b ¬c = i-phase2 qs p |
501 ... | true | tri> ¬a ¬b c = ⊥-elim ( nat-≡< (cong (λ x → toℕ (F←Q finq x)) (sym ( equal→refl finq eq ))) c ) | 433 ... | true | tri> ¬a ¬b c = ⊥-elim ( nat-≡< (cong (λ x → toℕ (F←Q finq x)) (sym ( equal→refl finq eq ))) c ) |
502 ... | false | tri< a ¬b ¬c = i-phase1 qs p | 434 ... | false | tri< a ¬b ¬c = i-phase1 qs p |
521 dl01 = subst (λ k → fin-dup-in-list k (map (F←Q finq) qs) ≡ true ) | 453 dl01 = subst (λ k → fin-dup-in-list k (map (F←Q finq) qs) ≡ true ) |
522 (sym (finiso← finq _)) ( FDup-in-list.is-dup dl ) | 454 (sym (finiso← finq _)) ( FDup-in-list.is-dup dl ) |
523 | 455 |
524 open import bijection using ( InjectiveF ; Is ) | 456 open import bijection using ( InjectiveF ; Is ) |
525 | 457 |
526 -- open import Relation.Binary.HeterogeneousEquality as HE using (_≅_ ) | 458 -- open import Relation.Binary.HeterogeneousEquality as HE using (_≅_ ) |
527 | 459 |
528 inject-fin : {A B : Set} (fa : FiniteSet A ) | 460 inject-fin : {A B : Set} (fa : FiniteSet A ) |
529 → (fi : InjectiveF B A) | 461 → (fi : InjectiveF B A) |
530 → (is-B : (a : A ) → Dec (Is B A (InjectiveF.f fi) a) ) | 462 → (is-B : (a : A ) → Dec (Is B A (InjectiveF.f fi) a) ) |
531 → FiniteSet B | 463 → FiniteSet B |
532 inject-fin {A} {B} fa fi is-B with finite fa in eq1 | 464 inject-fin {A} {B} fa fi is-B with finite fa in eq1 |
533 ... | zero = record { | 465 ... | zero = record { |
534 finite = 0 | 466 finite = 0 |
535 ; Q←F = λ () | 467 ; Q←F = λ () |
536 ; F←Q = λ b → ⊥-elim ( lem00 b) | 468 ; F←Q = λ b → ⊥-elim ( lem00 b) |
537 ; finiso→ = λ b → ⊥-elim ( lem00 b) | 469 ; finiso→ = λ b → ⊥-elim ( lem00 b) |
549 } where | 481 } where |
550 f = InjectiveF.f fi | 482 f = InjectiveF.f fi |
551 pfa<fa : pfa < finite fa | 483 pfa<fa : pfa < finite fa |
552 pfa<fa = subst (λ k → pfa < k ) (sym eq1) a<sa | 484 pfa<fa = subst (λ k → pfa < k ) (sym eq1) a<sa |
553 0<fa : 0 < finite fa | 485 0<fa : 0 < finite fa |
554 0<fa = <-transˡ (s≤s z≤n) pfa<fa | 486 0<fa = <-transˡ (s≤s z≤n) pfa<fa |
555 | 487 |
556 count-B : ℕ → ℕ | 488 count-B : ℕ → ℕ |
557 count-B zero with is-B (Q←F fa ( fromℕ< {0} 0<fa )) | 489 count-B zero with is-B (Q←F fa ( fromℕ< {0} 0<fa )) |
558 ... | yes isb = 1 | 490 ... | yes isb = 1 |
559 ... | no nisb = 0 | 491 ... | no nisb = 0 |
580 ... | case1 refl = ≤-refl | 512 ... | case1 refl = ≤-refl |
581 ... | case2 i<j = lem00 _ _ i<j where | 513 ... | case2 i<j = lem00 _ _ i<j where |
582 lem00 : (i j : ℕ) → i < j → count-B i ≤ count-B j | 514 lem00 : (i j : ℕ) → i < j → count-B i ≤ count-B j |
583 lem00 i (suc j) (s≤s i<j) = ≤-trans (count-B-mono i<j) (lem01 j) where | 515 lem00 i (suc j) (s≤s i<j) = ≤-trans (count-B-mono i<j) (lem01 j) where |
584 lem01 : (j : ℕ) → count-B j ≤ count-B (suc j) | 516 lem01 : (j : ℕ) → count-B j ≤ count-B (suc j) |
585 lem01 zero with <-cmp (finite fa) 1 | 517 lem01 zero with <-cmp (finite fa) 1 |
586 lem01 zero | tri< a ¬b ¬c = ≤-refl | 518 lem01 zero | tri< a ¬b ¬c = ≤-refl |
587 lem01 zero | tri≈ ¬a b ¬c = ≤-refl | 519 lem01 zero | tri≈ ¬a b ¬c = ≤-refl |
588 lem01 zero | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) | is-B (Q←F fa ( fromℕ< {0} 0<fa )) | 520 lem01 zero | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) | is-B (Q←F fa ( fromℕ< {0} 0<fa )) |
589 ... | yes isb1 | yes isb0 = s≤s z≤n | 521 ... | yes isb1 | yes isb0 = s≤s z≤n |
590 ... | yes isb1 | no nisb0 = z≤n | 522 ... | yes isb1 | no nisb0 = z≤n |
591 ... | no nisb1 | yes isb0 = refl-≤≡ (sym lem14 ) where | 523 ... | no nisb1 | yes isb0 = refl-≤≡ (sym lem14 ) where |
592 lem14 : count-B 0 ≡ 1 | 524 lem14 : count-B 0 ≡ 1 -- in-equality does not work we have to repeat the proof |
593 lem14 with is-B (Q←F fa ( fromℕ< {0} 0<fa )) | 525 lem14 with is-B (Q←F fa ( fromℕ< {0} 0<fa )) |
594 ... | yes isb = refl | 526 ... | yes isb = refl |
595 ... | no ne = ⊥-elim (ne isb0) | 527 ... | no ne = ⊥-elim (ne isb0) |
596 ... | no nisb1 | no nisb0 = z≤n | 528 ... | no nisb1 | no nisb0 = z≤n |
597 lem01 (suc i) with <-cmp (finite fa) (suc i) | <-cmp (finite fa) (suc (suc i)) | 529 lem01 (suc i) with <-cmp (finite fa) (suc i) | <-cmp (finite fa) (suc (suc i)) |
598 ... | tri< a ¬b ¬c | tri< a₁ ¬b₁ ¬c₁ = refl-≤≡ (sym lem14) where | 530 ... | tri< a ¬b ¬c | tri< a₁ ¬b₁ ¬c₁ = refl-≤≡ (sym lem14) where |
599 lem14 : count-B (suc i) ≡ count-B i | 531 lem14 : count-B (suc i) ≡ count-B i |
600 lem14 with <-cmp (finite fa) (suc i) | 532 lem14 with <-cmp (finite fa) (suc i) |
601 ... | tri< a ¬b ¬c = refl | 533 ... | tri< a ¬b ¬c = refl |
602 ... | tri≈ ¬a b ¬c = ⊥-elim ( ¬a a ) | 534 ... | tri≈ ¬a b ¬c = ⊥-elim ( ¬a a ) |
603 ... | tri> ¬a ¬b c = ⊥-elim ( ¬a a ) | 535 ... | tri> ¬a ¬b c = ⊥-elim ( ¬a a ) |
604 ... | tri< a ¬b ¬c | tri≈ ¬a b ¬c₁ = ⊥-elim (nat-≡< b (<-trans a a<sa)) | 536 ... | tri< a ¬b ¬c | tri≈ ¬a b ¬c₁ = ⊥-elim (nat-≡< b (<-trans a a<sa)) |
605 ... | tri< a ¬b ¬c | tri> ¬a ¬b₁ c = ⊥-elim (nat-<> a (<-trans a<sa c) ) | 537 ... | tri< a ¬b ¬c | tri> ¬a ¬b₁ c = ⊥-elim (nat-<> a (<-trans a<sa c) ) |
606 ... | tri≈ ¬a b ¬c | tri< a ¬b ¬c₁ = refl-≤≡ (sym ?) | 538 ... | tri≈ ¬a b ¬c | tri< a ¬b ¬c₁ = refl-≤≡ (sym lem14 ) where |
539 lem14 : count-B (suc i) ≡ count-B i | |
540 lem14 with <-cmp (finite fa) (suc i) | |
541 ... | tri< a ¬b ¬c = refl | |
542 ... | tri≈ ¬a b ¬c = refl | |
543 ... | tri> ¬a ¬b c = ⊥-elim ( ¬c c ) | |
607 ... | tri≈ ¬a b ¬c | tri≈ ¬a₁ b₁ ¬c₁ = ⊥-elim (nat-≡< (sym b) (subst (λ k → _ < k ) (sym b₁) a<sa) ) | 544 ... | tri≈ ¬a b ¬c | tri≈ ¬a₁ b₁ ¬c₁ = ⊥-elim (nat-≡< (sym b) (subst (λ k → _ < k ) (sym b₁) a<sa) ) |
608 ... | tri≈ ¬a b ¬c | tri> ¬a₁ ¬b c = ⊥-elim (nat-≡< (sym b) (<-trans a<sa c)) | 545 ... | tri≈ ¬a b ¬c | tri> ¬a₁ ¬b c = ⊥-elim (nat-≡< (sym b) (<-trans a<sa c)) |
609 ... | tri> ¬a ¬b c | tri< a ¬b₁ ¬c = ⊥-elim (nat-≤> a (<-transʳ c a<sa ) ) | 546 ... | tri> ¬a ¬b c | tri< a ¬b₁ ¬c = ⊥-elim (nat-≤> a (<-transʳ c a<sa ) ) |
610 ... | tri> ¬a ¬b c | tri≈ ¬a₁ b ¬c with is-B (Q←F fa (fromℕ< c)) | 547 ... | tri> ¬a ¬b c | tri≈ ¬a₁ b ¬c with is-B (Q←F fa (fromℕ< c)) |
611 ... | yes isb = refl-≤≡ (sym ?) | 548 ... | yes isb = refl-≤≡ (sym lem14) where |
612 ... | no nisb = refl-≤≡ (sym ?) | 549 lem14 : count-B (suc i) ≡ suc (count-B i) |
613 lem01 (suc i) | tri> ¬a ¬b c | tri> ¬a₁ ¬b₁ c₁ | 550 lem14 with <-cmp (finite fa) (suc i) |
614 with is-B (Q←F fa (fromℕ< c)) | is-B (Q←F fa (fromℕ< c₁)) | 551 ... | tri< a₂ ¬b₂ ¬c₂ = ⊥-elim (¬c₂ c) |
615 ... | yes isb0 | yes isb1 = ≤-trans (refl-≤≡ (sym ?)) a≤sa | 552 ... | tri≈ ¬a₂ b₂ ¬c₂ = ⊥-elim (¬c₂ c) |
616 ... | yes isb0 | no nisb1 = refl-≤≡ (sym ?) | 553 ... | tri> ¬a₂ ¬b₂ c₂ with is-B (Q←F fa ( fromℕ< c₂ )) |
617 ... | no nisb0 | yes isb1 = ≤-trans (refl-≤≡ (sym ?)) a≤sa | 554 ... | yes isb = refl |
618 ... | no nisb0 | no nisb1 = refl-≤≡ (sym ?) | 555 ... | no ne = ⊥-elim (ne record {a = Is.a isb ; fa=c = trans (Is.fa=c isb) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) |
556 ... | no nisb = refl-≤≡ (sym lem14) where | |
557 lem14 : count-B (suc i) ≡ count-B i | |
558 lem14 with <-cmp (finite fa) (suc i) | |
559 ... | tri< a₂ ¬b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
560 ... | tri≈ ¬a₂ b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
561 ... | tri> ¬a₂ ¬b₂ c₂ with is-B (Q←F fa ( fromℕ< c₂ )) | |
562 ... | yes isb = ⊥-elim (nisb record {a = Is.a isb ; fa=c = trans (Is.fa=c isb) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
563 ... | no ne = refl | |
564 lem01 (suc i) | tri> ¬a ¬b c | tri> ¬a₁ ¬b₁ c₁ | |
565 with is-B (Q←F fa (fromℕ< c)) | is-B (Q←F fa (fromℕ< c₁)) | |
566 ... | yes isb0 | yes isb1 = ≤-trans (refl-≤≡ (sym lem14)) a≤sa where | |
567 lem14 : count-B (suc i) ≡ suc (count-B i) | |
568 lem14 with <-cmp (finite fa) (suc i) | |
569 ... | tri< a₂ ¬b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
570 ... | tri≈ ¬a₂ b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
571 ... | tri> ¬a₂ ¬b₂ c₂ with is-B (Q←F fa ( fromℕ< c₂ )) | |
572 ... | no ne = ⊥-elim (ne record {a = Is.a isb0 ; fa=c = trans (Is.fa=c isb0) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
573 ... | yes isb = refl | |
574 ... | yes isb0 | no nisb1 = refl-≤≡ (sym lem14) where | |
575 lem14 : count-B (suc i) ≡ suc (count-B i) | |
576 lem14 with <-cmp (finite fa) (suc i) | |
577 ... | tri< a₂ ¬b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
578 ... | tri≈ ¬a₂ b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
579 ... | tri> ¬a₂ ¬b₂ c₂ with is-B (Q←F fa ( fromℕ< c₂ )) | |
580 ... | no ne = ⊥-elim (ne record {a = Is.a isb0 ; fa=c = trans (Is.fa=c isb0) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
581 ... | yes isb = refl | |
582 ... | no nisb0 | yes isb1 = ≤-trans (refl-≤≡ (sym lem14)) a≤sa where | |
583 lem14 : count-B (suc i) ≡ count-B i | |
584 lem14 with <-cmp (finite fa) (suc i) | |
585 ... | tri< a₂ ¬b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
586 ... | tri≈ ¬a₂ b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
587 ... | tri> ¬a₂ ¬b₂ c₂ with is-B (Q←F fa ( fromℕ< c₂ )) | |
588 ... | no ne = refl | |
589 ... | yes isb = ⊥-elim (nisb0 record {a = Is.a isb ; fa=c = trans (Is.fa=c isb) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
590 ... | no nisb0 | no nisb1 = refl-≤≡ (sym lem14) where | |
591 lem14 : count-B (suc i) ≡ count-B i | |
592 lem14 with <-cmp (finite fa) (suc i) | |
593 ... | tri< a₂ ¬b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
594 ... | tri≈ ¬a₂ b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
595 ... | tri> ¬a₂ ¬b₂ c₂ with is-B (Q←F fa ( fromℕ< c₂ )) | |
596 ... | no ne = refl | |
597 ... | yes isb = ⊥-elim (nisb0 record {a = Is.a isb ; fa=c = trans (Is.fa=c isb) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
619 | 598 |
620 lem31 : (b : B) → 0 < count-B (toℕ (F←Q fa (f b))) | 599 lem31 : (b : B) → 0 < count-B (toℕ (F←Q fa (f b))) |
621 lem31 b = lem32 (toℕ (F←Q fa (f b))) refl where | 600 lem31 b = lem32 (toℕ (F←Q fa (f b))) refl where |
622 lem32 : (i : ℕ) → toℕ (F←Q fa (f b)) ≡ i → 0 < count-B i | 601 lem32 : (i : ℕ) → toℕ (F←Q fa (f b)) ≡ i → 0 < count-B i |
623 lem32 zero eq with is-B (Q←F fa ( fromℕ< {0} 0<fa )) | 602 lem32 zero eq with is-B (Q←F fa ( fromℕ< {0} 0<fa )) |
624 ... | yes isb = s≤s z≤n | 603 ... | yes isb = s≤s z≤n |
625 ... | no nisb = ⊥-elim ( nisb record { a = b ; fa=c = lem33 } ) where | 604 ... | no nisb = ⊥-elim ( nisb record { a = b ; fa=c = lem33 } ) where |
626 lem33 : f b ≡ Q←F fa ( fromℕ< {0} 0<fa ) | 605 lem33 : f b ≡ Q←F fa ( fromℕ< {0} 0<fa ) |
627 lem33 = begin | 606 lem33 = begin |
628 f b ≡⟨ sym (finiso→ fa _) ⟩ | 607 f b ≡⟨ sym (finiso→ fa _) ⟩ |
629 Q←F fa ( F←Q fa (f b)) ≡⟨ sym (cong (λ k → Q←F fa k) ( fromℕ<-toℕ _ (fin<n _))) ⟩ | 608 Q←F fa ( F←Q fa (f b)) ≡⟨ sym (cong (λ k → Q←F fa k) ( fromℕ<-toℕ _ (fin<n _))) ⟩ |
630 Q←F fa ( fromℕ< (fin<n _) ) ≡⟨ cong (λ k → Q←F fa k) (fromℕ<-cong _ _ eq (fin<n _) 0<fa) ⟩ | 609 Q←F fa ( fromℕ< (fin<n _) ) ≡⟨ cong (λ k → Q←F fa k) (fromℕ<-cong _ _ eq (fin<n _) 0<fa) ⟩ |
631 Q←F fa ( fromℕ< {0} 0<fa ) ∎ where | 610 Q←F fa ( fromℕ< {0} 0<fa ) ∎ where |
632 open ≡-Reasoning | 611 open ≡-Reasoning |
633 lem32 (suc i) eq with <-cmp (finite fa) (suc i) | 612 lem32 (suc i) eq with <-cmp (finite fa) (suc i) |
634 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≡< eq (<-trans (fin<n _) a) ) | 613 ... | tri< a ¬b ¬c = ⊥-elim ( nat-≡< eq (<-trans (fin<n _) a) ) |
635 ... | tri≈ ¬a eq1 ¬c = ⊥-elim ( nat-≡< eq (subst (λ k → toℕ (F←Q fa (f b)) < k ) eq1 (fin<n _))) | 614 ... | tri≈ ¬a eq1 ¬c = ⊥-elim ( nat-≡< eq (subst (λ k → toℕ (F←Q fa (f b)) < k ) eq1 (fin<n _))) |
636 ... | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) | 615 ... | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) |
637 ... | yes isb = s≤s z≤n | 616 ... | yes isb = s≤s z≤n |
638 ... | no nisb = ⊥-elim ( nisb record { a = b ; fa=c = lem33 } ) where | 617 ... | no nisb = ⊥-elim ( nisb record { a = b ; fa=c = lem33 } ) where |
639 lem33 : f b ≡ Q←F fa ( fromℕ< c) | 618 lem33 : f b ≡ Q←F fa ( fromℕ< c) |
640 lem33 = begin | 619 lem33 = begin |
641 f b ≡⟨ sym (finiso→ fa _) ⟩ | 620 f b ≡⟨ sym (finiso→ fa _) ⟩ |
642 Q←F fa ( F←Q fa (f b)) ≡⟨ sym (cong (λ k → Q←F fa k) ( fromℕ<-toℕ _ (fin<n _))) ⟩ | 621 Q←F fa ( F←Q fa (f b)) ≡⟨ sym (cong (λ k → Q←F fa k) ( fromℕ<-toℕ _ (fin<n _))) ⟩ |
643 Q←F fa ( fromℕ< (fin<n _) ) ≡⟨ cong (λ k → Q←F fa k) (fromℕ<-cong _ _ eq (fin<n _) c ) ⟩ | 622 Q←F fa ( fromℕ< (fin<n _) ) ≡⟨ cong (λ k → Q←F fa k) (fromℕ<-cong _ _ eq (fin<n _) c ) ⟩ |
644 Q←F fa ( fromℕ< c ) ∎ where | 623 Q←F fa ( fromℕ< c ) ∎ where |
645 open ≡-Reasoning | 624 open ≡-Reasoning |
646 | 625 |
647 cb<mb : (b : B) → pred (count-B (toℕ (F←Q fa (f b)))) < maxb | 626 cb<mb : (b : B) → pred (count-B (toℕ (F←Q fa (f b)))) < maxb |
648 cb<mb b = sx≤y→x<y ( begin | 627 cb<mb b = sx≤y→x<y ( begin |
649 suc ( pred (count-B (toℕ (F←Q fa (f b))))) ≡⟨ sucprd (lem31 b) ⟩ | 628 suc ( pred (count-B (toℕ (F←Q fa (f b))))) ≡⟨ sucprd (lem31 b) ⟩ |
650 count-B (toℕ (F←Q fa (f b))) ≤⟨ lem02 ⟩ | 629 count-B (toℕ (F←Q fa (f b))) ≤⟨ lem02 ⟩ |
651 count-B (finite fa) ∎ ) where | 630 count-B (finite fa) ∎ ) where |
652 open ≤-Reasoning | 631 open ≤-Reasoning |
653 lem02 : count-B (toℕ (F←Q fa (f b))) ≤ count-B (finite fa) | 632 lem02 : count-B (toℕ (F←Q fa (f b))) ≤ count-B (finite fa) |
654 lem02 = count-B-mono (<to≤ (fin<n {_} (F←Q fa (f b)))) | 633 lem02 = count-B-mono (<to≤ (fin<n {_} (F←Q fa (f b)))) |
655 | 634 |
656 cb00 : (n : ℕ) → n < count-B (finite fa) → CountB n | 635 cb00 : (n : ℕ) → n < count-B (finite fa) → CountB n |
657 cb00 n n<cb = lem09 (finite fa) (count-B (finite fa)) (<-transˡ a<sa n<cb) refl where | 636 cb00 n n<cb = lem09 (finite fa) (count-B (finite fa)) (<-transˡ a<sa n<cb) refl where |
658 | 637 |
659 lem06 : (i j : ℕ) → (i<fa : i < finite fa) (j<fa : j < finite fa) | 638 lem06 : (i j : ℕ) → (i<fa : i < finite fa) (j<fa : j < finite fa) |
660 → Is B A f (Q←F fa (fromℕ< i<fa)) → Is B A f (Q←F fa (fromℕ< j<fa)) → count-B i ≡ count-B j → i ≡ j | 639 → Is B A f (Q←F fa (fromℕ< i<fa)) → Is B A f (Q←F fa (fromℕ< j<fa)) → count-B i ≡ count-B j → i ≡ j |
661 lem06 i j i<fa j<fa bi bj eq = lem08 where | 640 lem06 i j i<fa j<fa bi bj eq = lem08 where |
662 lem20 : (i j : ℕ) → i < j → (i<fa : i < finite fa) (j<fa : j < finite fa) | 641 lem20 : (i j : ℕ) → i < j → (i<fa : i < finite fa) (j<fa : j < finite fa) |
663 → Is B A f (Q←F fa (fromℕ< i<fa)) → Is B A f (Q←F fa (fromℕ< j<fa)) → count-B i < count-B j | 642 → Is B A f (Q←F fa (fromℕ< i<fa)) → Is B A f (Q←F fa (fromℕ< j<fa)) → count-B i < count-B j |
664 lem20 zero (suc j) i<j i<fa j<fa bi bj with <-cmp (finite fa) (suc j) | 643 lem20 zero (suc j) i<j i<fa j<fa bi bj with <-cmp (finite fa) (suc j) |
665 ... | tri< a ¬b ¬c = ⊥-elim (¬c j<fa) | 644 ... | tri< a ¬b ¬c = ⊥-elim (¬c j<fa) |
666 ... | tri≈ ¬a b ¬c = ⊥-elim (¬c j<fa) | 645 ... | tri≈ ¬a b ¬c = ⊥-elim (¬c j<fa) |
667 ... | tri> ¬a ¬b c with is-B (Q←F fa ( fromℕ< 0<fa )) | is-B (Q←F fa (fromℕ< c)) | 646 ... | tri> ¬a ¬b c with is-B (Q←F fa ( fromℕ< 0<fa )) | is-B (Q←F fa (fromℕ< c)) |
668 ... | no nisc | _ = ⊥-elim (nisc record { a = Is.a bi ; fa=c = lem26 } ) where | 647 ... | no nisc | _ = ⊥-elim (nisc record { a = Is.a bi ; fa=c = lem26 } ) where |
669 lem26 : f (Is.a bi) ≡ Q←F fa (fromℕ< 0<fa) | 648 lem26 : f (Is.a bi) ≡ Q←F fa (fromℕ< 0<fa) |
670 lem26 = trans (Is.fa=c bi) (cong (Q←F fa) (fromℕ<-cong _ _ refl i<fa 0<fa) ) | 649 lem26 = trans (Is.fa=c bi) (cong (Q←F fa) (fromℕ<-cong _ _ refl i<fa 0<fa) ) |
671 ... | yes _ | no nisc = ⊥-elim (nisc record { a = Is.a bj ; fa=c = lem26 } ) where | 650 ... | yes _ | no nisc = ⊥-elim (nisc record { a = Is.a bj ; fa=c = lem26 } ) where |
672 lem26 : f (Is.a bj) ≡ Q←F fa (fromℕ< c) | 651 lem26 : f (Is.a bj) ≡ Q←F fa (fromℕ< c) |
673 lem26 = trans (Is.fa=c bj) (cong (Q←F fa) (fromℕ<-cong _ _ refl j<fa c) ) | 652 lem26 = trans (Is.fa=c bj) (cong (Q←F fa) (fromℕ<-cong _ _ refl j<fa c) ) |
674 ... | yes _ | yes _ = lem25 where | 653 ... | yes isb1 | yes _ = lem25 where |
654 lem14 : count-B 0 ≡ 1 | |
655 lem14 with is-B (Q←F fa ( fromℕ< 0<fa )) | |
656 ... | no ne = ⊥-elim (ne record {a = Is.a isb1 ; fa=c = trans (Is.fa=c isb1) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
657 ... | yes isb = refl | |
675 lem25 : 2 ≤ suc (count-B j) | 658 lem25 : 2 ≤ suc (count-B j) |
676 lem25 = begin | 659 lem25 = begin |
677 2 ≡⟨ cong suc (sym ?) ⟩ | 660 2 ≡⟨ cong suc (sym lem14) ⟩ |
678 suc (count-B 0) ≤⟨ s≤s (count-B-mono {0} {j} z≤n) ⟩ | 661 suc (count-B 0) ≤⟨ s≤s (count-B-mono {0} {j} z≤n) ⟩ |
679 suc (count-B j) ∎ where open ≤-Reasoning | 662 suc (count-B j) ∎ where open ≤-Reasoning |
680 lem20 (suc i) zero () i<fa j<fa bi bj | 663 lem20 (suc i) zero () i<fa j<fa bi bj |
681 lem20 (suc i) (suc j) (s≤s i<j) i<fa j<fa bi bj = lem21 where | 664 lem20 (suc i) (suc j) (s≤s i<j) i<fa j<fa bi bj = lem21 where |
682 -- | 665 -- |
683 -- i < suc i ≤ j | 666 -- i < suc i ≤ j |
684 -- cb i < suc (cb i) < cb (suc i) ≤ cb j | 667 -- cb i < suc (cb i) < cb (suc i) ≤ cb j |
685 -- | 668 -- |
686 lem23 : suc (count-B j) ≡ count-B (suc j) | 669 lem23 : suc (count-B j) ≡ count-B (suc j) |
687 lem23 with <-cmp (finite fa) (suc j) | 670 lem23 with <-cmp (finite fa) (suc j) |
688 ... | tri< a ¬b ¬c = ⊥-elim (¬c j<fa) | 671 ... | tri< a ¬b ¬c = ⊥-elim (¬c j<fa) |
689 ... | tri≈ ¬a b ¬c = ⊥-elim (¬c j<fa) | 672 ... | tri≈ ¬a b ¬c = ⊥-elim (¬c j<fa) |
690 ... | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) | 673 ... | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) |
691 ... | yes _ = refl | 674 ... | yes _ = refl |
692 ... | no nisa = ⊥-elim ( nisa record { a = Is.a bj ; fa=c = lem26 } ) where | 675 ... | no nisa = ⊥-elim ( nisa record { a = Is.a bj ; fa=c = lem26 } ) where |
693 lem26 : f (Is.a bj) ≡ Q←F fa (fromℕ< c) | 676 lem26 : f (Is.a bj) ≡ Q←F fa (fromℕ< c) |
694 lem26 = trans (Is.fa=c bj) (cong (Q←F fa) (fromℕ<-cong _ _ refl j<fa c) ) | 677 lem26 = trans (Is.fa=c bj) (cong (Q←F fa) (fromℕ<-cong _ _ refl j<fa c) ) |
695 lem21 : count-B (suc i) < count-B (suc j) | 678 lem21 : count-B (suc i) < count-B (suc j) |
704 ... | tri< a ¬b ¬c = ⊥-elim (nat-≡< eq ( lem20 i j a i<fa j<fa bi bj )) | 687 ... | tri< a ¬b ¬c = ⊥-elim (nat-≡< eq ( lem20 i j a i<fa j<fa bi bj )) |
705 ... | tri≈ ¬a b ¬c = b | 688 ... | tri≈ ¬a b ¬c = b |
706 ... | tri> ¬a ¬b c₁ = ⊥-elim (nat-≡< (sym eq) ( lem20 j i c₁ j<fa i<fa bj bi )) | 689 ... | tri> ¬a ¬b c₁ = ⊥-elim (nat-≡< (sym eq) ( lem20 j i c₁ j<fa i<fa bj bi )) |
707 | 690 |
708 lem09 : (i j : ℕ) → suc n ≤ j → j ≡ count-B i → CountB n | 691 lem09 : (i j : ℕ) → suc n ≤ j → j ≡ count-B i → CountB n |
709 lem09 0 (suc j) (s≤s le) eq with is-B (Q←F fa (fromℕ< {0} 0<fa )) | 692 lem09 0 (suc j) (s≤s le) eq with is-B (Q←F fa (fromℕ< {0} 0<fa )) |
710 ... | no nisb = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) ) | 693 ... | no nisb = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) ) |
711 ... | yes isb with ≤-∨ (s≤s le) | 694 ... | yes isb with ≤-∨ (s≤s le) |
712 ... | case1 eq2 = record { b = Is.a isb ; cb = 0 ; b=cn = lem10 ; cb=n = trans ? (sym (trans eq2 eq)) | 695 ... | case1 eq2 = record { b = Is.a isb ; cb = 0 ; b=cn = lem10 ; cb=n = trans lem14 (sym (trans eq2 eq)) |
713 ; cb-inject = λ cb1 c1<fa b1 eq → lem06 0 cb1 0<fa c1<fa isb b1 eq } where | 696 ; cb-inject = λ cb1 c1<fa b1 eq → lem06 0 cb1 0<fa c1<fa isb b1 eq } where |
697 lem14 : count-B 0 ≡ 1 | |
698 lem14 with is-B (Q←F fa ( fromℕ< 0<fa )) | |
699 ... | no ne = ⊥-elim (ne record {a = Is.a isb ; fa=c = trans (Is.fa=c isb) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
700 ... | yes isb = refl | |
714 lem10 : 0 ≡ toℕ (F←Q fa (f (Is.a isb))) | 701 lem10 : 0 ≡ toℕ (F←Q fa (f (Is.a isb))) |
715 lem10 = begin | 702 lem10 = begin |
716 0 ≡⟨ sym ( toℕ-fromℕ< 0<fa ) ⟩ | 703 0 ≡⟨ sym ( toℕ-fromℕ< 0<fa ) ⟩ |
717 toℕ (fromℕ< {0} 0<fa ) ≡⟨ cong toℕ (sym (finiso← fa _)) ⟩ | 704 toℕ (fromℕ< {0} 0<fa ) ≡⟨ cong toℕ (sym (finiso← fa _)) ⟩ |
718 toℕ (F←Q fa (Q←F fa (fromℕ< {0} 0<fa ))) ≡⟨ cong (λ k → toℕ ((F←Q fa k))) (sym (Is.fa=c isb)) ⟩ | 705 toℕ (F←Q fa (Q←F fa (fromℕ< {0} 0<fa ))) ≡⟨ cong (λ k → toℕ ((F←Q fa k))) (sym (Is.fa=c isb)) ⟩ |
719 toℕ (F←Q fa (f (Is.a isb))) ∎ where open ≡-Reasoning | 706 toℕ (F←Q fa (f (Is.a isb))) ∎ where open ≡-Reasoning |
720 ... | case2 (s≤s lt) = ⊥-elim ( nat-≡< (sym eq) (s≤s (<-transʳ z≤n lt) )) | 707 ... | case2 (s≤s lt) = ⊥-elim ( nat-≡< (sym eq) (s≤s (<-transʳ z≤n lt) )) |
721 lem09 (suc i) (suc j) (s≤s le) eq with <-cmp (finite fa) (suc i) | 708 lem09 (suc i) (suc j) (s≤s le) eq with <-cmp (finite fa) (suc i) |
722 ... | tri< a ¬b ¬c = lem09 i (suc j) (s≤s le) eq | 709 ... | tri< a ¬b ¬c = lem09 i (suc j) (s≤s le) eq |
723 ... | tri≈ ¬a b ¬c = lem09 i (suc j) (s≤s le) eq | 710 ... | tri≈ ¬a b ¬c = lem09 i (suc j) (s≤s le) eq |
724 ... | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) | 711 ... | tri> ¬a ¬b c with is-B (Q←F fa (fromℕ< c)) |
725 ... | no nisb = lem09 i (suc j) (s≤s le) eq | 712 ... | no nisb = lem09 i (suc j) (s≤s le) eq |
726 ... | yes isb with ≤-∨ (s≤s le) | 713 ... | yes isb with ≤-∨ (s≤s le) |
727 ... | case1 eq2 = record { b = Is.a isb ; cb = suc i ; b=cn = lem11 ; cb=n = trans ? (sym (trans eq2 eq )) | 714 ... | case1 eq2 = record { b = Is.a isb ; cb = suc i ; b=cn = lem11 ; cb=n = trans lem14 (sym (trans eq2 eq )) |
728 ; cb-inject = λ cb1 c1<fa b1 eq → lem06 (suc i) cb1 c c1<fa isb b1 eq } where | 715 ; cb-inject = λ cb1 c1<fa b1 eq → lem06 (suc i) cb1 c c1<fa isb b1 eq } where |
716 lem14 : count-B (suc i) ≡ suc (count-B i) | |
717 lem14 with <-cmp (finite fa) (suc i) | |
718 ... | tri< a₂ ¬b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
719 ... | tri≈ ¬a₂ b₂ ¬c₂ = ⊥-elim (¬c₂ c) | |
720 ... | tri> ¬a₂ ¬b₂ c₂ with is-B (Q←F fa ( fromℕ< c₂ )) | |
721 ... | yes isb = refl | |
722 ... | no ne = ⊥-elim (ne record {a = Is.a isb ; fa=c = trans (Is.fa=c isb) (cong (λ k → Q←F fa k) (lemma10 refl )) } ) | |
729 lem11 : suc i ≡ toℕ (F←Q fa (f (Is.a isb))) | 723 lem11 : suc i ≡ toℕ (F←Q fa (f (Is.a isb))) |
730 lem11 = begin | 724 lem11 = begin |
731 suc i ≡⟨ sym ( toℕ-fromℕ< c) ⟩ | 725 suc i ≡⟨ sym ( toℕ-fromℕ< c) ⟩ |
732 toℕ (fromℕ< c) ≡⟨ cong toℕ (sym (finiso← fa _)) ⟩ | 726 toℕ (fromℕ< c) ≡⟨ cong toℕ (sym (finiso← fa _)) ⟩ |
733 toℕ (F←Q fa (Q←F fa (fromℕ< c ))) ≡⟨ cong (λ k → toℕ ((F←Q fa k))) (sym (Is.fa=c isb)) ⟩ | 727 toℕ (F←Q fa (Q←F fa (fromℕ< c ))) ≡⟨ cong (λ k → toℕ ((F←Q fa k))) (sym (Is.fa=c isb)) ⟩ |
734 toℕ (F←Q fa (f (Is.a isb))) ∎ where open ≡-Reasoning | 728 toℕ (F←Q fa (f (Is.a isb))) ∎ where open ≡-Reasoning |
735 ... | case2 (s≤s lt) = lem09 i j lt (cong pred eq) | 729 ... | case2 (s≤s lt) = lem09 i j lt (cong pred eq) |
736 | 730 |
737 iso0 : (x : Fin maxb) → fromℕ< (cb<mb (CountB.b (cb00 (toℕ x) (fin<n _)))) ≡ x | 731 iso0 : (x : Fin maxb) → fromℕ< (cb<mb (CountB.b (cb00 (toℕ x) (fin<n _)))) ≡ x |
738 iso0 x = begin | 732 iso0 x = begin |
739 fromℕ< (cb<mb (CountB.b (cb00 (toℕ x) (fin<n _)))) ≡⟨ fromℕ<-cong _ _ ( begin | 733 fromℕ< (cb<mb (CountB.b (cb00 (toℕ x) (fin<n _)))) ≡⟨ fromℕ<-cong _ _ ( begin |
740 pred (count-B (toℕ (F←Q fa (f (CountB.b (cb00 (toℕ x) (fin<n _))))))) ≡⟨ sym (cong (λ k → pred (count-B k)) (CountB.b=cn CB)) ⟩ | 734 pred (count-B (toℕ (F←Q fa (f (CountB.b (cb00 (toℕ x) (fin<n _))))))) ≡⟨ sym (cong (λ k → pred (count-B k)) (CountB.b=cn CB)) ⟩ |
741 pred (count-B (CountB.cb CB)) ≡⟨ cong pred (CountB.cb=n CB) ⟩ | 735 pred (count-B (CountB.cb CB)) ≡⟨ cong pred (CountB.cb=n CB) ⟩ |
742 pred (suc (toℕ x)) ≡⟨ refl ⟩ | 736 pred (suc (toℕ x)) ≡⟨ refl ⟩ |
743 toℕ x ∎ ) (cb<mb (CountB.b CB)) (fin<n _) ⟩ | 737 toℕ x ∎ ) (cb<mb (CountB.b CB)) (fin<n _) ⟩ |
744 fromℕ< (fin<n {_} x) ≡⟨ fromℕ<-toℕ _ (fin<n {_} x) ⟩ | 738 fromℕ< (fin<n {_} x) ≡⟨ fromℕ<-toℕ _ (fin<n {_} x) ⟩ |
745 x ∎ where | 739 x ∎ where |
746 open ≡-Reasoning | 740 open ≡-Reasoning |
747 CB = cb00 (toℕ x) (fin<n _) | 741 CB = cb00 (toℕ x) (fin<n _) |
748 | 742 |
749 iso1 : (b : B) → CountB.b (cb00 (toℕ (fromℕ< (cb<mb b))) (fin<n _)) ≡ b | 743 iso1 : (b : B) → CountB.b (cb00 (toℕ (fromℕ< (cb<mb b))) (fin<n _)) ≡ b |
755 b ∎ where | 749 b ∎ where |
756 open ≡-Reasoning | 750 open ≡-Reasoning |
757 CB = cb00 (toℕ (fromℕ< (cb<mb b))) (fin<n _) | 751 CB = cb00 (toℕ (fromℕ< (cb<mb b))) (fin<n _) |
758 isb : Is B A f (Q←F fa (fromℕ< (fin<n {_} (F←Q fa (f b)) ))) | 752 isb : Is B A f (Q←F fa (fromℕ< (fin<n {_} (F←Q fa (f b)) ))) |
759 isb = record { a = b ; fa=c = lem33 } where | 753 isb = record { a = b ; fa=c = lem33 } where |
760 lem33 : f b ≡ Q←F fa (fromℕ< (fin<n (F←Q fa (f b)))) | 754 lem33 : f b ≡ Q←F fa (fromℕ< (fin<n (F←Q fa (f b)))) |
761 lem33 = begin | 755 lem33 = begin |
762 f b ≡⟨ sym (finiso→ fa _) ⟩ | 756 f b ≡⟨ sym (finiso→ fa _) ⟩ |
763 Q←F fa (F←Q fa (f b)) ≡⟨ cong (Q←F fa) (sym (fromℕ<-toℕ _ (fin<n (F←Q fa (f b))))) ⟩ | 757 Q←F fa (F←Q fa (f b)) ≡⟨ cong (Q←F fa) (sym (fromℕ<-toℕ _ (fin<n (F←Q fa (f b))))) ⟩ |
764 Q←F fa (fromℕ< (fin<n (F←Q fa (f b)))) ∎ | 758 Q←F fa (fromℕ< (fin<n (F←Q fa (f b)))) ∎ |
765 lem30 : count-B (CountB.cb CB) ≡ count-B (toℕ (F←Q fa (InjectiveF.f fi b))) | 759 lem30 : count-B (CountB.cb CB) ≡ count-B (toℕ (F←Q fa (InjectiveF.f fi b))) |
766 lem30 = begin | 760 lem30 = begin |
767 count-B (CountB.cb CB) ≡⟨ CountB.cb=n CB ⟩ | 761 count-B (CountB.cb CB) ≡⟨ CountB.cb=n CB ⟩ |
768 suc (toℕ (fromℕ< (cb<mb b))) ≡⟨ cong suc (toℕ-fromℕ< (cb<mb b)) ⟩ | 762 suc (toℕ (fromℕ< (cb<mb b))) ≡⟨ cong suc (toℕ-fromℕ< (cb<mb b)) ⟩ |
769 suc (pred (count-B (toℕ (F←Q fa (f b))))) ≡⟨ sucprd (lem31 b) ⟩ | 763 suc (pred (count-B (toℕ (F←Q fa (f b))))) ≡⟨ sucprd (lem31 b) ⟩ |
770 count-B (toℕ (F←Q fa (f b))) ∎ | 764 count-B (toℕ (F←Q fa (f b))) ∎ |
771 | 765 |
772 | 766 |
773 -- end | 767 -- end |