Martin Escardo and Tom de Jong, October 2021

Modified from UF.ImageAndSurjection.lagda to add the parameter F.

We use F to control the universe where propositional truncations live.
For more comments and explanations, see the original files.

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import MLTT.Spartan

module UF.ImageAndSurjection-Variation (F : Universe โ†’ Universe) where

open import UF.Base
open import UF.Embeddings
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.Hedberg
open import UF.PropTrunc-Variation F
open import UF.Retracts
open import UF.Sets
open import UF.Sets-Properties
open import UF.Subsingletons
open import UF.Subsingletons-Properties

module ImageAndSurjection (pt : propositional-truncations-exist) where

 open PropositionalTruncation pt

 _โˆˆimage_ : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } โ†’ Y โ†’ (X โ†’ Y) โ†’ F (๐“ค โŠ” ๐“ฅ) ฬ‡
 y โˆˆimage f = โˆƒ x ๊ž‰ domain f , f x ๏ผ y

 being-in-the-image-is-prop : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (y : Y) (f : X โ†’ Y)
                            โ†’ is-prop (y โˆˆimage f)
 being-in-the-image-is-prop y f = โˆƒ-is-prop

 image : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } โ†’ (X โ†’ Y) โ†’ F (๐“ค โŠ” ๐“ฅ) โŠ” ๐“ฅ ฬ‡
 image f = ฮฃ y ๊ž‰ codomain f , y โˆˆimage f

 restriction : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
             โ†’ image f โ†’ Y
 restriction f (y , _) = y

 restriction-embedding : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                       โ†’ is-embedding (restriction f)
 restriction-embedding f = prโ‚-is-embedding (ฮป y โ†’ โˆฅโˆฅ-is-prop)

 corestriction : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
               โ†’ X โ†’ image f
 corestriction f x = f x , โˆฃ x , refl โˆฃ

 wconstant-maps-to-sets-have-propositional-images : (X : ๐“ค ฬ‡ ) {Y : ๐“ฅ ฬ‡ }
                                                  โ†’ is-set Y
                                                  โ†’ (f : X โ†’ Y)
                                                  โ†’ wconstant f
                                                  โ†’ is-prop (image f)
 wconstant-maps-to-sets-have-propositional-images X s f c (y , p) (y' , p') =
  to-ฮฃ-๏ผ (โˆฅโˆฅ-rec s (ฮป u โ†’ โˆฅโˆฅ-rec s (ฮป v โ†’ h u v) p') p ,
          โˆฅโˆฅ-is-prop _ p')
   where
    h : (ฮฃ x ๊ž‰ X , f x ๏ผ y) โ†’ (ฮฃ x' ๊ž‰ X , f x' ๏ผ y') โ†’ y ๏ผ y'
    h (x , e) (x' , e') = y    ๏ผโŸจ e โปยน โŸฉ
                          f x  ๏ผโŸจ c x x' โŸฉ
                          f x' ๏ผโŸจ e' โŸฉ
                          y'   โˆŽ

 wconstant-map-to-set-truncation-of-domain-map' : (X : ๐“ค ฬ‡ ) {Y : ๐“ฅ ฬ‡ }
                                                โ†’ is-set Y
                                                 โ†’ (f : X โ†’ Y)
                                                โ†’ wconstant f
                                                โ†’ โˆฅ X โˆฅ โ†’ image f
 wconstant-map-to-set-truncation-of-domain-map' X s f c =
  โˆฅโˆฅ-rec
  (wconstant-maps-to-sets-have-propositional-images X s f c)
  (corestriction f)

 wconstant-map-to-set-truncation-of-domain-map : (X : ๐“ค ฬ‡ ) {Y : ๐“ฅ ฬ‡ }
                                               โ†’ is-set Y
                                               โ†’ (f : X โ†’ Y)
                                               โ†’ wconstant f
                                                 โ†’ โˆฅ X โˆฅ โ†’ Y
 wconstant-map-to-set-truncation-of-domain-map X s f c =
  restriction f โˆ˜ wconstant-map-to-set-truncation-of-domain-map' X s f c

 wconstant-map-to-set-factors-through-truncation-of-domain : (X : ๐“ค ฬ‡ ) {Y : ๐“ฅ ฬ‡ }
                                                             (s : is-set Y)
                                                             (f : X โ†’ Y)
                                                             (c : wconstant f)
                                                           โ†’ f โˆผ (wconstant-map-to-set-truncation-of-domain-map X s f c) โˆ˜ โˆฃ_โˆฃ
 wconstant-map-to-set-factors-through-truncation-of-domain X s f c = ฮณ
  where
   g : โˆฅ X โˆฅ โ†’ image f
   g = wconstant-map-to-set-truncation-of-domain-map' X s f c
   p : is-prop (image f)
   p = wconstant-maps-to-sets-have-propositional-images X s f c
   ฮณ : (x : X) โ†’ f x ๏ผ restriction f (g โˆฃ x โˆฃ)
   ฮณ x = f x                               ๏ผโŸจ refl โŸฉ
         restriction f (corestriction f x) ๏ผโŸจ ap (restriction f)
                                              (p (corestriction f x) (g โˆฃ x โˆฃ)) โŸฉ
         restriction f (g โˆฃ x โˆฃ)           โˆŽ

 is-surjection : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } โ†’ (X โ†’ Y) โ†’ F (๐“ค โŠ” ๐“ฅ) โŠ” ๐“ฅ ฬ‡
 is-surjection f = โˆ€ y โ†’ โˆƒ x ๊ž‰ domain f , f x ๏ผ y

 _โ† _ : ๐“ค ฬ‡ โ†’ ๐“ฅ ฬ‡ โ†’ F (๐“ค โŠ” ๐“ฅ) โŠ” ๐“ค โŠ” ๐“ฅ ฬ‡
 X โ†  Y = ฮฃ f ๊ž‰ (X โ†’ Y) , is-surjection f

 image-is-set : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
              โ†’ (f : X โ†’ Y)
              โ†’ is-set Y
              โ†’ is-set (image f)
 image-is-set f i = subsets-of-sets-are-sets _
                     (ฮป y โ†’ y โˆˆimage f) i
                     (being-in-the-image-is-prop _ f)

 vv-equiv-iff-embedding-and-surjection  :  {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                                        โ†’ is-vv-equiv f โ†” is-embedding f ร— is-surjection f
 vv-equiv-iff-embedding-and-surjection f = g , h
  where
   g : is-vv-equiv f โ†’ is-embedding f ร— is-surjection f
   g i = (ฮป y โ†’ prโ‚ (prโ‚ the-singletons-are-the-inhabited-propositions (i y))) ,
         (ฮป y โ†’ prโ‚‚ (prโ‚ the-singletons-are-the-inhabited-propositions (i y)))

   h : is-embedding f ร— is-surjection f โ†’ is-vv-equiv f
   h (e , s) = ฮป y โ†’ prโ‚‚ the-singletons-are-the-inhabited-propositions (e y , s y)

 surjective-embeddings-are-vv-equivs : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                                     โ†’ is-embedding f โ†’ is-surjection f โ†’ is-vv-equiv f
 surjective-embeddings-are-vv-equivs f e s = prโ‚‚ (vv-equiv-iff-embedding-and-surjection f) (e , s)

 surjective-embeddings-are-equivs : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                                  โ†’ is-embedding f โ†’ is-surjection f โ†’ is-equiv f
 surjective-embeddings-are-equivs f e s = vv-equivs-are-equivs f (surjective-embeddings-are-vv-equivs f e s)

 corestriction-is-surjection : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                             โ†’ is-surjection (corestriction f)
 corestriction-is-surjection f (y , s) = โˆฅโˆฅ-functor g s
  where
   g : (ฮฃ x ๊ž‰ domain f , f x ๏ผ y) โ†’ ฮฃ x ๊ž‰ domain f , corestriction f x ๏ผ (y , s)
   g (x , p) = x , to-ฮฃ-๏ผ (p , โˆฅโˆฅ-is-prop _ _)

 pt-is-surjection : {X : ๐“ค ฬ‡ } โ†’ is-surjection (ฮป (x : X) โ†’ โˆฃ x โˆฃ)
 pt-is-surjection t = โˆฅโˆฅ-rec โˆฅโˆฅ-is-prop (ฮป x โ†’ โˆฃ x , โˆฅโˆฅ-is-prop (โˆฃ x โˆฃ) t โˆฃ) t


 Natฮฃ-is-surjection : {X : ๐“ค ฬ‡ } (A : X โ†’ ๐“ฅ ฬ‡ ) (B : X โ†’ ๐“ฆ ฬ‡ ) (ฮถ : Nat A B)
                    โ†’ ((x : X) โ†’ is-surjection (ฮถ x))
                    โ†’ is-surjection (Natฮฃ ฮถ)
 Natฮฃ-is-surjection A B ฮถ i (x , b) = ฮณ
  where
   ฮด : (ฮฃ a ๊ž‰ A x , ฮถ x a ๏ผ b)
     โ†’ ฮฃ (x' , a) ๊ž‰ ฮฃ A , (x' , ฮถ x' a) ๏ผ (x , b)
   ฮด (a , p) = (x , a) , (ap (x ,_) p)

   ฮณ : โˆƒ (x' , a) ๊ž‰ ฮฃ A , (x' , ฮถ x' a) ๏ผ (x , b)
   ฮณ = โˆฅโˆฅ-functor ฮด (i x b)

 corestriction-of-embedding-is-equivalence : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                                           โ†’ is-embedding f
                                           โ†’ is-equiv (corestriction f)
 corestriction-of-embedding-is-equivalence f e =
  surjective-embeddings-are-equivs f' e' s'
   where
    f' : domain f โ†’ image f
    f' = corestriction f
    s' : is-surjection f'
    s' = corestriction-is-surjection f
    e' : is-embedding f'
    e' (y , p) = retract-of-prop ฮณ (e y)
     where
      ฮณ : fiber f' (y , p) โ— fiber f y
      ฮณ = ฮฃ-retract (ฮป x โ†’ f' x ๏ผ y , p) (ฮป x โ†’ f x ๏ผ y) ฯ•
       where
        ฯ• : (x : domain f) โ†’ (f' x ๏ผ (y , p)) โ— (f x ๏ผ y)
        ฯ• x = ฯ , ฯƒ , ฮท
         where
          ฯ : f x ๏ผ y โ†’ f' x ๏ผ (y , p)
          ฯ q = to-subtype-๏ผ (ฮป y' โ†’ โˆฅโˆฅ-is-prop) q
          ฯƒ : f' x ๏ผ (y , p) โ†’ f x ๏ผ y
          ฯƒ q' = ap prโ‚ q'
          ฮท : ฯ โˆ˜ ฯƒ โˆผ id
          ฮท refl = to-ฮฃ-๏ผ (refl , q)    ๏ผโŸจ ap (ฮป - โ†’ to-ฮฃ-๏ผ (refl , -)) h โŸฉ
                   to-ฮฃ-๏ผ (refl , refl) ๏ผโŸจ refl โŸฉ
                   refl                 โˆŽ
           where
            q : โˆฃ x , refl โˆฃ ๏ผ โˆฃ x , refl โˆฃ
            q = โˆฅโˆฅ-is-prop โˆฃ x , refl โˆฃ โˆฃ x , refl โˆฃ
            h : q ๏ผ refl
            h = props-are-sets โˆฅโˆฅ-is-prop q refl

 embedding-if-corestriction-is-equivalence : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                                           โ†’ is-equiv (corestriction f)
                                           โ†’ is-embedding f
 embedding-if-corestriction-is-equivalence f i =
  embedding-closed-under-โˆผ f' f (โˆ˜-is-embedding eโ‚ eโ‚‚) H
   where
    f' : domain f โ†’ codomain f
    f' = prโ‚ โˆ˜ corestriction f
    H : f โˆผ prโ‚ โˆ˜ corestriction f
    H x = refl
    eโ‚ : is-embedding (corestriction f)
    eโ‚ = equivs-are-embeddings (corestriction f) i
    eโ‚‚ : is-embedding prโ‚
    eโ‚‚ = prโ‚-is-embedding (ฮป y โ†’ โˆฅโˆฅ-is-prop)

 imageInduction : โˆ€ {๐“ฆ ๐“ค ๐“ฅ} {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } โ†’ (X โ†’ Y) โ†’ ๐“ค โŠ” ๐“ฅ โŠ” ๐“ฆ  โบ ฬ‡
 imageInduction {๐“ฆ} {๐“ค} {๐“ฅ} {X} {Y} f =
                (P : Y โ†’ ๐“ฆ ฬ‡ ) โ†’ ((y : Y) โ†’ is-prop (P y)) โ†’ ((x : X) โ†’ P (f x)) โ†’ (y : Y) โ†’ P y

 surjection-induction : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                      โ†’ is-surjection f โ†’ imageInduction {๐“ฆ} f
 surjection-induction f is P isp a y = โˆฅโˆฅ-rec (isp y)
                                             (ฮป ฯƒ โ†’ transport P (prโ‚‚ ฯƒ) (a (prโ‚ ฯƒ)))
                                             (is y)

 image-surjection-converse : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                           โ†’ imageInduction f โ†’ is-surjection f
 image-surjection-converse f is' = is' (ฮป y โ†’ โˆฅ ฮฃ (ฮป x โ†’ f x ๏ผ y) โˆฅ)
                                       (ฮป y โ†’ โˆฅโˆฅ-is-prop)
                                       (ฮป x โ†’ โˆฃ x , refl โˆฃ)

 image-induction : โˆ€ {๐“ฆ} {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                   (f : X โ†’ Y) (P : image f โ†’ ๐“ฆ ฬ‡ )
                 โ†’ (โˆ€ y' โ†’ is-prop (P y'))
                 โ†’ (โˆ€ x โ†’ P (corestriction f x))
                 โ†’ โˆ€ y' โ†’ P y'
 image-induction f = surjection-induction (corestriction f)
                                          (corestriction-is-surjection f)

 retraction-surjection : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                       โ†’ has-section f โ†’ is-surjection f
 retraction-surjection {๐“ค} {๐“ฅ} {X} f ฯ† y = โˆฃ prโ‚ ฯ† y , prโ‚‚ ฯ† y โˆฃ

 prโ‚-is-surjection : {X : ๐“ค ฬ‡ } (A : X โ†’ ๐“ฅ ฬ‡ )
                   โ†’ ((x : X) โ†’ โˆฅ A x โˆฅ)
                   โ†’ is-surjection (ฮป (ฯƒ : ฮฃ A) โ†’ prโ‚ ฯƒ)
 prโ‚-is-surjection A s x = ฮณ
  where
   ฮด : A x โ†’ ฮฃ ฯƒ ๊ž‰ ฮฃ A , prโ‚ ฯƒ ๏ผ x
   ฮด a = (x , a) , refl

   ฮณ : โˆƒ ฯƒ ๊ž‰ ฮฃ A , prโ‚ ฯƒ ๏ผ x
   ฮณ = โˆฅโˆฅ-functor ฮด (s x)

 prโ‚-is-surjection-converse : {X : ๐“ค ฬ‡ } (A : X โ†’ ๐“ฅ ฬ‡ )
                            โ†’ is-surjection (ฮป (ฯƒ : ฮฃ A) โ†’ prโ‚ ฯƒ)
                            โ†’ ((x : X) โ†’ โˆฅ A x โˆฅ)
 prโ‚-is-surjection-converse A s x = ฮณ
  where
   ฮด : (ฮฃ ฯƒ ๊ž‰ ฮฃ A , prโ‚ ฯƒ ๏ผ x) โ†’ A x
   ฮด ((.x , a) , refl) = a

   ฮณ : โˆฅ A x โˆฅ
   ฮณ = โˆฅโˆฅ-functor ฮด (s x)

 surjection-โ‰ƒ-image : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                    โ†’ is-surjection f
                    โ†’ image f โ‰ƒ Y
 surjection-โ‰ƒ-image {๐“ค} {๐“ฅ} {X} {Y} f s =
  image f                       โ‰ƒโŸจ โ‰ƒ-refl _ โŸฉ
  (ฮฃ y ๊ž‰ Y , โˆƒ x ๊ž‰ X , f x ๏ผ y) โ‰ƒโŸจ ฮฃ-cong ฮณ โŸฉ
  (ฮฃ y ๊ž‰ Y , ๐Ÿ™)                 โ‰ƒโŸจ โ‰ƒ-refl _ โŸฉ
  Y ร— ๐Ÿ™                         โ‰ƒโŸจ ๐Ÿ™-rneutral {๐“ฅ} {๐“ฅ} โŸฉ
  Y                             โ– 
   where
    ฮณ : (y : Y) โ†’ (โˆƒ x ๊ž‰ X , f x ๏ผ y) โ‰ƒ ๐Ÿ™
    ฮณ y = singleton-โ‰ƒ-๐Ÿ™ (pointed-props-are-singletons (s y) โˆฅโˆฅ-is-prop)

 โˆ˜-is-surjection : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {Z : ๐“ฆ ฬ‡ } {f : X โ†’ Y} {g : Y โ†’ Z}
                 โ†’ is-surjection f โ†’ is-surjection g โ†’ is-surjection (g โˆ˜ f)
 โˆ˜-is-surjection {๐“ค} {๐“ฅ} {๐“ฆ} {X} {Y} {Z} {f} {g} ฯƒ ฯ„ z =
  โˆฅโˆฅ-rec โˆฅโˆฅ-is-prop ฮณโ‚ (ฯ„ z)
   where
    ฮณโ‚ : (ฮฃ y ๊ž‰ Y , g y ๏ผ z) โ†’ โˆƒ x ๊ž‰ X , (g โˆ˜ f) x ๏ผ z
    ฮณโ‚ (y , q) = โˆฅโˆฅ-functor ฮณโ‚‚ (ฯƒ y)
     where
      ฮณโ‚‚ : (ฮฃ x ๊ž‰ X , f x ๏ผ y) โ†’ ฮฃ x ๊ž‰ X , (g โˆ˜ f) x ๏ผ z
      ฮณโ‚‚ (x , p) = (x , (g (f x) ๏ผโŸจ ap g p โŸฉ
                         g y     ๏ผโŸจ q โŸฉ
                         z       โˆŽ))

 equivs-are-surjections : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {f : X โ†’ Y}
                        โ†’ is-equiv f โ†’ is-surjection f
 equivs-are-surjections ((ฯ , ฮท) , (ฯƒ , ฮต)) y = โˆฃ ฯ y , ฮท y โˆฃ

\end{code}