Skip to content

Commit 53169a5

Browse files
plt-amyncfavier
andauthored
Finiteness in terms of lists (#477)
Redefines `Finite` in terms of `List` (there's also the non-truncated version `Listing` which isn't a prop), defines K-finite subsets as a higher inductive type, and provides more efficient versions of the equivalences `Fin n + Fin k ≃ Fin (n + k)` and `Fin n × Fin k = Fin (n * k)`. --------- Co-authored-by: Naïm Camille Favier <[email protected]>
1 parent 8a20dfc commit 53169a5

32 files changed

+2513
-590
lines changed

src/1Lab/Function/Embedding.lagda.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ description: |
1010
open import 1Lab.Equiv.Fibrewise
1111
open import 1Lab.HLevel.Universe
1212
open import 1Lab.HLevel.Closure
13+
open import 1Lab.Path.Reasoning
14+
open import 1Lab.Path.Groupoid
1315
open import 1Lab.Type.Sigma
1416
open import 1Lab.Univalence
1517
open import 1Lab.HLevel
@@ -68,7 +70,8 @@ inclusion".
6870
has-prop-fibres→injective
6971
: (f : A → B) → (∀ x → is-prop (fibre f x))
7072
→ injective f
71-
has-prop-fibres→injective _ prop p = ap fst (prop _ (_ , p) (_ , refl))
73+
has-prop-fibres→injective f prop {x} {y} p =
74+
ap fst (prop (f y) (x , p) (y , refl))
7275
7376
between-sets-injective≃has-prop-fibres
7477
: is-set A → is-set B → (f : A → B)
@@ -202,17 +205,24 @@ module _ {ℓ ℓ'} {A : Type ℓ} {B : Type ℓ'} {f : A → B} where
202205
contr (x , refl) λ (y , p) i → p (~ i) , λ j → p (~ i ∨ j)
203206
204207
embedding→cancellable : is-embedding f → ∀ {x y} → is-equiv {B = f x ≡ f y} (ap f)
205-
embedding→cancellable emb = total→equiv {f = λ y p → ap f {y = y} p}
206-
(is-contr→is-equiv
207-
(contr (_ , refl) λ (y , p) i → p i , λ j → p (i ∧ j))
208-
(contr (_ , refl) (Equiv→is-hlevel 1 (Σ-ap-snd λ _ → sym-equiv) (emb _) _)))
208+
embedding→cancellable emb {x} {y} = is-iso→is-equiv λ where
209+
.is-iso.inv p → ap fst (emb (f y) (x , p) (y , refl))
210+
.is-iso.rinv p → flatten-∨-square (ap snd (emb (f y) (x , p) (y , refl)))
211+
.is-iso.linv → J (λ y p → ap fst (emb (f y) (x , ap f p) (y , refl)) ≡ p)
212+
(ap-square fst (is-prop→is-set (emb (f x)) _ _ (emb (f x) (x , refl) (x , refl)) refl))
209213
210214
equiv→cancellable : is-equiv f → ∀ {x y} → is-equiv {B = f x ≡ f y} (ap f)
211215
equiv→cancellable eqv = embedding→cancellable (is-equiv→is-embedding eqv)
212216
```
213217

214218
<!--
215219
```agda
220+
cancellable→embedding'
221+
: (inj : injective f) → (∀ {x y} (p : f x ≡ f y) → ap f (inj p) ≡ p)
222+
→ is-embedding f
223+
cancellable→embedding' i p = embedding-lemma λ x → contr (x , refl) λ where
224+
(x , q) → Σ-pathp (i (sym q)) (commutes→square (ap (_∙ q) (p _) ∙∙ ∙-invl _ ∙∙ sym (∙-idr _)))
225+
216226
abstract
217227
embedding→is-hlevel
218228
: ∀ n → is-embedding f

src/1Lab/HLevel/Closure.lagda.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,15 @@ left, and `path` on the right.
134134
path ∎
135135
```
136136

137+
<!--
138+
```agda
139+
split-surjection→is-hlevel
140+
: ∀ n (f : A → B) (s : (b : B) → fibre f b)
141+
→ is-hlevel A n → is-hlevel B n
142+
split-surjection→is-hlevel n f s = retract→is-hlevel n f (λ x → s x .fst) (λ x → s x .snd)
143+
```
144+
-->
145+
137146
### Isomorphisms and equivalences
138147

139148
Even though we know that [[univalence]] implies that $n$-types are

src/1Lab/Path/Reasoning.lagda.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,39 @@ module _ (pq≡rs : p ∙ q ≡ r ∙ s) where
147147
k (i = i0) → q j
148148
k (j = i0) → p (~ i)
149149
k (i = i1) (j = i1) → s k
150+
151+
module _ {p q : x ≡ y} where
152+
∨-square : p ≡ q → Square p q refl refl
153+
∨-square sq i j = hcomp (∂ i ∨ ∂ j) λ where
154+
k (k = i0) → p j
155+
k (i = i0) → sq k j
156+
k (i = i1) → p (j ∨ k)
157+
k (j = i0) → p (i ∧ k)
158+
k (j = i1) → y
159+
160+
flatten-∨-square : Square p q refl refl → p ≡ q
161+
flatten-∨-square sq i j = hcomp (∂ i ∨ ∂ j) λ where
162+
k (k = i0) → sq j i
163+
k (i = i0) → p j
164+
k (i = i1) → q (j ∨ ~ k)
165+
k (j = i1) → y
166+
k (j = i0) → q (i ∧ ~ k)
167+
168+
∧-square : p ≡ q → Square refl refl p q
169+
∧-square sq i j = hcomp (∂ i ∨ ∂ j) λ where
170+
k (k = i0) → p (i ∧ j)
171+
k (i = i0) → x
172+
k (i = i1) → p j
173+
k (j = i0) → x
174+
k (j = i1) → sq k i
175+
176+
flatten-∧-square : Square refl refl p q → p ≡ q
177+
flatten-∧-square sq i j = hcomp (∂ i ∨ ∂ j) λ where
178+
k (k = i0) → sq j i
179+
k (i = i0) → p (j ∧ k)
180+
k (i = i1) → q j
181+
k (j = i0) → x
182+
k (j = i1) → p (i ∨ k)
150183
```
151184

152185
## Cancellation

src/Cat/Diagram/Product/Finite.lagda.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,11 @@ Cartesian→finite-products
111111
: is-category C
112112
→ ∀ {ℓ} {X : Type ℓ} → Finite X
113113
→ has-products-indexed-by C X
114-
Cartesian→finite-products cat {X = X} (fin {n} e) F =
114+
Cartesian→finite-products cat {X = X} e F =
115115
∥-∥-rec (Indexed-product-unique C _ cat) go e
116116
where
117-
go : X ≃ Fin n → Indexed-product C F
118-
go e = Indexed-product-≃ C e
119-
(Cartesian→standard-finite-products (F ⊙ Equiv.from e))
117+
go : Listing X → Indexed-product C F
118+
go l with e ← listing→equiv-fin l =
119+
Indexed-product-≃ C e
120+
(Cartesian→standard-finite-products (F ⊙ Equiv.from e))
120121
```

src/Cat/Instances/FinSets/Omega.lagda.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ cardinality of $m^*(x)$.
3333

3434
```agda
3535
fin-name : ∀ {X} → Subobject X → Fin X → Fin 2
36-
fin-name {X = X} so m with cardinality {T = fibre (so .map) m}
36+
fin-name {X = X} so m with cardinality {A = fibre (so .map) m}
3737
... | zero = 0
3838
... | suc x = 1
3939
```
@@ -58,12 +58,12 @@ are embeddings).
5858

5959
```agda
6060
from-name : ∀ {X} (m : Subobject X) x → fin-name m x ≡ 1 → fibre (m .map) x
61-
from-name m x p with cardinality {T = fibre (m .map) x} | enumeration {T = fibre (m .map) x}
61+
from-name m x p with cardinality {A = fibre (m .map) x} | enumeration {A = fibre (m .map) x}
6262
... | zero | e = absurd (fzero≠fsuc p)
6363
... | suc x | e = ∥-∥-out (injective→is-embedding! (inj m) _) (case e of λ eqv → pure (Equiv.from eqv 0))
6464
6565
to-name : ∀ {X} (m : Subobject X) x → fibre (m .map) x → fin-name m x ≡ 1
66-
to-name m x p with cardinality {T = fibre (m .map) x} | enumeration {T = fibre (m .map) x}
66+
to-name m x p with cardinality {A = fibre (m .map) x} | enumeration {A = fibre (m .map) x}
6767
... | zero | e = absurd (case e of λ eqv → Fin-absurd (Equiv.to eqv p))
6868
... | suc x | e = refl
6969
```
@@ -92,7 +92,7 @@ we then have $n(x) = n(mx') = 1$ as needed.
9292
```agda
9393
FinSets-omega .Subobject-classifier.generic .unique {m = m} {nm} pb = ext uniq where
9494
uniq : ∀ x → nm x ≡ fin-name m x
95-
uniq x with cardinality {T = fibre (m .map) x} | enumeration {T = fibre (m .map) x} | from-name m x
95+
uniq x with cardinality {A = fibre (m .map) x} | enumeration {A = fibre (m .map) x} | from-name m x
9696
... | suc n | e | f with (x' , α) ← f refl = ap nm (sym α) ∙ happly (pb .square) _
9797
```
9898

src/Cat/Instances/Shape/Cospan.lagda.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Cospan-hom cs-c cs-c = Lift _ ⊤ -- identity on c
9595
9696
instance
9797
Finite-Cospan-ob : ∀ {ℓ} → Finite (Cospan-ob ℓ)
98-
Finite-Cospan-ob = fin {cardinality = 3} (inc (Iso→Equiv i)) where
98+
Finite-Cospan-ob = inc (Equiv→listing (Equiv.inverse (Iso→Equiv i)) (Listing-Fin {n = 3})) where
9999
i : Iso _ _
100100
i .fst cs-a = 0
101101
i .fst cs-b = 1

src/Data/Fin/Base.lagda.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ Fin-elim P pfzero pfsuc i with fin-view i
151151

152152
<!--
153153
```agda
154-
fin-ap : ∀ {n} {x y : Fin n} → x .lower ≡ y .lower → x ≡ y
155-
fin-ap p = ap₂ (λ x y → fin xy ⦄) p (to-pathp refl)
154+
fin-ap : ∀ {n : I → Nat} {x : Fin (n i0)} {y : Fin (n i1)} → x .lower ≡ y .lower → PathP (λ i → Fin (n i)) x y
155+
fin-ap {n = n} {fin i ⦃ q ⦄} {fin jr ⦄} s k = fin (s k) ⦃ is-prop→pathp (λ k → hlevel {T = Irr (s k Nat.< n k)} 1) q r k ⦄
156156
```
157157
-->
158158

src/Data/Fin/Closure.lagda.md

Lines changed: 127 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ open import 1Lab.Prelude
55
open import Data.Maybe.Properties
66
open import Data.Set.Coequaliser
77
open import Data.Fin.Properties
8+
open import Data.Nat.Properties
9+
open import Data.Nat.DivMod
10+
open import Data.Nat.Order
811
open import Data.Fin.Base
9-
open import Data.Nat.Base
12+
open import Data.Nat.Base as Nat
1013
open import Data.Dec
1114
open import Data.Irr
1215
open import Data.Sum
@@ -69,20 +72,74 @@ Finite-successor {n} = Fin-suc ∙e Maybe-is-sum
6972
For binary coproducts, we prove the correspondence with addition in
7073
steps, to make the proof clearer:
7174

75+
<!--
76+
```agda
77+
module _ where private
78+
```
79+
-->
80+
7281
```agda
73-
Finite-coproduct : (Fin n ⊎ Fin m) ≃ Fin (n + m)
74-
Finite-coproduct {zero} {m} =
75-
(Fin 0 ⊎ Fin m) ≃⟨ ⊎-apl Finite-zero-is-initial ⟩
76-
(⊥ ⊎ Fin m) ≃⟨ ⊎-zerol ⟩
77-
Fin m ≃∎
78-
Finite-coproduct {suc n} {m} =
79-
(Fin (suc n) ⊎ Fin m) ≃⟨ ⊎-apl Finite-successor ⟩
80-
((⊤ ⊎ Fin n) ⊎ Fin m) ≃⟨ ⊎-assoc ⟩
81-
(⊤ ⊎ (Fin n ⊎ Fin m)) ≃⟨ ⊎-apr (Finite-coproduct {n} {m}) ⟩
82-
(⊤ ⊎ Fin (n + m)) ≃⟨ Finite-successor e⁻¹ ⟩
83-
Fin (suc (n + m)) ≃∎
82+
Finite-coproduct : (Fin n ⊎ Fin m) ≃ Fin (n + m)
83+
Finite-coproduct {zero} {m} =
84+
(Fin 0 ⊎ Fin m) ≃⟨ ⊎-apl Finite-zero-is-initial ⟩
85+
(⊥ ⊎ Fin m) ≃⟨ ⊎-zerol ⟩
86+
Fin m ≃∎
87+
Finite-coproduct {suc n} {m} =
88+
(Fin (suc n) ⊎ Fin m) ≃⟨ ⊎-apl Finite-successor ⟩
89+
((⊤ ⊎ Fin n) ⊎ Fin m) ≃⟨ ⊎-assoc ⟩
90+
(⊤ ⊎ (Fin n ⊎ Fin m)) ≃⟨ ⊎-apr (Finite-coproduct {n} {m}) ⟩
91+
(⊤ ⊎ Fin (n + m)) ≃⟨ Finite-successor e⁻¹ ⟩
92+
Fin (suc (n + m)) ≃∎
8493
```
8594

95+
<!--
96+
```agda
97+
Finite-coproduct : ∀ {m n} → (Fin m ⊎ Fin n) ≃ Fin (m + n)
98+
Finite-coproduct {m} {n} = Iso→Equiv (to , iso from ir il) where
99+
to : Fin m ⊎ Fin n → Fin (m + n)
100+
to (inl x) = record
101+
{ lower = x .lower
102+
; bounded = forget (≤-trans (to-ℕ< x .snd) (+-≤l m n))
103+
}
104+
to (inr (fin i ⦃ forget α ⦄)) =
105+
let
106+
.p : m + i Nat.< m + n
107+
p = ≤-trans (≤-refl' (sym (+-sucr m i))) (+-preserves-≤ m m (suc _) n ≤-refl α)
108+
in record
109+
{ lower = m + i
110+
; bounded = forget p
111+
}
112+
113+
from : Fin (m + n) → Fin m ⊎ Fin n
114+
from (fin i ⦃ forget b ⦄) with holds? (i Nat.< m)
115+
... | yes p = inl (fin i ⦃ forget p ⦄)
116+
... | no ¬p =
117+
let
118+
p' : m Nat.≤ i
119+
p' = ≤-peel (<-from-not-≤ _ _ ¬p)
120+
121+
q : i - m Nat.≤ i
122+
q = monus-≤ i m
123+
124+
.r : i - m Nat.< n
125+
r = +-reflects-≤l (suc (i - m)) n m (≤-trans (≤-refl' (+-sucr m (i - m))) (≤-trans (≤-refl' (ap suc (monus-inversel i m p'))) b))
126+
in inr (fin (i - m) ⦃ forget r ⦄)
127+
128+
ir : is-right-inverse from to
129+
ir (fin i ⦃ forget b ⦄) with holds? (i Nat.< m)
130+
... | yes p = fin-ap refl
131+
... | no ¬p = fin-ap (monus-inversel i m (≤-peel (<-from-not-≤ _ _ ¬p)))
132+
133+
il : is-left-inverse from to
134+
il (inl (fin i ⦃ forget b ⦄)) with holds? (i Nat.< m)
135+
... | yes p = refl
136+
... | no ¬p = absurd (¬p b)
137+
il (inr (fin i ⦃ forget b ⦄)) with holds? ((m + i) Nat.< m)
138+
... | yes p = absurd (¬sucx≤x m (+-reflects-≤l (suc m) m i (≤-trans (≤-refl' (+-sucr i m ∙ ap suc (+-commutative i m))) (≤-trans p (+-≤r i m)))))
139+
... | no ¬p = ap inr (fin-ap (monus-inverser i m))
140+
```
141+
-->
142+
86143
### Sums
87144

88145
We also have a correspondence between "coproducts" and "addition" in the
@@ -112,18 +169,67 @@ thing as summing together $n$ copies of the number $m$. Correspondingly,
112169
we can use the theorem above for general sums to establish the case of
113170
binary products:
114171

172+
<!--
115173
```agda
116-
Finite-multiply : (Fin n × Fin m) ≃ Fin (n * m)
117-
Finite-multiply {n} {m} =
118-
(Fin n × Fin m) ≃⟨ Finite-sum (λ _ → m) ⟩
119-
Fin (sum n (λ _ → m)) ≃⟨ path→equiv (ap Fin (sum≡* n m)) ⟩
120-
Fin (n * m) ≃∎
121-
where
122-
sum≡* : ∀ n m → sum n (λ _ → m) ≡ n * m
123-
sum≡* zero m = refl
124-
sum≡* (suc n) m = ap (m +_) (sum≡* n m)
174+
module _ where private
175+
```
176+
-->
177+
178+
```agda
179+
Finite-multiply : (Fin n × Fin m) ≃ Fin (n * m)
180+
Finite-multiply {n} {m} =
181+
(Fin n × Fin m) ≃⟨ Finite-sum (λ _ → m) ⟩
182+
Fin (sum n (λ _ → m)) ≃⟨ path→equiv (ap Fin (sum≡* n m)) ⟩
183+
Fin (n * m) ≃∎
184+
where
185+
sum≡* : ∀ n m → sum n (λ _ → m) ≡ n * m
186+
sum≡* zero m = refl
187+
sum≡* (suc n) m = ap (m +_) (sum≡* n m)
125188
```
126189

190+
<!--
191+
```agda
192+
Finite-multiply : ∀ {m n} → (Fin m × Fin n) ≃ Fin (m * n)
193+
Finite-multiply {zero} {n} = fst , record { is-eqv = λ o → absurd (Fin-absurd o) }
194+
Finite-multiply {suc n} {zero} = ((λ (_ , x) → absurd (Fin-absurd x))) , record { is-eqv = λ o → absurd (Fin-absurd (subst Fin (*-zeror n) o)) }
195+
Finite-multiply {m@(suc m')} {n@(suc n')} = Iso→Equiv (to , iso from ir il) where
196+
to : Fin m × Fin n → Fin (m * n)
197+
to (fin i ⦃ forget b ⦄ , fin j ⦃ forget b' ⦄) = fin (i * n + j) ⦃ forget α ⦄ where
198+
α : i * n + j Nat.< m * n
199+
α =
200+
let
201+
it : i * n + j Nat.≤ m' * n + n'
202+
it = +-preserves-≤ (i * n) (m' * n) j n' (*-preserves-≤r i m' n (≤-peel (recover b))) (≤-peel (recover b'))
203+
in s≤s (≤-trans it (≤-refl' (+-commutative (m' * n) n')))
204+
205+
from : Fin (m * n) → Fin m × Fin n
206+
from (fin i ⦃ forget b ⦄) with divmod q r quot rem ← divide-pos i n =
207+
let
208+
.b' : q Nat.≤ m
209+
b' = *-cancel-≤r n {q} {m} $
210+
≤-trans (difference→≤ r (sym quot)) (≤-sucr (≤-peel b))
211+
212+
.ne : q ≠ m
213+
ne p =
214+
let
215+
p' : m * n Nat.≤ i
216+
p' = difference→≤ r (sym (subst (λ e → i ≡ e * suc n' + r) p quot))
217+
in ¬sucx≤x _ (≤-trans b p')
218+
219+
in fin q ⦃ forget (<-from-≤ ne b') ⦄ , fin r ⦃ forget rem ⦄
220+
221+
ir : is-right-inverse from to
222+
ir (fin i ⦃ forget b ⦄) = fin-ap (sym (is-divmod i n))
223+
224+
il : is-left-inverse from to
225+
il (fin i ⦃ forget b ⦄ , fin j ⦃ forget b' ⦄) =
226+
let
227+
p : Path (DivMod (i * n + j) n) (divide-pos (i * n + j) n) (divmod i j refl b')
228+
p = prop!
229+
in fin-ap (ap DivMod.quot p) ,ₚ fin-ap (ap DivMod.rem p)
230+
```
231+
-->
232+
127233
### Products
128234

129235
Similarly to the case for sums, the cardinality of a dependent *product* of

0 commit comments

Comments
 (0)