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.Function-Graphs where

open import MGS.Yoneda public

module function-graphs
        (ua : Univalence)
        {𝓤 𝓥 : Universe}
        (X : 𝓤 ̇ )
        (A : X  𝓥 ̇ )
       where

 hfe : global-hfunext
 hfe = univalence-gives-global-hfunext ua

 fe : global-dfunext
 fe = univalence-gives-global-dfunext ua

 Function : 𝓤  𝓥 ̇
 Function = (x : X)  A x

 Relation : 𝓤  (𝓥 ) ̇
 Relation = (x : X)  A x  𝓥 ̇

 is-functional : Relation  𝓤  𝓥 ̇
 is-functional R = (x : X)  ∃! a  A x , R x a

 being-functional-is-subsingleton : (R : Relation)
                                   is-subsingleton (is-functional R)

 being-functional-is-subsingleton R = Π-is-subsingleton fe
                                        x  ∃!-is-subsingleton (R x) fe)

 Functional-Relation : 𝓤  (𝓥 ) ̇
 Functional-Relation = Σ R  Relation , is-functional R

 ρ : Function  Relation
 ρ f = λ x a  f x  a

 ρ-is-embedding : is-embedding ρ
 ρ-is-embedding = NatΠ-is-embedding hfe hfe
                    x  𝑌 (A x))
                    x  𝓨-is-embedding ua (A x))
  where

   τ : (x : X)  A x  (A x  𝓥 ̇ )
   τ x a b = a  b

   remark₀ : τ  λ x  𝑌 (A x)
   remark₀ = refl _

   remark₁ : ρ  NatΠ τ
   remark₁ = refl _

 ρ-is-functional : (f : Function)  is-functional (ρ f)
 ρ-is-functional f = σ
  where
   σ : (x : X)  ∃! a  A x , f x  a
   σ x = singleton-types'-are-singletons (A x) (f x)

 Γ : Function  Functional-Relation
 Γ f = ρ f , ρ-is-functional f

 Φ : Functional-Relation  Function
 Φ (R , σ) = λ x  pr₁ (center (Σ a  A x , R x a) (σ x))

 Γ-is-equiv : is-equiv Γ
 Γ-is-equiv = invertibles-are-equivs Γ (Φ , η , ε)
  where
   η : Φ  Γ  id
   η = refl

   ε : Γ  Φ  id
   ε (R , σ) = a
    where
     f : Function
     f = Φ (R , σ)

     e : (x : X)  R x (f x)
     e x = pr₂ (center (Σ a  A x , R x a) (σ x))

     τ : (x : X)  Nat (𝓨 (f x)) (R x)
     τ x = 𝓝 (R x) (f x) (e x)

     τ-is-fiberwise-equiv : (x : X)  is-fiberwise-equiv (τ x)
     τ-is-fiberwise-equiv x = universal-fiberwise-equiv (R x) (σ x) (f x) (τ x)

     d : (x : X) (a : A x)  (f x  a)  R x a
     d x a = τ x a , τ-is-fiberwise-equiv x a

     c : (x : X) (a : A x)  (f x  a)  R x a
     c x a = Eq→Id (ua 𝓥) _ _ (d x a)

     b : ρ f  R
     b = fe  x  fe (c x))

     a : (ρ f , ρ-is-functional f)  (R , σ)
     a = to-subtype-= being-functional-is-subsingleton b

 functions-amount-to-functional-relations : Function  Functional-Relation
 functions-amount-to-functional-relations = Γ , Γ-is-equiv

\end{code}