Subfinite types

Content created by Fredrik Bakke.

Created on 2025-08-14.
Last modified on 2025-08-14.

module univalent-combinatorics.subfinite-types where
Imports
open import elementary-number-theory.natural-numbers

open import foundation.decidable-equality
open import foundation.dependent-pair-types
open import foundation.discrete-types
open import foundation.embeddings
open import foundation.equivalences
open import foundation.injective-maps
open import foundation.propositional-truncations
open import foundation.propositions
open import foundation.sets
open import foundation.universe-levels

open import univalent-combinatorics.dedekind-finite-types
open import univalent-combinatorics.equality-standard-finite-types
open import univalent-combinatorics.standard-finite-types
open import univalent-combinatorics.subcounting

Idea

A type X is subfinite if there exists an embedding into a standard finite type.

Definitions

The predicate of being subfinite

is-subfinite-Prop : {l : Level}  UU l  Prop l
is-subfinite-Prop X = trunc-Prop (subcount X)

is-subfinite : {l : Level}  UU l  UU l
is-subfinite X = type-Prop (is-subfinite-Prop X)

is-prop-is-subfinite : {l : Level} {X : UU l}  is-prop (is-subfinite X)
is-prop-is-subfinite {X = X} = is-prop-type-Prop (is-subfinite-Prop X)

The subuniverse of subfinite types

Subfinite-Type : (l : Level)  UU (lsuc l)
Subfinite-Type l = Σ (UU l) (is-subfinite)

module _
  {l : Level} (X : Subfinite-Type l)
  where

  type-Subfinite-Type : UU l
  type-Subfinite-Type = pr1 X

  is-subfinite-type-Subfinite-Type : is-subfinite type-Subfinite-Type
  is-subfinite-type-Subfinite-Type = pr2 X

Properties

The standard finite types are subfinite

Fin-Subfinite-Type : (n : )  Subfinite-Type lzero
Fin-Subfinite-Type n = (Fin n , unit-trunc-Prop (subcount-Fin n))

Subfinite types are discrete

module _
  {l : Level} (X : Subfinite-Type l)
  where

  has-decidable-equality-type-Subfinite-Type :
    has-decidable-equality (type-Subfinite-Type X)
  has-decidable-equality-type-Subfinite-Type =
    rec-trunc-Prop
      ( has-decidable-equality-Prop (type-Subfinite-Type X))
      ( λ (k , f)  has-decidable-equality-emb f (has-decidable-equality-Fin k))
      ( is-subfinite-type-Subfinite-Type X)

  discrete-type-Subfinite-Type : Discrete-Type l
  discrete-type-Subfinite-Type =
    ( type-Subfinite-Type X , has-decidable-equality-type-Subfinite-Type)

Subfinite types are sets

module _
  {l : Level} (X : Subfinite-Type l)
  where

  is-set-type-Subfinite-Type : is-set (type-Subfinite-Type X)
  is-set-type-Subfinite-Type =
    is-set-has-decidable-equality (has-decidable-equality-type-Subfinite-Type X)

  set-Subfinite-Type : Set l
  set-Subfinite-Type = (type-Subfinite-Type X , is-set-type-Subfinite-Type)

Subfinite types are Dedekind finite

We reproduce a proof given by Gro-Tsen in this MathOverflow answer: https://mathoverflow.net/a/433318.

Proof. Let be a subfinite type witnessed by , and let be an arbitrary self-embedding. It suffices to prove is surjective, so assume given an where we want to show there exists such that . The mapping defines an -indexed sequence of elements of . Since the standard pigeonhole principle applies to there has to be in such that . Since is an embedding we in particular have . By injectivity of we can cancel applications on both sides of the equation to obtain , and so is our desired preimage of . ∎

module _
  {l : Level} (X : Subfinite-Type l)
  where

  is-dedekind-finite-type-Subfinite-Type' :
    (f : type-Subfinite-Type X  type-Subfinite-Type X) 
    is-injective f  is-equiv f
  is-dedekind-finite-type-Subfinite-Type' f is-injective-f =
    rec-trunc-Prop
      ( is-equiv-Prop f)
      ( λ j  is-dedekind-finite-subcount' j f is-injective-f)
      ( is-subfinite-type-Subfinite-Type X)

  is-dedekind-finite-type-Subfinite-Type :
    is-dedekind-finite (type-Subfinite-Type X)
  is-dedekind-finite-type-Subfinite-Type f is-emb-f =
    is-dedekind-finite-type-Subfinite-Type' f (is-injective-is-emb is-emb-f)

  dedekind-finite-type-Subfinite-Type : Dedekind-Finite-Type l
  dedekind-finite-type-Subfinite-Type =
    ( type-Subfinite-Type X , is-dedekind-finite-type-Subfinite-Type)

The Cantor–Schröder–Bernstein theorem for subfinite types

If two subfinite types X and Y mutually embed, X ↪ Y and Y ↪ X, then X ≃ Y.

module _
  {l1 l2 : Level} (X : Subfinite-Type l1) (Y : Subfinite-Type l2)
  where

  Cantor-Schröder-Bernstein-Subfinite-Type :
    (type-Subfinite-Type X  type-Subfinite-Type Y) 
    (type-Subfinite-Type Y  type-Subfinite-Type X) 
    type-Subfinite-Type X  type-Subfinite-Type Y
  Cantor-Schröder-Bernstein-Subfinite-Type =
    Cantor-Schröder-Bernstein-Dedekind-Finite-Type
      ( dedekind-finite-type-Subfinite-Type X)
      ( dedekind-finite-type-Subfinite-Type Y)

Recent changes