Unbounded π-finite types

Content created by Fredrik Bakke and Egbert Rijke.

Created on 2025-01-06.
Last modified on 2025-01-06.

{-# OPTIONS --guardedness #-}

module univalent-combinatorics.unbounded-pi-finite-types where
Imports
open import elementary-number-theory.natural-numbers

open import foundation.cartesian-product-types
open import foundation.contractible-types
open import foundation.coproduct-types
open import foundation.dependent-pair-types
open import foundation.empty-types
open import foundation.equality-coproduct-types
open import foundation.equivalences
open import foundation.function-types
open import foundation.identity-types
open import foundation.maybe
open import foundation.retracts-of-types
open import foundation.set-truncations
open import foundation.sets
open import foundation.unit-type
open import foundation.universe-levels

open import univalent-combinatorics.counting
open import univalent-combinatorics.equality-finite-types
open import univalent-combinatorics.finite-types
open import univalent-combinatorics.finitely-many-connected-components
open import univalent-combinatorics.function-types
open import univalent-combinatorics.pi-finite-types
open import univalent-combinatorics.standard-finite-types
open import univalent-combinatorics.untruncated-pi-finite-types

Idea

A type is unbounded π-finite if it has finitely many connected components and all of its homotopy groups at all base points and all dimensions are finite. Unbounded π-finiteness can be understood as an ∞-dimensional analogue of Kuratowski finitneness [Ane24].

Definitions

The predicate on types of being unbounded π-finite

record is-unbounded-π-finite {l : Level} (X : UU l) : UU l
  where
  coinductive
  field
    has-finitely-many-connected-components-is-unbounded-π-finite :
      has-finitely-many-connected-components X

    is-unbounded-π-finite-Id-is-unbounded-π-finite :
      (x y : X)  is-unbounded-π-finite (x  y)

open is-unbounded-π-finite public

The type of unbounded π-finite types

Unbounded-π-Finite-Type : (l : Level)  UU (lsuc l)
Unbounded-π-Finite-Type l = Σ (UU l) (is-unbounded-π-finite)

module _
  {l : Level} (X : Unbounded-π-Finite-Type l)
  where

  type-Unbounded-π-Finite-Type : UU l
  type-Unbounded-π-Finite-Type = pr1 X

  is-unbounded-π-finite-Unbounded-π-Finite-Type :
    is-unbounded-π-finite type-Unbounded-π-Finite-Type
  is-unbounded-π-finite-Unbounded-π-Finite-Type = pr2 X

  has-finitely-many-connected-components-Unbounded-π-Finite-Type :
    has-finitely-many-connected-components type-Unbounded-π-Finite-Type
  has-finitely-many-connected-components-Unbounded-π-Finite-Type =
    has-finitely-many-connected-components-is-unbounded-π-finite
      ( is-unbounded-π-finite-Unbounded-π-Finite-Type)

  is-unbounded-π-finite-Id-Unbounded-π-Finite-Type :
    (x y : type-Unbounded-π-Finite-Type)  is-unbounded-π-finite (x  y)
  is-unbounded-π-finite-Id-Unbounded-π-Finite-Type =
    is-unbounded-π-finite-Id-is-unbounded-π-finite
      ( is-unbounded-π-finite-Unbounded-π-Finite-Type)

Properties

Characterizing equality of unbounded π-finiteness

module _
  {l : Level} {X : UU l}
  where

  Eq-is-unbounded-π-finite :
    (p q : is-unbounded-π-finite X)  UU l
  Eq-is-unbounded-π-finite p q =
    ( has-finitely-many-connected-components-is-unbounded-π-finite p 
      has-finitely-many-connected-components-is-unbounded-π-finite q) ×
    ( (x y : X) 
      is-unbounded-π-finite-Id-is-unbounded-π-finite p x y 
      is-unbounded-π-finite-Id-is-unbounded-π-finite q x y)

  refl-Eq-is-unbounded-π-finite :
    (p : is-unbounded-π-finite X)  Eq-is-unbounded-π-finite p p
  refl-Eq-is-unbounded-π-finite p = (refl , λ x y  refl)

  Eq-eq-is-unbounded-π-finite :
    (p q : is-unbounded-π-finite X)  p  q  Eq-is-unbounded-π-finite p q
  Eq-eq-is-unbounded-π-finite p .p refl = refl-Eq-is-unbounded-π-finite p

It remains to show that Eq-is-unbounded-π-finite defines an identity system on is-unbounded-π-finite.

Unbounded π-finite types are closed under equivalences

is-unbounded-π-finite-equiv :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A  B) 
  is-unbounded-π-finite B  is-unbounded-π-finite A
is-unbounded-π-finite-equiv e H =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-equiv' e
      ( has-finitely-many-connected-components-is-unbounded-π-finite H)
  .is-unbounded-π-finite-Id-is-unbounded-π-finite x y 
    is-unbounded-π-finite-equiv
      ( equiv-ap e x y)
      ( is-unbounded-π-finite-Id-is-unbounded-π-finite H
        ( map-equiv e x)
        ( map-equiv e y))

is-unbounded-π-finite-equiv' :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A  B) 
  is-unbounded-π-finite A  is-unbounded-π-finite B
is-unbounded-π-finite-equiv' e = is-unbounded-π-finite-equiv (inv-equiv e)

Unbounded π-finite types are closed under retracts

is-unbounded-π-finite-retract :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} 
  A retract-of B  is-unbounded-π-finite B  is-unbounded-π-finite A
is-unbounded-π-finite-retract r H =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-retract r
      ( has-finitely-many-connected-components-is-unbounded-π-finite H)
  .is-unbounded-π-finite-Id-is-unbounded-π-finite x y 
    is-unbounded-π-finite-retract
      ( retract-eq r x y)
      ( is-unbounded-π-finite-Id-is-unbounded-π-finite H
        ( inclusion-retract r x)
        ( inclusion-retract r y))

Empty types are unbounded π-finite

is-unbounded-π-finite-empty : is-unbounded-π-finite empty
is-unbounded-π-finite-empty =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-empty
  .is-unbounded-π-finite-Id-is-unbounded-π-finite ()

empty-Unbounded-π-Finite-Type : Unbounded-π-Finite-Type lzero
empty-Unbounded-π-Finite-Type = empty , is-unbounded-π-finite-empty

is-unbounded-π-finite-is-empty :
  {l : Level} {A : UU l}  is-empty A  is-unbounded-π-finite A
is-unbounded-π-finite-is-empty f =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-is-empty f
  .is-unbounded-π-finite-Id-is-unbounded-π-finite  ex-falso  f

Contractible types are unbounded π-finite

is-unbounded-π-finite-is-contr :
  {l : Level} {A : UU l}  is-contr A  is-unbounded-π-finite A
is-unbounded-π-finite-is-contr H =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-is-contr H
  .is-unbounded-π-finite-Id-is-unbounded-π-finite x y 
    is-unbounded-π-finite-is-contr (is-prop-is-contr H x y)

is-unbounded-π-finite-unit : is-unbounded-π-finite unit
is-unbounded-π-finite-unit = is-unbounded-π-finite-is-contr is-contr-unit

unit-Unbounded-π-Finite-Type : Unbounded-π-Finite-Type lzero
unit-Unbounded-π-Finite-Type = unit , is-unbounded-π-finite-unit

Coproducts of unbounded π-finite types are unbounded π-finite

is-unbounded-π-finite-coproduct :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} 
  is-unbounded-π-finite A 
  is-unbounded-π-finite B 
  is-unbounded-π-finite (A + B)
is-unbounded-π-finite-coproduct H K =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-coproduct
      ( has-finitely-many-connected-components-is-unbounded-π-finite H)
      ( has-finitely-many-connected-components-is-unbounded-π-finite K)
  .is-unbounded-π-finite-Id-is-unbounded-π-finite (inl x) (inl y) 
    is-unbounded-π-finite-equiv
      ( compute-eq-coproduct-inl-inl x y)
      ( is-unbounded-π-finite-Id-is-unbounded-π-finite H x y)
  .is-unbounded-π-finite-Id-is-unbounded-π-finite (inl x) (inr y) 
    is-unbounded-π-finite-equiv
      ( compute-eq-coproduct-inl-inr x y)
      ( is-unbounded-π-finite-empty)
  .is-unbounded-π-finite-Id-is-unbounded-π-finite (inr x) (inl y) 
    is-unbounded-π-finite-equiv
      ( compute-eq-coproduct-inr-inl x y)
      ( is-unbounded-π-finite-empty)
  .is-unbounded-π-finite-Id-is-unbounded-π-finite (inr x) (inr y) 
    is-unbounded-π-finite-equiv
      ( compute-eq-coproduct-inr-inr x y)
      ( is-unbounded-π-finite-Id-is-unbounded-π-finite K x y)

coproduct-Unbounded-π-Finite-Type :
  {l1 l2 : Level} 
  Unbounded-π-Finite-Type l1 
  Unbounded-π-Finite-Type l2 
  Unbounded-π-Finite-Type (l1  l2)
pr1 (coproduct-Unbounded-π-Finite-Type A B) =
  (type-Unbounded-π-Finite-Type A + type-Unbounded-π-Finite-Type B)
pr2 (coproduct-Unbounded-π-Finite-Type A B) =
  is-unbounded-π-finite-coproduct
    ( is-unbounded-π-finite-Unbounded-π-Finite-Type A)
    ( is-unbounded-π-finite-Unbounded-π-Finite-Type B)

Maybe A of any unbounded π-finite type A is unbounded π-finite

Maybe-Unbounded-π-Finite-Type :
  {l : Level}  Unbounded-π-Finite-Type l  Unbounded-π-Finite-Type l
Maybe-Unbounded-π-Finite-Type A =
  coproduct-Unbounded-π-Finite-Type A unit-Unbounded-π-Finite-Type

is-unbounded-π-finite-Maybe :
  {l : Level} {A : UU l} 
  is-unbounded-π-finite A  is-unbounded-π-finite (Maybe A)
is-unbounded-π-finite-Maybe H =
  is-unbounded-π-finite-coproduct H is-unbounded-π-finite-unit

The standard finite types are unbounded π-finite

is-unbounded-π-finite-Fin :
  (n : )  is-unbounded-π-finite (Fin n)
is-unbounded-π-finite-Fin zero-ℕ =
  is-unbounded-π-finite-empty
is-unbounded-π-finite-Fin (succ-ℕ n) =
  is-unbounded-π-finite-Maybe (is-unbounded-π-finite-Fin n)

Fin-Unbounded-π-Finite-Type : (n : )  Unbounded-π-Finite-Type lzero
pr1 (Fin-Unbounded-π-Finite-Type n) = Fin n
pr2 (Fin-Unbounded-π-Finite-Type n) = is-unbounded-π-finite-Fin n

Any type equipped with a counting is unbounded π-finite

is-unbounded-π-finite-count :
  {l : Level} {A : UU l}  count A  is-unbounded-π-finite A
is-unbounded-π-finite-count (n , e) =
  is-unbounded-π-finite-equiv' e (is-unbounded-π-finite-Fin n)

Any finite type is unbounded π-finite

is-unbounded-π-finite-is-finite :
  {l : Level} {A : UU l}  is-finite A  is-unbounded-π-finite A
is-unbounded-π-finite-is-finite {A = A} H =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-is-finite H
  .is-unbounded-π-finite-Id-is-unbounded-π-finite x y 
    is-unbounded-π-finite-is-finite (is-finite-eq-is-finite H)

unbounded-π-finite-𝔽 : {l : Level}  𝔽 l  Unbounded-π-Finite-Type l
unbounded-π-finite-𝔽 A =
  ( type-𝔽 A , is-unbounded-π-finite-is-finite (is-finite-type-𝔽 A))

The type of all n-element types in UU l is unbounded π-finite

is-unbounded-π-finite-UU-Fin :
  {l : Level} (n : )  is-unbounded-π-finite (UU-Fin l n)
is-unbounded-π-finite-UU-Fin n =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    has-finitely-many-connected-components-UU-Fin n
  .is-unbounded-π-finite-Id-is-unbounded-π-finite x y 
    is-unbounded-π-finite-equiv
      ( equiv-equiv-eq-UU-Fin n x y)
      ( is-unbounded-π-finite-is-finite
        ( is-finite-≃
          ( is-finite-has-finite-cardinality (n , pr2 x))
          ( is-finite-has-finite-cardinality (n , pr2 y))))

Unbounded π-finite sets are finite

is-finite-is-unbounded-π-finite :
  {l : Level} {A : UU l}  is-set A  is-unbounded-π-finite A  is-finite A
is-finite-is-unbounded-π-finite H K =
  is-finite-equiv'
    ( equiv-unit-trunc-Set (_ , H))
    ( has-finitely-many-connected-components-is-unbounded-π-finite K)

π-finite types are unbounded π-finite

is-unbounded-π-finite-is-π-finite :
  {l : Level} (k : ) {A : UU l} 
  is-π-finite k A  is-unbounded-π-finite A
is-unbounded-π-finite-is-π-finite zero-ℕ =
  is-unbounded-π-finite-is-finite
is-unbounded-π-finite-is-π-finite (succ-ℕ k) H =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite 
    pr1 H
  .is-unbounded-π-finite-Id-is-unbounded-π-finite x y 
    is-unbounded-π-finite-is-π-finite k (pr2 H x y)

Unbounded π-finite types are types that are untruncated πₙ-finite for all n

is-unbounded-π-finite-Id-is-unbounded-π-finite' :
  {l : Level} {A : UU l} 
  ((k : )  is-untruncated-π-finite k A) 
  (x y : A) 
  (k : )  is-untruncated-π-finite k (x  y)
is-unbounded-π-finite-Id-is-unbounded-π-finite' H x y k = pr2 (H (succ-ℕ k)) x y

is-unbounded-π-finite-is-untruncated-π-finite :
  {l : Level} {A : UU l} 
  ((k : )  is-untruncated-π-finite k A) 
  is-unbounded-π-finite A
is-unbounded-π-finite-is-untruncated-π-finite H =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite  H 0
  .is-unbounded-π-finite-Id-is-unbounded-π-finite x y 
    is-unbounded-π-finite-is-untruncated-π-finite
      ( is-unbounded-π-finite-Id-is-unbounded-π-finite' H x y)

is-untruncated-π-finite-is-unbounded-π-finite :
  {l : Level} {A : UU l} 
  is-unbounded-π-finite A 
  (k : )  is-untruncated-π-finite k A
is-untruncated-π-finite-is-unbounded-π-finite H zero-ℕ =
  has-finitely-many-connected-components-is-unbounded-π-finite H
pr1 (is-untruncated-π-finite-is-unbounded-π-finite H (succ-ℕ k)) =
  is-untruncated-π-finite-is-unbounded-π-finite H zero-ℕ
pr2 (is-untruncated-π-finite-is-unbounded-π-finite H (succ-ℕ k)) x y =
  is-untruncated-π-finite-is-unbounded-π-finite
    ( is-unbounded-π-finite-Id-is-unbounded-π-finite H x y)
    ( k)

Finite products of unbounded π-finite types are unbounded π-finite

Agda is not convinced that the following proof is productive.

is-unbounded-π-finite-Π :
  {l1 l2 : Level} {A : UU l1} {B : A → UU l2} →
  is-finite A → ((a : A) → is-unbounded-π-finite (B a)) →
  is-unbounded-π-finite ((a : A) → B a)
is-unbounded-π-finite-Π H K =
  λ where
  .has-finitely-many-connected-components-is-unbounded-π-finite →
    has-finitely-many-connected-components-finite-Π H
      ( λ a →
        has-finitely-many-connected-components-is-unbounded-π-finite (K a))
  .is-unbounded-π-finite-Id-is-unbounded-π-finite f g →
    is-unbounded-π-finite-equiv
      ( equiv-funext)
      ( is-unbounded-π-finite-Π H
        ( λ a →
          is-unbounded-π-finite-Id-is-unbounded-π-finite (K a) (f a) (g a)))

Instead, we give a proof using the description of unbounded π-finite types as types that are untruncated πₙ-finite for all n.

is-unbounded-π-finite-Π :
  {l1 l2 : Level} {A : UU l1} {B : A  UU l2} 
  is-finite A  ((a : A)  is-unbounded-π-finite (B a)) 
  is-unbounded-π-finite ((a : A)  B a)
is-unbounded-π-finite-Π H K =
  is-unbounded-π-finite-is-untruncated-π-finite
    ( λ k 
      is-untruncated-π-finite-Π k H
        ( λ a  is-untruncated-π-finite-is-unbounded-π-finite (K a) k))

Dependent sums of unbounded π-finite types are unbounded π-finite

The dependent sum of a family of unbounded π-finite types over an unbounded π-finite base is unbounded π-finite.

abstract
  is-unbounded-π-finite-Σ :
    {l1 l2 : Level} {A : UU l1} {B : A  UU l2} 
    is-unbounded-π-finite A  ((x : A)  is-unbounded-π-finite (B x)) 
    is-unbounded-π-finite (Σ A B)
  is-unbounded-π-finite-Σ H K =
    is-unbounded-π-finite-is-untruncated-π-finite
      ( λ k 
        is-untruncated-π-finite-Σ k
          ( is-untruncated-π-finite-is-unbounded-π-finite H (succ-ℕ k))
          ( λ x  is-untruncated-π-finite-is-unbounded-π-finite (K x) k))

References

The category of unbounded π-finite spaces is considered in great detail in [Ane24].

[Ane24]
Mathieu Anel. The category of π-finite spaces. 2024. arXiv:2107.02082.

Recent changes