|
13 | 13 |
|
14 | 14 | module Data.Fin.Relation.Unary.Top20230418 where
|
15 | 15 |
|
16 |
| -open import Data.Empty using (⊥; ⊥-elim) |
17 | 16 | open import Data.Nat.Base using (ℕ; zero; suc; _<_; _∸_)
|
18 | 17 | open import Data.Nat.Properties using (n∸n≡0; +-∸-assoc)
|
19 | 18 | open import Data.Fin.Base using (Fin; zero; suc; toℕ; fromℕ; fromℕ<; inject₁)
|
@@ -114,143 +113,24 @@ module Instances {n} where
|
114 | 113 |
|
115 | 114 | inject₁≢n⁺ : ∀ {i} {n≢i : n ≢ toℕ (inject₁ i)} → IsInj (view {n} i)
|
116 | 115 | inject₁≢n⁺ {i} {n≢i} with view i
|
117 |
| - ... | top = ⊥-elim (n≢i (begin |
118 |
| - n ≡˘⟨ toℕ-fromℕ n ⟩ |
| 116 | + ... | top with () ← n≢i (let open ≡-Reasoning in begin |
| 117 | + n ≡˘⟨ toℕ-fromℕ n ⟩ |
119 | 118 | toℕ (fromℕ n) ≡˘⟨ toℕ-inject₁ (fromℕ n) ⟩
|
120 |
| - toℕ (inject₁ (fromℕ n)) ∎)) where open ≡-Reasoning |
| 119 | + toℕ (inject₁ (fromℕ n)) ∎) |
121 | 120 | ... | inj j = inj j
|
122 | 121 |
|
123 |
| -open Instances |
124 |
| - |
125 | 122 | ------------------------------------------------------------------------
|
126 | 123 | -- As a corollary, we obtain two useful properties, which are
|
127 | 124 | -- witnessed by, but can also serve as proxy replacements for,
|
128 | 125 | -- the corresponding properties in `Data.Fin.Properties`
|
129 | 126 |
|
130 | 127 | module _ {n} where
|
131 | 128 |
|
| 129 | + open Instances |
| 130 | + |
132 | 131 | view-top-toℕ : ∀ i → .{{IsTop (view i)}} → toℕ i ≡ n
|
133 | 132 | view-top-toℕ i with top ← view i = toℕ-fromℕ n
|
134 | 133 |
|
135 | 134 | view-inj-toℕ< : ∀ i → .{{IsInj (view i)}} → toℕ i < n
|
136 | 135 | view-inj-toℕ< i with inj j ← view i = inject₁ℕ< j
|
137 | 136 |
|
138 |
| ------------------------------------------------------------------------- |
139 |
| --- Examples |
140 |
| - |
141 |
| -private module Examples {n} where |
142 |
| - |
143 |
| --- Similarly, we can redefine certain operations in `Data.Fin.Base`, |
144 |
| --- together with their corresponding properties in `Data.Fin.Properties` |
145 |
| - |
146 |
| --- First: the reimplementation of the function `lower₁` and its properties, |
147 |
| --- specified as a partial inverse to `inject₁`, defined on the domain given |
148 |
| --- by `n ≢ toℕ i`, equivalently `i ≢ from ℕ n`, ie `IsInj {n} (view i)` |
149 |
| - |
150 |
| --- Definition |
151 |
| -{- |
152 |
| -lower₁ : ∀ (i : Fin (suc n)) → n ≢ toℕ i → Fin n |
153 |
| -lower₁ {zero} zero ne = ⊥-elim (ne refl) |
154 |
| -lower₁ {suc n} zero _ = zero |
155 |
| -lower₁ {suc n} (suc i) ne = suc (lower₁ i (ne ∘ cong suc)) |
156 |
| --} |
157 |
| - |
158 |
| - lower₁ : (i : Fin (suc n)) → .{{IsInj (view {n} i)}} → Fin n |
159 |
| - lower₁ i with inj j ← view i = j -- the view *inverts* inject₁ |
160 |
| - |
161 |
| --- Properties |
162 |
| -{- |
163 |
| -toℕ-lower₁ : ∀ i (p : n ≢ toℕ i) → toℕ (lower₁ i p) ≡ toℕ i |
164 |
| -
|
165 |
| -lower₁-injective : ∀ {n≢i : n ≢ toℕ i} {n≢j : n ≢ toℕ j} → |
166 |
| - lower₁ i n≢i ≡ lower₁ j n≢j → i ≡ j |
167 |
| -inject₁-lower₁ : ∀ (i : Fin (suc n)) (n≢i : n ≢ toℕ i) → |
168 |
| - inject₁ (lower₁ i n≢i) ≡ i |
169 |
| -lower₁-inject₁′ : ∀ (i : Fin n) (n≢i : n ≢ toℕ (inject₁ i)) → |
170 |
| - lower₁ (inject₁ i) n≢i ≡ i |
171 |
| -lower₁-inject₁ : ∀ (i : Fin n) → |
172 |
| - lower₁ (inject₁ i) (toℕ-inject₁-≢ i) ≡ i |
173 |
| -lower₁-inject₁ i = lower₁-inject₁′ i (toℕ-inject₁-≢ i) |
174 |
| -lower₁-irrelevant : ∀ (i : Fin (suc n)) (n≢i₁ n≢i₂ : n ≢ toℕ i) → |
175 |
| - lower₁ i n≢i₁ ≡ lower₁ i n≢i₂ |
176 |
| -inject₁≡⇒lower₁≡ : ∀ {i : Fin n} {j : Fin (ℕ.suc n)} → |
177 |
| - (n≢j : n ≢ toℕ j) → inject₁ i ≡ j → lower₁ j n≢j ≡ i |
178 |
| --} |
179 |
| - |
180 |
| - lower₁-irrelevant : (i : Fin (suc n)) .{{ii₁ ii₂ : IsInj (view {n} i)}} → |
181 |
| - lower₁ i {{ii₁}} ≡ lower₁ i {{ii₂}} |
182 |
| - lower₁-irrelevant i with inj ii ← view i = refl |
183 |
| - |
184 |
| - toℕ-lower₁ : (i : Fin (suc n)) .{{ii : IsInj (view {n} i)}} → |
185 |
| - toℕ (lower₁ i {{ii}}) ≡ toℕ i |
186 |
| - toℕ-lower₁ i with inj j ← view i = sym (toℕ-inject₁ j) |
187 |
| - |
188 |
| - lower₁-injective : (i j : Fin (suc n)) → |
189 |
| - .{{ii : IsInj (view {n} i)}} → |
190 |
| - .{{jj : IsInj (view {n} j)}} → |
191 |
| - lower₁ i {{ii}} ≡ lower₁ j {{jj}} → i ≡ j |
192 |
| - lower₁-injective i j with inj ii ← view i | inj jj ← view j = cong inject₁ |
193 |
| - |
194 |
| - inject₁-lower₁ : (i : Fin (suc n)) .{{ii : IsInj (view {n} i)}} → |
195 |
| - inject₁ (lower₁ i {{ii}}) ≡ i |
196 |
| - inject₁-lower₁ i with inj ii ← view i = refl |
197 |
| - |
198 |
| - lower₁-inject₁ : (j : Fin n) → lower₁ (inject₁ j) {{inj⁺}} ≡ j |
199 |
| - lower₁-inject₁ j rewrite view-inj j = refl |
200 |
| - |
201 |
| - inject₁≡⇒lower₁≡ : ∀ {i : Fin n} {j : Fin (suc n)} (eq : inject₁ i ≡ j) → |
202 |
| - lower₁ j {{inject₁≡⁺ {eq = eq}}} ≡ i |
203 |
| - inject₁≡⇒lower₁≡ refl = lower₁-inject₁ _ |
204 |
| - |
205 |
| --- Second: the reimplementation of the function `opposite` and its properties, |
206 |
| - |
207 |
| --- Definition |
208 |
| -{- |
209 |
| - opposite : Fin n → Fin n |
210 |
| - opposite {suc n} zero = fromℕ n |
211 |
| - opposite {suc n} (suc i) = inject₁ (opposite i) |
212 |
| --} |
213 |
| - |
214 |
| - opposite : ∀ {n} → Fin n → Fin n |
215 |
| - opposite {n = suc n} i with view i |
216 |
| - ... | top = zero |
217 |
| - ... | inj j = suc (opposite {n} j) |
218 |
| - |
219 |
| --- Properties |
220 |
| - |
221 |
| - opposite-zero≡top : ∀ n → opposite {suc n} zero ≡ fromℕ n |
222 |
| - opposite-zero≡top zero = refl |
223 |
| - opposite-zero≡top (suc n) = cong suc (opposite-zero≡top n) |
224 |
| - |
225 |
| - opposite-top≡zero : ∀ n → opposite {suc n} (fromℕ n) ≡ zero |
226 |
| - opposite-top≡zero n rewrite view-top n = refl |
227 |
| - |
228 |
| - opposite-suc≡inject₁-opposite : ∀ {n} (j : Fin n) → |
229 |
| - opposite (suc j) ≡ inject₁ (opposite j) |
230 |
| - opposite-suc≡inject₁-opposite {suc n} i with view i |
231 |
| - ... | top = refl |
232 |
| - ... | inj j = cong suc (opposite-suc≡inject₁-opposite {n} j) |
233 |
| - |
234 |
| - opposite-involutive : ∀ {n} (j : Fin n) → opposite (opposite j) ≡ j |
235 |
| - opposite-involutive {suc n} zero |
236 |
| - rewrite opposite-zero≡top n |
237 |
| - | view-top n = refl |
238 |
| - opposite-involutive {suc n} (suc i) |
239 |
| - rewrite opposite-suc≡inject₁-opposite i |
240 |
| - | view-inj (opposite i) = cong suc (opposite-involutive i) |
241 |
| - |
242 |
| - opposite-suc : (j : Fin n) → toℕ (opposite (suc j)) ≡ toℕ (opposite j) |
243 |
| - opposite-suc j = begin |
244 |
| - toℕ (opposite (suc j)) ≡⟨ cong toℕ (opposite-suc≡inject₁-opposite j) ⟩ |
245 |
| - toℕ (inject₁ (opposite j)) ≡⟨ toℕ-inject₁ (opposite j) ⟩ |
246 |
| - toℕ (opposite j) ∎ |
247 |
| - where open ≡-Reasoning |
248 |
| - |
249 |
| - opposite-prop : ∀ {n} (i : Fin n) → toℕ (opposite i) ≡ n ∸ suc (toℕ i) |
250 |
| - opposite-prop {suc n} i with view i |
251 |
| - ... | top rewrite toℕ-fromℕ n | n∸n≡0 n = refl |
252 |
| - ... | inj j = begin |
253 |
| - suc (toℕ (opposite j)) ≡⟨ cong suc (opposite-prop j) ⟩ |
254 |
| - suc (n ∸ suc (toℕ j)) ≡˘⟨ +-∸-assoc 1 {n} {suc (toℕ j)} (toℕ<n j) ⟩ |
255 |
| - n ∸ toℕ j ≡˘⟨ cong (n ∸_) (toℕ-inject₁ j) ⟩ |
256 |
| - n ∸ toℕ (inject₁ j) ∎ where open ≡-Reasoning |
0 commit comments