Truncated π-finite types

Content created by Fredrik Bakke and Egbert Rijke.

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

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

open import foundation.contractible-types
open import foundation.coproduct-types
open import foundation.dependent-function-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-extensionality
open import foundation.function-types
open import foundation.functoriality-dependent-pair-types
open import foundation.identity-types
open import foundation.maybe
open import foundation.propositional-truncations
open import foundation.propositions
open import foundation.retracts-of-types
open import foundation.set-truncations
open import foundation.sets
open import foundation.truncated-types
open import foundation.truncation-levels
open import foundation.unit-type
open import foundation.universe-levels

open import univalent-combinatorics.coproduct-types
open import univalent-combinatorics.counting
open import univalent-combinatorics.dependent-function-types
open import univalent-combinatorics.finite-types
open import univalent-combinatorics.finitely-many-connected-components
open import univalent-combinatorics.retracts-of-finite-types
open import univalent-combinatorics.standard-finite-types
open import univalent-combinatorics.untruncated-pi-finite-types

Idea

A type is πₙ-finite, or n-truncated π-finite, if it has finitely many connected components, all of its homotopy groups up to level n at all base points are finite, and all higher homotopy groups are trivial. Formally we define this condition inductively:

Definitions

The πₙ-finiteness predicate

is-truncated-π-finite-Prop : {l : Level} (k : )  UU l  Prop l
is-truncated-π-finite-Prop zero-ℕ X = is-finite-Prop X
is-truncated-π-finite-Prop (succ-ℕ k) X =
  product-Prop
    ( has-finitely-many-connected-components-Prop X)
    ( Π-Prop X  x  Π-Prop X  y  is-truncated-π-finite-Prop k (x  y))))

is-truncated-π-finite : {l : Level} (k : )  UU l  UU l
is-truncated-π-finite k A =
  type-Prop (is-truncated-π-finite-Prop k A)

is-prop-is-truncated-π-finite :
  {l : Level} (k : ) {A : UU l}  is-prop (is-truncated-π-finite k A)
is-prop-is-truncated-π-finite k {A} =
  is-prop-type-Prop (is-truncated-π-finite-Prop k A)

has-finitely-many-connected-components-is-truncated-π-finite :
  {l : Level} (k : ) {X : UU l} 
  is-truncated-π-finite k X  has-finitely-many-connected-components X
has-finitely-many-connected-components-is-truncated-π-finite zero-ℕ =
  has-finitely-many-connected-components-is-finite
has-finitely-many-connected-components-is-truncated-π-finite (succ-ℕ k) = pr1

is-truncated-π-finite-Id :
  {l : Level} (k : ) {X : UU l} 
  is-truncated-π-finite (succ-ℕ k) X 
  (x y : X)  is-truncated-π-finite k (x  y)
is-truncated-π-finite-Id k = pr2

πₙ-finite types are n-truncated

is-trunc-is-truncated-π-finite :
  {l : Level} (k : ) {X : UU l} 
  is-truncated-π-finite k X  is-trunc (truncation-level-ℕ k) X
is-trunc-is-truncated-π-finite zero-ℕ = is-set-is-finite
is-trunc-is-truncated-π-finite (succ-ℕ k) H x y =
  is-trunc-is-truncated-π-finite k (is-truncated-π-finite-Id k H x y)

πₙ-finite types are untruncated πₙ-finite

is-untruncated-π-finite-is-truncated-π-finite :
  {l : Level} (k : ) {A : UU l} 
  is-truncated-π-finite k A  is-untruncated-π-finite k A
is-untruncated-π-finite-is-truncated-π-finite zero-ℕ H =
  is-finite-equiv
    ( equiv-unit-trunc-Set (_ , (is-set-is-finite H)))
    ( H)
pr1 (is-untruncated-π-finite-is-truncated-π-finite (succ-ℕ k) H) =
  has-finitely-many-connected-components-is-truncated-π-finite (succ-ℕ k) H
pr2 (is-untruncated-π-finite-is-truncated-π-finite (succ-ℕ k) H) x y =
  is-untruncated-π-finite-is-truncated-π-finite k
    ( is-truncated-π-finite-Id k H x y)

The subuniverse of πₙ-finite types

Truncated-π-Finite-Type : (l : Level) (k : )  UU (lsuc l)
Truncated-π-Finite-Type l k = Σ (UU l) (is-truncated-π-finite k)

module _
  {l : Level} (k : ) (A : Truncated-π-Finite-Type l k)
  where

  type-Truncated-π-Finite-Type : UU l
  type-Truncated-π-Finite-Type = pr1 A

  is-truncated-π-finite-type-Truncated-π-Finite-Type :
    is-truncated-π-finite k type-Truncated-π-Finite-Type
  is-truncated-π-finite-type-Truncated-π-Finite-Type = pr2 A

  is-trunc-type-Truncated-π-Finite-Type :
    is-trunc (truncation-level-ℕ k) type-Truncated-π-Finite-Type
  is-trunc-type-Truncated-π-Finite-Type =
    is-trunc-is-truncated-π-finite k
      ( is-truncated-π-finite-type-Truncated-π-Finite-Type)

  is-untruncated-π-finite-type-Truncated-π-Finite-Type :
    is-untruncated-π-finite k type-Truncated-π-Finite-Type
  is-untruncated-π-finite-type-Truncated-π-Finite-Type =
    is-untruncated-π-finite-is-truncated-π-finite k
      ( is-truncated-π-finite-type-Truncated-π-Finite-Type)

Properties

Untruncated πₙ-finite n-truncated types are πₙ-finite

is-truncated-π-finite-is-untruncated-π-finite :
  {l : Level} (k : ) {A : UU l}  is-trunc (truncation-level-ℕ k) A 
  is-untruncated-π-finite k A  is-truncated-π-finite k A
is-truncated-π-finite-is-untruncated-π-finite zero-ℕ H K =
  is-finite-is-untruncated-π-finite zero-ℕ H K
pr1 (is-truncated-π-finite-is-untruncated-π-finite (succ-ℕ k) H K) = pr1 K
pr2 (is-truncated-π-finite-is-untruncated-π-finite (succ-ℕ k) H K) x y =
  is-truncated-π-finite-is-untruncated-π-finite k
    ( H x y)
    ( is-untruncated-π-finite-Id k K x y)

πₙ-finite types are closed under retracts

is-truncated-π-finite-retract :
  {l1 l2 : Level} (k : ) {A : UU l1} {B : UU l2} 
  A retract-of B  is-truncated-π-finite k B  is-truncated-π-finite k A
is-truncated-π-finite-retract zero-ℕ = is-finite-retract
pr1 (is-truncated-π-finite-retract (succ-ℕ k) r H) =
  has-finitely-many-connected-components-retract r
    ( has-finitely-many-connected-components-is-truncated-π-finite (succ-ℕ k) H)
pr2 (is-truncated-π-finite-retract (succ-ℕ k) r H) x y =
  is-truncated-π-finite-retract k
    ( retract-eq r x y)
    ( is-truncated-π-finite-Id k H
      ( inclusion-retract r x)
      ( inclusion-retract r y))

πₙ-finite types are closed under equivalences

is-truncated-π-finite-equiv :
  {l1 l2 : Level} (k : ) {A : UU l1} {B : UU l2} 
  A  B  is-truncated-π-finite k B  is-truncated-π-finite k A
is-truncated-π-finite-equiv k e =
  is-truncated-π-finite-retract k (retract-equiv e)

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

Empty types are πₙ-finite

is-truncated-π-finite-empty : (k : )  is-truncated-π-finite k empty
is-truncated-π-finite-empty zero-ℕ = is-finite-empty
is-truncated-π-finite-empty (succ-ℕ k) =
  ( has-finitely-many-connected-components-empty , ind-empty)

empty-Truncated-π-Finite-Type : (k : )  Truncated-π-Finite-Type lzero k
empty-Truncated-π-Finite-Type k = (empty , is-truncated-π-finite-empty k)

is-truncated-π-finite-is-empty :
  {l : Level} (k : ) {A : UU l}  is-empty A  is-truncated-π-finite k A
is-truncated-π-finite-is-empty zero-ℕ = is-finite-is-empty
is-truncated-π-finite-is-empty (succ-ℕ k) f =
  ( has-finitely-many-connected-components-is-empty f , ex-falso  f)

Contractible types are πₙ-finite

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

is-truncated-π-finite-unit : (k : )  is-truncated-π-finite k unit
is-truncated-π-finite-unit k =
  is-truncated-π-finite-is-contr k is-contr-unit

unit-Truncated-π-Finite-Type : (k : )  Truncated-π-Finite-Type lzero k
unit-Truncated-π-Finite-Type k =
  ( unit , is-truncated-π-finite-unit k)

Coproducts of πₙ-finite types are πₙ-finite

is-truncated-π-finite-coproduct :
  {l1 l2 : Level} (k : ) {A : UU l1} {B : UU l2} 
  is-truncated-π-finite k A  is-truncated-π-finite k B 
  is-truncated-π-finite k (A + B)
is-truncated-π-finite-coproduct k hA hB =
  is-truncated-π-finite-is-untruncated-π-finite k
    ( is-trunc-coproduct
      ( truncation-level-minus-two-ℕ k)
      ( is-trunc-is-truncated-π-finite k hA)
      ( is-trunc-is-truncated-π-finite k hB))
    ( is-untruncated-π-finite-coproduct k
      ( is-untruncated-π-finite-is-truncated-π-finite k hA)
      ( is-untruncated-π-finite-is-truncated-π-finite k hB))

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

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

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

Maybe-Truncated-π-Finite-Type :
  {l : Level} (k : ) 
  Truncated-π-Finite-Type l k  Truncated-π-Finite-Type l k
Maybe-Truncated-π-Finite-Type k (A , H) =
  ( Maybe A , is-truncated-π-finite-Maybe k H)

Any standard finite type is πₙ-finite

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

Fin-Truncated-π-Finite-Type : (k : ) (n : )  Truncated-π-Finite-Type lzero k
Fin-Truncated-π-Finite-Type k n = (Fin n , is-truncated-π-finite-Fin k n)

Any type equipped with a counting is πₙ-finite

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

Any finite type is πₙ-finite

is-truncated-π-finite-is-finite :
  {l : Level} (k : ) {A : UU l}  is-finite A  is-truncated-π-finite k A
is-truncated-π-finite-is-finite k {A} H =
  apply-universal-property-trunc-Prop H
    ( is-truncated-π-finite-Prop k A)
    ( is-truncated-π-finite-count k)

truncated-π-finite-type-Finite-Type :
  {l : Level} (k : )  Finite-Type l  Truncated-π-Finite-Type l k
truncated-π-finite-type-Finite-Type k A =
  ( type-Finite-Type A ,
    is-truncated-π-finite-is-finite k (is-finite-type-Finite-Type A))

πₙ-finite sets are finite

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

πₙ-finite types are πₙ₊₁-finite

is-truncated-π-finite-succ-is-truncated-π-finite :
  {l : Level} (k : ) {A : UU l} 
  is-truncated-π-finite k A  is-truncated-π-finite (succ-ℕ k) A
is-truncated-π-finite-succ-is-truncated-π-finite zero-ℕ =
  is-truncated-π-finite-is-finite 1
is-truncated-π-finite-succ-is-truncated-π-finite (succ-ℕ k) (H , K) =
  ( H ,  x y  is-truncated-π-finite-succ-is-truncated-π-finite k (K x y)))

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

is-truncated-π-finite-Type-With-Cardinality-ℕ :
  {l : Level} (n : )  is-truncated-π-finite 1 (Type-With-Cardinality-ℕ l n)
is-truncated-π-finite-Type-With-Cardinality-ℕ n =
  is-truncated-π-finite-is-untruncated-π-finite 1
    ( is-1-type-Type-With-Cardinality-ℕ n)
    ( is-untruncated-π-finite-Type-With-Cardinality-ℕ 1 n)

Type-With-Cardinality-ℕ-Truncated-π-Finite-Type :
  (l : Level) (n : )  Truncated-π-Finite-Type (lsuc l) 1
Type-With-Cardinality-ℕ-Truncated-π-Finite-Type l n =
  ( Type-With-Cardinality-ℕ l n ,
    is-truncated-π-finite-Type-With-Cardinality-ℕ n)

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

is-truncated-π-finite-Π :
  {l1 l2 : Level} (k : ) {A : UU l1} {B : A  UU l2} 
  is-finite A  ((a : A)  is-truncated-π-finite k (B a)) 
  is-truncated-π-finite k ((a : A)  B a)
is-truncated-π-finite-Π k hA hB =
  is-truncated-π-finite-is-untruncated-π-finite k
    ( is-trunc-Π (truncation-level-ℕ k) (is-trunc-is-truncated-π-finite k  hB))
    ( is-untruncated-π-finite-Π k hA
      ( is-untruncated-π-finite-is-truncated-π-finite k  hB))

finite-Π-Truncated-π-Finite-Type :
  {l1 l2 : Level} (k : ) (A : Finite-Type l1)
  (B : type-Finite-Type A  Truncated-π-Finite-Type l2 k) 
  Truncated-π-Finite-Type (l1  l2) k
pr1 (finite-Π-Truncated-π-Finite-Type k A B) =
  (x : type-Finite-Type A)  (type-Truncated-π-Finite-Type k (B x))
pr2 (finite-Π-Truncated-π-Finite-Type k A B) =
  is-truncated-π-finite-Π k
    ( is-finite-type-Finite-Type A)
      ( λ x  is-truncated-π-finite-type-Truncated-π-Finite-Type k (B x))

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

is-truncated-π-finite-Σ :
  {l1 l2 : Level} (k : ) {A : UU l1} {B : A  UU l2} 
  is-truncated-π-finite k A  ((a : A)  is-truncated-π-finite k (B a)) 
  is-truncated-π-finite k (Σ A B)
is-truncated-π-finite-Σ k hA hB =
  is-truncated-π-finite-is-untruncated-π-finite k
    ( is-trunc-Σ
      ( is-trunc-is-truncated-π-finite k hA)
      ( is-trunc-is-truncated-π-finite k  hB))
    ( is-untruncated-π-finite-Σ k
      ( is-untruncated-π-finite-is-truncated-π-finite (succ-ℕ k)
        ( is-truncated-π-finite-succ-is-truncated-π-finite k hA))
      ( is-untruncated-π-finite-is-truncated-π-finite k  hB))

Σ-Truncated-π-Finite-Type :
  {l1 l2 : Level} (k : ) (A : Truncated-π-Finite-Type l1 k)
  (B : type-Truncated-π-Finite-Type k A  Truncated-π-Finite-Type l2 k) 
  Truncated-π-Finite-Type (l1  l2) k
pr1 (Σ-Truncated-π-Finite-Type k A B) =
  Σ (type-Truncated-π-Finite-Type k A) (type-Truncated-π-Finite-Type k  B)
pr2 (Σ-Truncated-π-Finite-Type k A B) =
  is-truncated-π-finite-Σ k
    ( is-truncated-π-finite-type-Truncated-π-Finite-Type k A)
    ( is-truncated-π-finite-type-Truncated-π-Finite-Type k  B)

See also

Recent changes