Projective types

Content created by Fredrik Bakke, Jonathan Prieto-Cubides and Egbert Rijke.

Created on 2023-02-06.
Last modified on 2026-09-09.

module foundation.projective-types where
Imports
open import foundation.dependent-pair-types
open import foundation.dependent-products-propositions
open import foundation.equivalences
open import foundation.fibers-of-maps
open import foundation.function-types
open import foundation.identity-types
open import foundation.inhabited-types
open import foundation.postcomposition-functions
open import foundation.raising-universe-levels
open import foundation.surjective-maps
open import foundation.universe-levels

open import foundation-core.propositions
open import foundation-core.sets

Idea

A type X is said to be set-projective if for every surjective map f : A ↠ B onto a set B the postcomposition function

  (X → A) → (X → B)

is surjective. This is equivalent to the condition that for every equivalence relation R on a type A the natural map

  (X → A)/~ → (X → A/R)

is an equivalence. The latter map is always an embedding, and it is an equivalence for every X, A, and R if and only if the axiom of choice holds.

A type is said to be projective if there is a choice function

for every type family . This condition might be stronger than set-projectivity when is not a set.

Definitions

Set-projective types

is-set-projective-Level :
  {l1 : Level} (l2 l3 : Level)  UU l1  UU (l1  lsuc l2  lsuc l3)
is-set-projective-Level l2 l3 X =
  (A : UU l2) (B : Set l3) (f : A  type-Set B) 
  is-surjective (postcomp X (map-surjection f))

is-set-projective : {l1 : Level}  UU l1  UUω
is-set-projective X = {l2 l3 : Level}  is-set-projective-Level l2 l3 X

Projective types

module _
  {l1 : Level} (l2 : Level) (X : UU l1)
  where

  is-projective-Level : UU (l1  lsuc l2)
  is-projective-Level =
    (P : X  UU l2) 
    ((x : X)  is-inhabited (P x)) 
    is-inhabited ((x : X)  (P x))

  abstract
    is-prop-is-projective-Level : is-prop is-projective-Level
    is-prop-is-projective-Level =
      is-prop-Π
        ( λ P 
          is-prop-function-type
            ( is-property-is-inhabited ((x : X)  P x)))

  is-projective-prop-Level : Prop (l1  lsuc l2)
  is-projective-prop-Level =
    ( is-projective-Level , is-prop-is-projective-Level)

is-projective : {l1 : Level}  UU l1  UUω
is-projective X = {l2 : Level}  is-projective-Level l2 X

The universe of projective sets

Projective-Set : (l1 l2 : Level)  UU (lsuc l1  lsuc l2)
Projective-Set l1 l2 = Σ (Set l1) (is-projective-Level l2  type-Set)

module _
  {l1 l2 : Level} (X : Projective-Set l1 l2)
  where

  set-Projective-Set : Set l1
  set-Projective-Set = pr1 X

  type-Projective-Set : UU l1
  type-Projective-Set = type-Set set-Projective-Set

  is-set-type-Projective-Set : is-set type-Projective-Set
  is-set-type-Projective-Set = is-set-type-Set set-Projective-Set

  is-projective-Projective-Set : is-projective-Level l2 type-Projective-Set
  is-projective-Projective-Set = pr2 X

Properties

Lowering universe levels for projectivity

is-projective-is-projective-lub-Level :
  {l1 : Level} (l2 l3 : Level) {X : UU l1} 
  is-projective-Level (l2  l3) X 
  is-projective-Level l2 X
is-projective-is-projective-lub-Level l2 l3 H P h =
  map-is-inhabited
    ( λ f x  map-inv-raise (f x))
    ( H
      ( λ x  raise l3 (P x))
      ( λ x  map-is-inhabited map-raise (h x)))

is-projective-is-projective-lsuc-Level :
  {l1 : Level} (l2 : Level) {X : UU l1} 
  is-projective-Level (lsuc l2) X 
  is-projective-Level l2 X
is-projective-is-projective-lsuc-Level l2 =
  is-projective-is-projective-lub-Level l2 (lsuc l2)

Set-projective sets are projective

is-projective-is-set-projective-Level :
  {l1 l2 : Level} {X : UU l1} 
  is-set X 
  is-set-projective-Level (l1  l2) l1 X 
  is-projective-Level l2 X
is-projective-is-set-projective-Level {X = X} K H P h =
  map-is-inhabited
    ( map-inv-equiv (compute-fiber-postcomp-pr1 P id))
    ( H
      ( Σ X P)
      ( X , K)
      ( pr1 ,
        λ x  map-is-inhabited  y  ((x , y) , refl)) (h x))
      ( id))

is-projective-is-set-projective :
  {l1 : Level} {X : UU l1} 
  is-set X 
  is-set-projective X 
  is-projective X
is-projective-is-set-projective {l1} {X} K H {l2} =
  is-projective-is-set-projective-Level K (H {l1  l2} {l1})

See also

Recent changes