Skip to content

Commit 9315159

Browse files
authored
Added Fin/function isomorphism (#1613)
1 parent df4910b commit 9315159

File tree

3 files changed

+93
-11
lines changed

3 files changed

+93
-11
lines changed

CHANGELOG.md

+15-4
Original file line numberDiff line numberDiff line change
@@ -496,11 +496,22 @@ Other minor changes
496496
```
497497
and their corresponding algebraic substructures.
498498

499-
* Added a new `Inverse` bundle in `Data.Fin.Properties`:
499+
* Added new functions in `Data.Fin.Base`:
500500
```
501-
1↔⊤ : Fin 1 ↔ ⊤
502-
↑ˡ-injective : ∀ {m} n (i j : Fin m) → i ↑ˡ n ≡ j ↑ˡ n → i ≡ j
503-
↑ʳ-injective : ∀ {m} n (i j : Fin m) → n ↑ʳ i ≡ n ↑ʳ j → i ≡ j
501+
finToFun : Fin (n ^ m) → (Fin m → Fin n)
502+
funToFin : (Fin m → Fin n) → Fin (n ^ m)
503+
quotient : Fin (n * k) → Fin n
504+
remainder : Fin (n * k) → Fin k
505+
```
506+
507+
* Added new proofs and `Inverse` bundles in `Data.Fin.Properties`:
508+
```
509+
1↔⊤ : Fin 1 ↔ ⊤
510+
↑ˡ-injective : i ↑ˡ n ≡ j ↑ˡ n → i ≡ j
511+
↑ʳ-injective : n ↑ʳ i ≡ n ↑ʳ j → i ≡ j
512+
finTofun-funToFin : funToFin ∘ finToFun ≗ id
513+
funTofin-funToFun : finToFun (funToFin f) ≗ f
514+
^↔→ : Extensionality _ _ → Fin (n ^ m) ↔ (Fin m → Fin n)
504515
```
505516

506517
* Added new proofs in `Data.Integer.Properties`:

src/Data/Fin/Base.agda

+19-3
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
module Data.Fin.Base where
1414

1515
open import Data.Empty using (⊥-elim)
16-
open import Data.Nat.Base as ℕ using (ℕ; zero; suc; z≤n; s≤s)
16+
open import Data.Nat.Base as ℕ using (ℕ; zero; suc; z≤n; s≤s; _^_)
1717
open import Data.Nat.Properties.Core using (≤-pred)
18-
open import Data.Product as Product using (_×_; _,_)
18+
open import Data.Product as Product using (_×_; _,_; proj₁; proj₂)
1919
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]′)
2020
open import Function.Base using (id; _∘_; _on_; flip)
2121
open import Level using (0ℓ)
@@ -152,11 +152,27 @@ quotRem {suc n} k i with splitAt k i
152152
remQuot : {n} k Fin (n ℕ.* k) Fin n × Fin k
153153
remQuot k = Product.swap ∘ quotRem k
154154

155+
quotient : {n} k Fin (n ℕ.* k) Fin n
156+
quotient {n} k = proj₁ ∘ remQuot {n} k
157+
158+
remainder : {n} k Fin (n ℕ.* k) Fin k
159+
remainder {n} k = proj₂ ∘ remQuot {n} k
160+
155161
-- inverse of remQuot
156162
combine : {n k} Fin n Fin k Fin (n ℕ.* k)
157-
combine {suc n} {k} zero y = y ↑ˡ (n ℕ.* k)
163+
combine {suc n} {k} zero y = y ↑ˡ (n ℕ.* k)
158164
combine {suc n} {k} (suc x) y = k ↑ʳ (combine x y)
159165

166+
-- Next in progression after splitAt and remQuot
167+
finToFun : {m n} Fin (n ^ m) (Fin m Fin n)
168+
finToFun {suc m} {n} k zero = quotient (n ^ m) k
169+
finToFun {suc m} {n} k (suc i) = finToFun (remainder {n} (n ^ m) k) i
170+
171+
-- inverse of above function
172+
funToFin : {m n} (Fin m Fin n) Fin (n ^ m)
173+
funToFin {zero} f = zero
174+
funToFin {suc m} f = combine (f zero) (funToFin (f ∘ suc))
175+
160176
------------------------------------------------------------------------
161177
-- Operations
162178

src/Data/Fin/Properties.agda

+59-4
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,17 @@
99

1010
module Data.Fin.Properties where
1111

12+
open import Axiom.Extensionality.Propositional
1213
open import Category.Applicative using (RawApplicative)
1314
open import Category.Functor using (RawFunctor)
1415
open import Data.Bool.Base using (Bool; true; false; not; _∧_; _∨_)
1516
open import Data.Empty using (⊥; ⊥-elim)
1617
open import Data.Fin.Base
1718
open 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; _∸_; _^_)
1920
import Data.Nat.Properties as ℕₚ
2021
open 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; <_,_>)
2223
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]; [_,_]′)
2324
open import Data.Sum.Properties using ([,]-map-commute; [,]-∘-distr)
2425
open import Function.Base using (_∘_; id; _$_; flip)
@@ -28,7 +29,7 @@ open import Function.Equivalence using (_⇔_; equivalence)
2829
open import Function.Injection using (_↣_)
2930
open import Relation.Binary as B hiding (Decidable; _⇔_)
3031
open import Relation.Binary.PropositionalEquality as P
31-
using (_≡_; _≢_; refl; sym; trans; cong; subst; module ≡-Reasoning)
32+
using (_≡_; _≢_; refl; sym; trans; cong; subst; _≗_; module ≡-Reasoning)
3233
open import Relation.Nullary.Decidable as Dec using (map′)
3334
open import Relation.Nullary.Reflects
3435
open 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

Comments
 (0)