Skip to content

Commit c0ee093

Browse files
committed
streamlined Top
1 parent ceb1bdb commit c0ee093

File tree

1 file changed

+5
-125
lines changed

1 file changed

+5
-125
lines changed

src/Data/Fin/Relation/Unary/Top20230418.agda

+5-125
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
module Data.Fin.Relation.Unary.Top20230418 where
1515

16-
open import Data.Empty using (⊥; ⊥-elim)
1716
open import Data.Nat.Base using (ℕ; zero; suc; _<_; _∸_)
1817
open import Data.Nat.Properties using (n∸n≡0; +-∸-assoc)
1918
open import Data.Fin.Base using (Fin; zero; suc; toℕ; fromℕ; fromℕ<; inject₁)
@@ -114,143 +113,24 @@ module Instances {n} where
114113

115114
inject₁≢n⁺ : {i} {n≢i : n ≢ toℕ (inject₁ i)} IsInj (view {n} i)
116115
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 ⟩
119118
toℕ (fromℕ n) ≡˘⟨ toℕ-inject₁ (fromℕ n) ⟩
120-
toℕ (inject₁ (fromℕ n)) ∎)) where open ≡-Reasoning
119+
toℕ (inject₁ (fromℕ n)) ∎)
121120
... | inj j = inj j
122121

123-
open Instances
124-
125122
------------------------------------------------------------------------
126123
-- As a corollary, we obtain two useful properties, which are
127124
-- witnessed by, but can also serve as proxy replacements for,
128125
-- the corresponding properties in `Data.Fin.Properties`
129126

130127
module _ {n} where
131128

129+
open Instances
130+
132131
view-top-toℕ : i .{{IsTop (view i)}} toℕ i ≡ n
133132
view-top-toℕ i with top view i = toℕ-fromℕ n
134133

135134
view-inj-toℕ< : i .{{IsInj (view i)}} toℕ i < n
136135
view-inj-toℕ< i with inj j view i = inject₁ℕ< j
137136

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

Comments
 (0)