Martin Escardo 1st May 2020.

This is ported from the Midlands Graduate School 2019 lecture notes

 https://www.cs.bham.ac.uk/~mhe/HoTT-UF.in-Agda-Lecture-Notes/HoTT-UF-Agda.html
 https://github.com/martinescardo/HoTT-UF.Agda-Lecture-Notes

\begin{code}

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

module MGS.Map-Classifiers where

open import MGS.FunExt-from-Univalence public

_/_ : (𝓤 : Universe)  𝓥 ̇  𝓤   𝓥 ̇
𝓤 / Y = Σ X  𝓤 ̇ , (X  Y)

total-fiber-is-domain : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                       Σ (fiber f)  X

total-fiber-is-domain {𝓤} {𝓥} {X} {Y} f = invertibility-gives-≃ g (h , η , ε)
 where
  g : (Σ y  Y , Σ x  X , f x  y)  X
  g (y , x , p) = x

  h : X  Σ y  Y , Σ x  X , f x  y
  h x = (f x , x , refl (f x))

  η :  t  h (g t)  t
  η (_ , x , refl _) = refl (f x , x , refl _)

  ε : (x : X)  g (h x)  x
  ε = refl

χ : (Y : 𝓤 ̇ )  𝓤 / Y   (Y  𝓤 ̇ )
χ Y (X , f) = fiber f

is-map-classifier : (𝓤 : Universe)  𝓤  ̇
is-map-classifier 𝓤 = (Y : 𝓤 ̇ )  is-equiv (χ Y)

𝕋 : (Y : 𝓤 ̇ )  (Y  𝓤 ̇ )  𝓤 / Y
𝕋 Y A = Σ A , pr₁

χη : is-univalent 𝓤
    (Y : 𝓤 ̇ ) (σ : 𝓤 / Y)  𝕋 Y (χ Y σ)  σ

χη ua Y (X , f) = r
 where
  e : Σ (fiber f)  X
  e = total-fiber-is-domain f

  p : Σ (fiber f)  X
  p = Eq→Id ua (Σ (fiber f)) X e

  observation :  ≃-sym e    x  f x , x , refl (f x))
  observation = refl _

  q = transport  -  -  Y) p pr₁ =⟨ transport-map-along-≃ ua e pr₁ 
      pr₁   ≃-sym e              =⟨ refl _ 
      f                             

  r : (Σ (fiber f) , pr₁)  (X , f)
  r = to-Σ-= (p , q)

χε : is-univalent 𝓤  dfunext 𝓤 (𝓤 )
    (Y : 𝓤 ̇ ) (A : Y  𝓤 ̇ )  χ Y (𝕋 Y A)  A

χε ua fe Y A = fe γ
 where
  f :  y  fiber pr₁ y  A y
  f y ((y , a) , refl p) = a

  g :  y  A y  fiber pr₁ y
  g y a = (y , a) , refl y

  η :  y σ  g y (f y σ)  σ
  η y ((y , a) , refl p) = refl ((y , a) , refl p)

  ε :  y a  f y (g y a)  a
  ε y a = refl a

  γ :  y  fiber pr₁ y  A y
  γ y = Eq→Id ua _ _ (invertibility-gives-≃ (f y) (g y , η y , ε y))

universes-are-map-classifiers : is-univalent 𝓤  dfunext 𝓤 (𝓤 )
                               is-map-classifier 𝓤

universes-are-map-classifiers ua fe Y = invertibles-are-equivs (χ Y)
                                         (𝕋 Y , χη ua Y , χε ua fe Y)

map-classification : is-univalent 𝓤  dfunext 𝓤 (𝓤 )
                    (Y : 𝓤 ̇ )  𝓤 / Y  (Y  𝓤 ̇ )

map-classification ua fe Y = χ Y , universes-are-map-classifiers ua fe Y

\end{code}