Skip to content

Commit e31c5fc

Browse files
Implement all the missing pieces to proving that Fin (m ℕ.+ n) ↔ (Fin m ⊎ Fin n) (#1393)
1 parent 2dc1df1 commit e31c5fc

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

CHANGELOG.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ Deprecated names
167167
show ↦ Data.Rational.Show.show
168168
```
169169

170+
* In `Data.Fin.Properties`:
171+
```agda
172+
inject+-raise-splitAt ↦ join-splitAt
173+
```
174+
170175
New modules
171176
-----------
172177

@@ -729,7 +734,14 @@ Other minor additions
729734
resp : (P : Pred A ℓ) → P Respects _≡_
730735
```
731736

732-
* Added new proof to `Data.Fin.Properties`:
737+
* Added new function to `Data.Fin` (the inverse of `splitAt`:
738+
```agda
739+
join : ∀ m n → Fin m ⊎ Fin n → Fin (m ℕ.+ n)
740+
```
741+
742+
* Added new properties to `Data.Fin.Properties`:
733743
```agda
744+
splitAt-join : ∀ m n i → splitAt m (join m n i) ≡ i
745+
+↔⊎ : Fin (m ℕ.+ n) ↔ (Fin m ⊎ Fin n)
734746
Fin0↔⊥ : Fin 0 ↔ ⊥
735747
```

src/Data/Fin/Base.agda

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ open import Data.Empty using (⊥-elim)
1616
open import Data.Nat.Base as ℕ using (ℕ; zero; suc; z≤n; s≤s)
1717
open import Data.Nat.Properties.Core using (≤-pred)
1818
open import Data.Product as Product using (_×_; _,_)
19-
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂)
19+
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]′)
2020
open import Function.Base using (id; _∘_; _on_)
2121
open import Level using () renaming (zero to ℓ₀)
2222
open import Relation.Nullary using (yes; no)
@@ -131,6 +131,10 @@ splitAt zero i = inj₂ i
131131
splitAt (suc m) zero = inj₁ zero
132132
splitAt (suc m) (suc i) = Sum.map suc id (splitAt m i)
133133

134+
-- inverse of above function
135+
join : m n Fin m ⊎ Fin n Fin (m ℕ.+ n)
136+
join m n = [ inject+ n , raise {n} m ]′
137+
134138
-- quotRem k "i" = "i % k" , "i / k"
135139
-- This is dual to group from Data.Vec.
136140

src/Data/Fin/Properties.agda

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ open import Data.Nat.Base as ℕ using (ℕ; zero; suc; s≤s; z≤n; _∸_)
1919
import Data.Nat.Properties as ℕₚ
2020
open import Data.Unit using (tt)
2121
open import Data.Product using (∃; ∃₂; ∄; _×_; _,_; map; proj₁; uncurry; <_,_>)
22-
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_])
22+
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]; [_,_]′)
2323
open import Data.Sum.Properties using ([,]-map-commute; [,]-∘-distr)
2424
open import Function.Base using (_∘_; id; _$_)
2525
open import Function.Bundles using (_↔_; mk↔′)
@@ -488,7 +488,7 @@ pred< (suc i) p = ≤̄⇒inject₁< ℕₚ.≤-refl
488488
-- splitAt
489489
------------------------------------------------------------------------
490490

491-
-- Fin (m + n) Fin m ⊎ Fin n
491+
-- Fin (m + n) Fin m ⊎ Fin n
492492

493493
splitAt-inject+ : m n i splitAt m (inject+ n i) ≡ inj₁ i
494494
splitAt-inject+ (suc m) n zero = refl
@@ -498,14 +498,18 @@ splitAt-raise : ∀ m n i → splitAt m (raise {n} m i) ≡ inj₂ i
498498
splitAt-raise zero n i = refl
499499
splitAt-raise (suc m) n i rewrite splitAt-raise m n i = refl
500500

501-
inject+-raise-splitAt : m n i [ inject+ n , raise {n} m ] (splitAt m i) ≡ i
502-
inject+-raise-splitAt zero n i = refl
503-
inject+-raise-splitAt (suc m) n zero = refl
504-
inject+-raise-splitAt (suc m) n (suc i) = begin
505-
[ inject+ n , raise {n} (suc m) ] (splitAt (suc m) (suc i)) ≡⟨ [,]-map-commute (splitAt m i) ⟩
506-
[ suc ∘ (inject+ n) , suc ∘ (raise {n} m) ] (splitAt m i) ≡˘⟨ [,]-∘-distr suc (splitAt m i) ⟩
507-
suc ([ inject+ n , raise {n} m ] (splitAt m i)) ≡⟨ cong suc (inject+-raise-splitAt m n i) ⟩
508-
suc i ∎
501+
splitAt-join : m n i splitAt m (join m n i) ≡ i
502+
splitAt-join m n (inj₁ x) = splitAt-inject+ m n x
503+
splitAt-join m n (inj₂ y) = splitAt-raise m n y
504+
505+
join-splitAt : m n i join m n (splitAt m i) ≡ i
506+
join-splitAt zero n i = refl
507+
join-splitAt (suc m) n zero = refl
508+
join-splitAt (suc m) n (suc i) = begin
509+
[ inject+ n , raise {n} (suc m) ]′ (splitAt (suc m) (suc i)) ≡⟨ [,]-map-commute (splitAt m i) ⟩
510+
[ suc ∘ (inject+ n) , suc ∘ (raise {n} m) ]′ (splitAt m i) ≡˘⟨ [,]-∘-distr suc (splitAt m i) ⟩
511+
suc ([ inject+ n , raise {n} m ]′ (splitAt m i)) ≡⟨ cong suc (join-splitAt m n i) ⟩
512+
suc i ∎
509513
where open ≡-Reasoning
510514

511515
-- splitAt "m" "i" ≡ inj₁ "i" if i < m
@@ -520,6 +524,12 @@ splitAt-≥ : ∀ m {n} i → (i≥m : toℕ i ℕ.≥ m) → splitAt m {n} i
520524
splitAt-≥ zero i _ = refl
521525
splitAt-≥ (suc m) (suc i) (s≤s i≥m) = cong (Sum.map suc id) (splitAt-≥ m i i≥m)
522526

527+
------------------------------------------------------------------------
528+
-- Bundles
529+
530+
+↔⊎ : {m n} Fin (m ℕ.+ n) ↔ (Fin m ⊎ Fin n)
531+
+↔⊎ {m} {n} = mk↔′ (splitAt m {n}) (join m n) (splitAt-join m n) (join-splitAt m n)
532+
523533
------------------------------------------------------------------------
524534
-- lift
525535
------------------------------------------------------------------------
@@ -896,3 +906,11 @@ decSetoid = ≡-decSetoid
896906
"Warning: decSetoid was deprecated in v1.2.
897907
Please use ≡-decSetoid instead."
898908
#-}
909+
910+
-- Version 1.5
911+
912+
inject+-raise-splitAt = join-splitAt
913+
{-# WARNING_ON_USAGE inject+-raise-splitAt
914+
"Warning: decSetoid was deprecated in v1.5.
915+
Please use join-splitAt instead."
916+
#-}

0 commit comments

Comments
 (0)