Skip to content

MGS.FunExt-from-Univalence

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


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

module MGS.FunExt-from-Univalence where

open import MGS.Equivalence-Induction public

funext :  𝓤 𝓥  (𝓤  𝓥) ̇
funext 𝓤 𝓥 = {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {f g : X  Y}  f  g  f  g

precomp-is-equiv : is-univalent 𝓤
                  (X Y : 𝓤 ̇ ) (f : X  Y)
                  is-equiv f
                  (Z : 𝓤 ̇ )  is-equiv  (g : Y  Z)  g  f)

precomp-is-equiv {𝓤} ua =
   𝕁-equiv ua
      X Y (f : X  Y)  (Z : 𝓤 ̇ )  is-equiv  g  g  f))
      X Z  id-is-equiv (X  Z))

univalence-gives-funext : is-univalent 𝓤  funext 𝓥 𝓤
univalence-gives-funext {𝓤} {𝓥} ua {X} {Y} {f₀} {f₁} = γ
 where
  Δ : 𝓤 ̇
  Δ = Σ y₀  Y , Σ y₁  Y , y₀  y₁

  δ : Y  Δ
  δ y = (y , y , refl y)

  π₀ π₁ : Δ  Y
  π₀ (y₀ , y₁ , p) = y₀
  π₁ (y₀ , y₁ , p) = y₁

  δ-is-equiv : is-equiv δ
  δ-is-equiv = invertibles-are-equivs δ (π₀ , η , ε)
   where
    η : (y : Y)  π₀ (δ y)  y
    η y = refl y

    ε : (d : Δ)  δ (π₀ d)  d
    ε (y , y , refl y) = refl (y , y , refl y)

  φ : (Δ  Y)  (Y  Y)
  φ π = π  δ

  φ-is-equiv : is-equiv φ
  φ-is-equiv = precomp-is-equiv ua Y Δ δ δ-is-equiv Y

  p : φ π₀  φ π₁
  p = refl (𝑖𝑑 Y)

  q : π₀  π₁
  q = equivs-are-lc φ φ-is-equiv p

  γ : f₀  f₁  f₀  f₁
  γ h = ap  π x  π (f₀ x , f₁ x , h x)) q

  γ' : f₀  f₁  f₀  f₁
  γ' h = f₀                             =⟨ refl _ 
          x  f₀ x)                   =⟨ refl _ 
          x  π₀ (f₀ x , f₁ x , h x)) =⟨ ap  - x  - (f₀ x , f₁ x , h x)) q 
          x  π₁ (f₀ x , f₁ x , h x)) =⟨ refl _ 
          x  f₁ x)                   =⟨ refl _ 
         f₁                             

dfunext :  𝓤 𝓥  (𝓤  𝓥) ̇
dfunext 𝓤 𝓥 = {X : 𝓤 ̇ } {A : X  𝓥 ̇ } {f g : Π A}  f  g  f  g

happly : {X : 𝓤 ̇ } {A : X  𝓥 ̇ } (f g : Π A)  f  g  f  g
happly f g p x = ap  -  - x) p

hfunext :  𝓤 𝓥  (𝓤  𝓥) ̇
hfunext 𝓤 𝓥 = {X : 𝓤 ̇ } {A : X  𝓥 ̇ } (f g : Π A)  is-equiv (happly f g)

hfunext-gives-dfunext : hfunext 𝓤 𝓥  dfunext 𝓤 𝓥
hfunext-gives-dfunext hfe {X} {A} {f} {g} = inverse (happly f g) (hfe f g)

vvfunext :  𝓤 𝓥  (𝓤  𝓥) ̇
vvfunext 𝓤 𝓥 = {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
              ((x : X)  is-singleton (A x))
              is-singleton (Π A)

dfunext-gives-vvfunext : dfunext 𝓤 𝓥  vvfunext 𝓤 𝓥
dfunext-gives-vvfunext fe {X} {A} i = γ
 where
  f : Π A
  f x = center (A x) (i x)

  c : (g : Π A)  f  g
  c g = fe  (x : X)  centrality (A x) (i x) (g x))

  γ : is-singleton (Π A)
  γ = f , c

postcomp-invertible : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ }
                     funext 𝓦 𝓤
                     funext 𝓦 𝓥
                     (f : X  Y)
                     invertible f
                     invertible  (h : A  X)  f  h)

postcomp-invertible {𝓤} {𝓥} {𝓦} {X} {Y} {A} nfe nfe' f (g , η , ε) = γ
 where
  f' : (A  X)  (A  Y)
  f' h = f  h

  g' : (A  Y)  (A  X)
  g' k = g  k

  η' : (h : A  X)  g' (f' h)  h
  η' h = nfe (η  h)

  ε' : (k : A  Y)  f' (g' k)  k
  ε' k = nfe' (ε  k)

  γ : invertible f'
  γ = (g' , η' , ε')

postcomp-is-equiv : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ }
                   funext 𝓦 𝓤
                   funext 𝓦 𝓥
                   (f : X  Y)
                   is-equiv f
                   is-equiv  (h : A  X)  f  h)

postcomp-is-equiv fe fe' f e =
 invertibles-are-equivs
   h  f  h)
  (postcomp-invertible fe fe' f (equivs-are-invertible f e))

vvfunext-gives-hfunext : vvfunext 𝓤 𝓥  hfunext 𝓤 𝓥
vvfunext-gives-hfunext vfe {X} {Y} f = γ
 where
  a : (x : X)  is-singleton (Σ y  Y x , f x  y)
  a x = singleton-types'-are-singletons (Y x) (f x)

  c : is-singleton (Π x  X , Σ y  Y x , f x  y)
  c = vfe a

  ρ : (Σ g  Π Y , f  g)  (Π x  X , Σ y  Y x , f x  y)
  ρ = ≃-gives-▷ ΠΣ-distr-≃

  d : is-singleton (Σ g  Π Y , f  g)
  d = retract-of-singleton ρ c

  e : (Σ g  Π Y , f  g)  (Σ g  Π Y , f  g)
  e = NatΣ (happly f)

  i : is-equiv e
  i = maps-of-singletons-are-equivs e (singleton-types'-are-singletons (Π Y) f) d

  γ : (g : Π Y)  is-equiv (happly f g)
  γ = NatΣ-equiv-gives-fiberwise-equiv (happly f) i

funext-gives-vvfunext : funext 𝓤 (𝓤  𝓥)  funext 𝓤 𝓤  vvfunext 𝓤 𝓥
funext-gives-vvfunext {𝓤} {𝓥} fe fe' {X} {A} φ = γ
 where
  f : Σ A  X
  f = pr₁

  f-is-equiv : is-equiv f
  f-is-equiv = pr₁-equiv φ

  g : (X  Σ A)  (X  X)
  g h = f  h

  e : is-equiv g
  e = postcomp-is-equiv fe fe' f f-is-equiv

  i : is-singleton (Σ h  (X  Σ A), f  h  𝑖𝑑 X)
  i = e (𝑖𝑑 X)

  r : (Σ h  (X  Σ A), f  h  𝑖𝑑 X)  Π A
  r (h , p) x = transport A (happly (f  h) (𝑖𝑑 X) p x) (pr₂ (h x))

  s : Π A  (Σ h  (X  Σ A), f  h  𝑖𝑑 X)
  s φ =  x  x , φ x) , refl (𝑖𝑑 X)

  η :  φ  r (s φ)  φ
  η φ = refl (r (s φ))

  γ : is-singleton (Π A)
  γ = retract-of-singleton (r , s , η) i

abstract
 funext-gives-hfunext       : funext 𝓤 (𝓤  𝓥)  funext 𝓤 𝓤  hfunext 𝓤 𝓥
 dfunext-gives-hfunext      : dfunext 𝓤 𝓥  hfunext 𝓤 𝓥
 funext-gives-dfunext       : funext 𝓤 (𝓤  𝓥)  funext 𝓤 𝓤  dfunext 𝓤 𝓥
 univalence-gives-dfunext'  : is-univalent 𝓤  is-univalent (𝓤  𝓥)  dfunext 𝓤 𝓥
 univalence-gives-hfunext'  : is-univalent 𝓤  is-univalent (𝓤  𝓥)  hfunext 𝓤 𝓥
 univalence-gives-vvfunext' : is-univalent 𝓤  is-univalent (𝓤  𝓥)  vvfunext 𝓤 𝓥
 univalence-gives-hfunext   : is-univalent 𝓤  hfunext 𝓤 𝓤
 univalence-gives-dfunext   : is-univalent 𝓤  dfunext 𝓤 𝓤
 univalence-gives-vvfunext  : is-univalent 𝓤  vvfunext 𝓤 𝓤

 funext-gives-hfunext fe fe' = vvfunext-gives-hfunext (funext-gives-vvfunext fe fe')

 funext-gives-dfunext fe fe' = hfunext-gives-dfunext (funext-gives-hfunext fe fe')

 dfunext-gives-hfunext fe = vvfunext-gives-hfunext (dfunext-gives-vvfunext fe)

 univalence-gives-dfunext' ua ua' = funext-gives-dfunext
                                     (univalence-gives-funext ua')
                                     (univalence-gives-funext ua)

 univalence-gives-hfunext' ua ua' = funext-gives-hfunext
                                      (univalence-gives-funext ua')
                                      (univalence-gives-funext ua)

 univalence-gives-vvfunext' ua ua' = funext-gives-vvfunext
                                      (univalence-gives-funext ua')
                                      (univalence-gives-funext ua)

 univalence-gives-hfunext ua = univalence-gives-hfunext' ua ua

 univalence-gives-dfunext ua = univalence-gives-dfunext' ua ua

 univalence-gives-vvfunext ua = univalence-gives-vvfunext' ua ua