99
1010module Data.Fin.Properties where
1111
12+ open import Axiom.Extensionality.Propositional
1213open import Category.Applicative using (RawApplicative)
1314open import Category.Functor using (RawFunctor)
1415open import Data.Bool.Base using (Bool; true; false; not; _∧_; _∨_)
1516open import Data.Empty using (⊥; ⊥-elim)
1617open import Data.Fin.Base
1718open import Data.Fin.Patterns
18- open import Data.Nat.Base as ℕ using (ℕ; zero; suc; s≤s; z≤n; _∸_)
19+ open import Data.Nat.Base as ℕ using (ℕ; zero; suc; s≤s; z≤n; _∸_; _^_ )
1920import Data.Nat.Properties as ℕₚ
2021open import Data.Unit using (⊤; tt)
21- open import Data.Product using (Σ-syntax; ∃; ∃₂; ∄; _×_; _,_; map; proj₁; uncurry; <_,_>)
22+ open import Data.Product using (Σ-syntax; ∃; ∃₂; ∄; _×_; _,_; map; proj₁; proj₂; uncurry; <_,_>)
2223open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]; [_,_]′)
2324open import Data.Sum.Properties using ([,]-map-commute; [,]-∘-distr)
2425open import Function.Base using (_∘_; id; _$_; flip)
@@ -28,7 +29,7 @@ open import Function.Equivalence using (_⇔_; equivalence)
2829open import Function.Injection using (_↣_)
2930open import Relation.Binary as B hiding (Decidable; _⇔_)
3031open import Relation.Binary.PropositionalEquality as P
31- using (_≡_; _≢_; refl; sym; trans; cong; subst; module ≡-Reasoning )
32+ using (_≡_; _≢_; refl; sym; trans; cong; subst; _≗_; module ≡-Reasoning )
3233open import Relation.Nullary.Decidable as Dec using (map′)
3334open import Relation.Nullary.Reflects
3435open import Relation.Nullary.Negation using (contradiction)
@@ -572,8 +573,62 @@ combine-remQuot {suc n} k i with splitAt k i | P.inspect (splitAt k) i
572573
573574------------------------------------------------------------------------
574575-- Bundles
576+
575577*↔× : ∀ {m n} → Fin (m ℕ.* n) ↔ (Fin m × Fin n)
576- *↔× {m} {n} = mk↔′ (remQuot {m} n) (uncurry combine) (uncurry remQuot-combine) (combine-remQuot {m} n)
578+ *↔× {m} {n} = mk↔′ (remQuot {m} n) (uncurry combine)
579+ (uncurry remQuot-combine)
580+ (combine-remQuot {m} n)
581+
582+ ------------------------------------------------------------------------
583+ -- fin→fun
584+ ------------------------------------------------------------------------
585+
586+ funToFin-finToFin : ∀ {m n} → funToFin {m} {n} ∘ finToFun ≗ id
587+ funToFin-finToFin {zero} {n} zero = refl
588+ funToFin-finToFin {suc m} {n} k =
589+ begin
590+ combine (finToFun {suc m} {n} k zero) (funToFin (finToFun {suc m} {n} k ∘ suc))
591+ ≡⟨⟩
592+ combine (quotient {n} (n ^ m) k)
593+ (funToFin (finToFun {m} (remainder {n} (n ^ m) k)))
594+ ≡⟨ cong (combine (quotient {n} (n ^ m) k))
595+ (funToFin-finToFin {m} (remainder {n} (n ^ m) k)) ⟩
596+ combine (quotient {n} (n ^ m) k) (remainder {n} (n ^ m) k)
597+ ≡⟨⟩
598+ uncurry combine (remQuot {n} (n ^ m) k)
599+ ≡⟨ combine-remQuot {n = n} (n ^ m) k ⟩
600+ k
601+ ∎ where open ≡-Reasoning
602+
603+ finToFun-funToFin : ∀ {m n} (f : Fin m → Fin n) → finToFun (funToFin f) ≗ f
604+ finToFun-funToFin {suc m} {n} f zero =
605+ begin
606+ quotient (n ^ m) (combine (f zero) (funToFin (f ∘ suc)))
607+ ≡⟨ cong proj₁ (remQuot-combine _ _) ⟩
608+ proj₁ (f zero , funToFin (f ∘ suc))
609+ ≡⟨⟩
610+ f zero
611+ ∎ where open ≡-Reasoning
612+ finToFun-funToFin {suc m} {n} f (suc i) =
613+ begin
614+ finToFun (remainder {n} (n ^ m) (combine (f zero) (funToFin (f ∘ suc)))) i
615+ ≡⟨ cong (λ rq → finToFun (proj₂ rq) i) (remQuot-combine {n} _ _) ⟩
616+ finToFun (proj₂ (f zero , funToFin (f ∘ suc))) i
617+ ≡⟨⟩
618+ finToFun (funToFin (f ∘ suc)) i
619+ ≡⟨ finToFun-funToFin (f ∘ suc) i ⟩
620+ (f ∘ suc) i
621+ ≡⟨⟩
622+ f (suc i)
623+ ∎ where open ≡-Reasoning
624+
625+ ------------------------------------------------------------------------
626+ -- Bundles
627+
628+ ^↔→ : ∀ {m n} → Extensionality _ _ → Fin (n ^ m) ↔ (Fin m → Fin n)
629+ ^↔→ {m} {n} ext = mk↔′ finToFun funToFin
630+ (ext ∘ finToFun-funToFin)
631+ (funToFin-finToFin {m} {n})
577632
578633------------------------------------------------------------------------
579634-- lift
0 commit comments