Universe-Lifting

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.Universe-Lifting where

open import MGS.Equivalence-Constructions
open import MGS.Embeddings public

record Lift {𝓤 : Universe} (𝓥 : Universe) (X : 𝓤 ̇ ) : 𝓤  𝓥 ̇ where
 constructor
  lift
 field
  lower : X

open Lift public

type-of-Lift  :             type-of (Lift  {𝓤} 𝓥)        (𝓤 ̇  𝓤  𝓥 ̇ )
type-of-lift  : {X : 𝓤 ̇ }  type-of (lift  {𝓤} {𝓥} {X})  (X  Lift 𝓥 X)
type-of-lower : {X : 𝓤 ̇ }  type-of (lower {𝓤} {𝓥} {X})  (Lift 𝓥 X  X)

type-of-Lift  = refl _
type-of-lift  = refl _
type-of-lower = refl _

Lift-induction :  {𝓤} 𝓥 (X : 𝓤 ̇ ) (A : Lift 𝓥 X  𝓦 ̇ )
                ((x : X)  A (lift x))
                (l : Lift 𝓥 X)  A l

Lift-induction 𝓥 X A φ (lift x) = φ x

Lift-recursion :  {𝓤} 𝓥 {X : 𝓤 ̇ } {B : 𝓦 ̇ }
                (X  B)  Lift 𝓥 X  B

Lift-recursion 𝓥 {X} {B} = Lift-induction 𝓥 X  _  B)

lower-lift : {X : 𝓤 ̇ } (x : X)  lower {𝓤} {𝓥} (lift x)  x
lower-lift = refl

lift-lower : {X : 𝓤 ̇ } (l : Lift 𝓥 X)  lift (lower l)  l
lift-lower = refl

Lift-≃ : (X : 𝓤 ̇ )  Lift 𝓥 X  X
Lift-≃ {𝓤} {𝓥} X = invertibility-gives-≃ lower
                     (lift , lift-lower , lower-lift {𝓤} {𝓥})

≃-Lift : (X : 𝓤 ̇ )  X  Lift 𝓥 X
≃-Lift {𝓤} {𝓥} X = invertibility-gives-≃ lift
                     (lower , lower-lift {𝓤} {𝓥} , lift-lower)

lower-dfunext :  𝓦 𝓣 𝓤 𝓥  dfunext (𝓤  𝓦) (𝓥  𝓣)  dfunext 𝓤 𝓥
lower-dfunext 𝓦 𝓣 𝓤 𝓥 fe {X} {A} {f} {g} h = p
 where
  A' : Lift 𝓦 X  𝓥  𝓣 ̇
  A' y = Lift 𝓣 (A (lower y))

  f' g' : Π A'
  f' y = lift (f (lower y))
  g' y = lift (g (lower y))

  h' : f'  g'
  h' y = ap lift (h (lower y))

  p' : f'  g'
  p' = fe h'

  p : f  g
  p = ap  f' x  lower (f' (lift x))) p'

universe-embedding-criterion : is-univalent 𝓤
                              is-univalent (𝓤  𝓥)
                              (f : 𝓤 ̇  𝓤  𝓥 ̇ )
                              ((X : 𝓤 ̇ )  f X  X)
                              is-embedding f

universe-embedding-criterion {𝓤} {𝓥} ua ua' f e = embedding-criterion f γ
 where
  fe : dfunext (𝓤  𝓥) (𝓤  𝓥)
  fe = univalence-gives-dfunext ua'

  fe₀ : dfunext 𝓤 𝓤
  fe₀ = lower-dfunext 𝓥 𝓥 𝓤 𝓤 fe

  fe₁ : dfunext 𝓤 (𝓤  𝓥)
  fe₁ = lower-dfunext 𝓥 𝓥 𝓤 (𝓤  𝓥) fe

  γ : (X X' : 𝓤 ̇ )  (f X  f X')  (X  X')
  γ X X' =  (f X  f X')  ≃⟨ i 
            (f X  f X')  ≃⟨ ii 
            (X  X')      ≃⟨ iii 
            (X  X')      
   where
    i   = univalence-≃ ua' (f X) (f X')
    ii  = Eq-Eq-cong' fe fe fe fe fe fe₀ fe₁ fe fe₀ fe₀ fe₀ fe₀ (e X) (e X')
    iii = ≃-sym (univalence-≃ ua X X')

Lift-is-embedding : is-univalent 𝓤  is-univalent (𝓤  𝓥)
                   is-embedding (Lift {𝓤} 𝓥)

Lift-is-embedding {𝓤} {𝓥} ua ua' = universe-embedding-criterion {𝓤} {𝓥} ua ua'
                                    (Lift 𝓥) Lift-≃

module _ {𝓤 𝓥 : Universe}
         (ua : is-univalent 𝓥)
         (ua' : is-univalent (𝓤  𝓥))
 where

 private
  fe : dfunext (𝓤  𝓥) (𝓤  𝓥)
  fe = univalence-gives-dfunext ua'

  fe₀ : dfunext 𝓥 (𝓤  𝓥)
  fe₀ = lower-dfunext 𝓤 𝓤 𝓥 (𝓤  𝓥) fe

  fe₁ : dfunext 𝓤 (𝓤  𝓥)
  fe₁ = lower-dfunext (𝓤  𝓥) 𝓤 𝓤 (𝓤  𝓥) fe

  fe₂ : dfunext 𝓥 𝓥
  fe₂ = lower-dfunext 𝓤 𝓤 𝓥 𝓥 fe

  fe₃ : dfunext 𝓤 𝓤
  fe₃ = lower-dfunext 𝓥 𝓥 𝓤 𝓤 fe

 univalence→' : (X : 𝓤 ̇ )  is-subsingleton (Σ Y  𝓥 ̇ , X  Y)
 univalence→' X = s
  where
   e : (Y : 𝓥 ̇ )  (X  Y)  (Lift 𝓤 Y  Lift 𝓥 X)
   e Y = (X  Y)                 ≃⟨ i 
         (Y  X)                 ≃⟨ ii 
         (Lift 𝓤 Y  Lift 𝓥 X)   ≃⟨ iii 
         (Lift 𝓤 Y  Lift 𝓥 X)   
    where
     i   = ≃-Sym fe₀ fe₁ fe
     ii  = Eq-Eq-cong' fe₁ fe fe₂ fe₁ fe fe fe fe₃
             fe fe fe fe (≃-Lift Y) (≃-Lift X)
     iii = ≃-sym (univalence-≃ ua' (Lift 𝓤 Y) (Lift 𝓥 X))

   d : (Σ Y  𝓥 ̇ , X  Y)  (Σ Y  𝓥 ̇ , Lift 𝓤 Y  Lift 𝓥 X)
   d = Σ-cong e

   j : is-subsingleton (Σ Y  𝓥 ̇ , Lift 𝓤 Y  Lift 𝓥 X)
   j = Lift-is-embedding ua ua' (Lift 𝓥 X)

   abstract
    s : is-subsingleton (Σ Y  𝓥 ̇ , X  Y)
    s = equiv-to-subsingleton d j

 univalence→'-dual : (Y : 𝓤 ̇ )  is-subsingleton (Σ X  𝓥 ̇ , X  Y)
 univalence→'-dual Y = equiv-to-subsingleton e i
  where
   e : (Σ X  𝓥 ̇ , X  Y)  (Σ X  𝓥 ̇ , Y  X)
   e = Σ-cong  X  ≃-Sym fe₁ fe₀ fe)

   i : is-subsingleton (Σ X  𝓥 ̇ , Y  X)
   i = univalence→' Y

univalence→'' : is-univalent (𝓤  𝓥)
               (X : 𝓤 ̇ )  is-subsingleton (Σ Y  𝓤  𝓥 ̇ , X  Y)

univalence→'' ua = univalence→' ua ua

univalence→''-dual : is-univalent (𝓤  𝓥)
                    (Y : 𝓤 ̇ )  is-subsingleton (Σ X  𝓤  𝓥 ̇ , X  Y)

univalence→''-dual ua = univalence→'-dual ua ua

G↑-≃ : is-univalent (𝓤  𝓥)
      (X : 𝓤 ̇ ) (A : (Σ Y  𝓤  𝓥 ̇ , X  Y)  𝓦 ̇ )
      A (Lift 𝓥 X , ≃-Lift X)  (Y : 𝓤  𝓥 ̇ ) (e : X  Y)  A (Y , e)

G↑-≃ {𝓤} {𝓥} ua X A a Y e = transport A p a
 where
  t : Σ Y  𝓤  𝓥 ̇ , X  Y
  t = (Lift 𝓥 X , ≃-Lift X)

  p : t  (Y , e)
  p = univalence→'' {𝓤} {𝓥} ua X t (Y , e)

H↑-≃ : is-univalent (𝓤  𝓥)
      (X : 𝓤 ̇ ) (A : (Y : 𝓤  𝓥 ̇ )  X  Y  𝓦 ̇ )
      A (Lift 𝓥 X) (≃-Lift X)  (Y : 𝓤  𝓥 ̇ ) (e : X  Y)  A Y e

H↑-≃ ua X A = G↑-≃ ua X (Σ-induction A)

J↑-≃ : is-univalent (𝓤  𝓥)
      (A : (X : 𝓤 ̇ ) (Y : 𝓤  𝓥 ̇ )  X  Y  𝓦 ̇ )
      ((X : 𝓤 ̇ )  A X (Lift 𝓥 X) (≃-Lift X))
      (X : 𝓤 ̇ ) (Y : 𝓤  𝓥 ̇ ) (e : X  Y)  A X Y e

J↑-≃ ua A φ X = H↑-≃ ua X (A X) (φ X)

H↑-equiv : is-univalent (𝓤  𝓥)
          (X : 𝓤 ̇ ) (A : (Y : 𝓤  𝓥 ̇ )  (X  Y)  𝓦 ̇ )
          A (Lift 𝓥 X) lift  (Y : 𝓤  𝓥 ̇ ) (f : X  Y)  is-equiv f  A Y f

H↑-equiv {𝓤} {𝓥} {𝓦} ua X A a Y f i = γ (f , i)
 where
  B : (Y : 𝓤  𝓥 ̇ )  X  Y  𝓦 ̇
  B Y (f , i) = A Y f

  b : B (Lift 𝓥 X) (≃-Lift X)
  b = a

  γ : (e : X  Y)  B Y e
  γ = H↑-≃ ua X B b Y

J↑-equiv : is-univalent (𝓤  𝓥)
          (A : (X : 𝓤 ̇ ) (Y : 𝓤  𝓥 ̇ )  (X  Y)  𝓦 ̇ )
          ((X : 𝓤 ̇ )  A X (Lift 𝓥 X) lift)
          (X : 𝓤 ̇ ) (Y : 𝓤  𝓥 ̇ ) (f : X  Y)  is-equiv f  A X Y f

J↑-equiv ua A φ X = H↑-equiv ua X (A X) (φ X)

J↑-invertible : is-univalent (𝓤  𝓥)
               (A : (X : 𝓤 ̇ ) (Y : 𝓤  𝓥 ̇ )  (X  Y)  𝓦 ̇ )
               ((X : 𝓤 ̇ )  A X (Lift 𝓥 X) lift)
               (X : 𝓤 ̇ ) (Y : 𝓤  𝓥 ̇ ) (f : X  Y)  invertible f  A X Y f

J↑-invertible ua A φ X Y f i = J↑-equiv ua A φ X Y f (invertibles-are-equivs f i)

lift-is-hae : (X : 𝓤 ̇ )  is-hae {𝓤} {𝓤  𝓥} {X} {Lift 𝓥 X} (lift {𝓤} {𝓥})
lift-is-hae {𝓤} {𝓥} X = lower ,
                        lower-lift {𝓤} {𝓥} ,
                        lift-lower ,
                        λ x  refl (refl (lift x))

equivs-are-haes↑ : is-univalent (𝓤  𝓥)
                  {X : 𝓤 ̇ } {Y : 𝓤  𝓥 ̇ } (f : X  Y)
                  is-equiv f  is-hae f

equivs-are-haes↑ {𝓤} {𝓥} ua {X} {Y} = J↑-equiv {𝓤} {𝓥} ua  X Y f  is-hae f)
                                       lift-is-hae X Y

G↓-≃ : is-univalent (𝓤  𝓥)
      (Y : 𝓤 ̇ ) (A : (Σ X  𝓤  𝓥 ̇ , X  Y)  𝓦 ̇ )
      A (Lift 𝓥 Y , Lift-≃ Y)  (X : 𝓤  𝓥 ̇ ) (e : X  Y)  A (X , e)

G↓-≃ {𝓤} {𝓥} ua Y A a X e = transport A p a
 where
  t : Σ X  𝓤  𝓥 ̇ , X  Y
  t = (Lift 𝓥 Y , Lift-≃ Y)

  p : t  (X , e)
  p = univalence→'-dual {𝓤} {𝓤  𝓥} ua ua Y t (X , e)

H↓-≃ : is-univalent (𝓤  𝓥)
      (Y : 𝓤 ̇ ) (A : (X : 𝓤  𝓥 ̇ )  X  Y  𝓦 ̇ )
      A (Lift 𝓥 Y) (Lift-≃ Y)  (X : 𝓤  𝓥 ̇ ) (e : X  Y)  A X e

H↓-≃ ua Y A = G↓-≃ ua Y (Σ-induction A)

J↓-≃ : is-univalent (𝓤  𝓥)
      (A : (X : 𝓤  𝓥 ̇ ) (Y : 𝓤 ̇ )  X  Y  𝓦 ̇ )
      ((Y : 𝓤 ̇ )  A (Lift 𝓥 Y) Y (Lift-≃ Y))
      (X : 𝓤  𝓥 ̇ ) (Y : 𝓤 ̇ ) (e : X  Y)  A X Y e

J↓-≃ ua A φ X Y = H↓-≃ ua Y  X  A X Y) (φ Y) X

H↓-equiv : is-univalent (𝓤  𝓥)
          (Y : 𝓤 ̇ ) (A : (X : 𝓤  𝓥 ̇ )  (X  Y)  𝓦 ̇ )
          A (Lift 𝓥 Y) lower  (X : 𝓤  𝓥 ̇ ) (f : X  Y)  is-equiv f  A X f

H↓-equiv {𝓤} {𝓥} {𝓦} ua Y A a X f i = γ (f , i)
 where
  B : (X : 𝓤  𝓥 ̇ )  X  Y  𝓦 ̇
  B X (f , i) = A X f

  b : B (Lift 𝓥 Y) (Lift-≃ Y)
  b = a

  γ : (e : X  Y)  B X e
  γ = H↓-≃ ua Y B b X

J↓-equiv : is-univalent (𝓤  𝓥)
          (A : (X : 𝓤  𝓥 ̇ ) (Y : 𝓤 ̇ )  (X  Y)  𝓦 ̇ )
          ((Y : 𝓤 ̇ )  A (Lift 𝓥 Y) Y lower)
          (X : 𝓤  𝓥 ̇ ) (Y : 𝓤 ̇ ) (f : X  Y)  is-equiv f  A X Y f

J↓-equiv ua A φ X Y = H↓-equiv ua Y  X  A X Y) (φ Y) X

J↓-invertible : is-univalent (𝓤  𝓥)
               (A : (X : 𝓤  𝓥 ̇ ) (Y : 𝓤 ̇ )  (X  Y)  𝓦 ̇ )
               ((Y : 𝓤 ̇ )  A (Lift 𝓥 Y) Y lower)
               (X : 𝓤  𝓥 ̇ ) (Y : 𝓤 ̇ ) (f : X  Y)  invertible f  A X Y f

J↓-invertible ua A φ X Y f i = J↓-equiv ua A φ X Y f (invertibles-are-equivs f i)

lower-is-hae : (X : 𝓤 ̇ )  is-hae (lower {𝓤} {𝓥} {X})
lower-is-hae {𝓤} {𝓥} X = lift ,
                         lift-lower ,
                         lower-lift {𝓤} {𝓥} ,
                          x  refl (refl (lower x)))

equivs-are-haes↓ : is-univalent (𝓤  𝓥)
                  {X : 𝓤  𝓥 ̇ } {Y : 𝓤 ̇ } (f : X  Y)
                  is-equiv f  is-hae f

equivs-are-haes↓ {𝓤} {𝓥} ua {X} {Y} = J↓-equiv {𝓤} {𝓥} ua  X Y f  is-hae f)
                                       lower-is-hae X Y

Id→Eq-is-hae' : is-univalent 𝓤  is-univalent (𝓤 )
               {X Y : 𝓤 ̇ }  is-hae (Id→Eq X Y)

Id→Eq-is-hae' ua ua⁺ {X} {Y} = equivs-are-haes↓ ua⁺ (Id→Eq X Y) (ua X Y)

Id→Eq-is-hae : is-univalent 𝓤
              {X Y : 𝓤 ̇ }  is-hae (Id→Eq X Y)

Id→Eq-is-hae ua {X} {Y} = invertibles-are-haes (Id→Eq X Y)
                           (equivs-are-invertible (Id→Eq X Y) (ua X Y))

global-property-of-types : 𝓤ω
global-property-of-types = {𝓤 : Universe}  𝓤 ̇  𝓤 ̇

cumulative : global-property-of-types  𝓤ω
cumulative A = {𝓤 𝓥 : Universe} (X : 𝓤 ̇ )  A X  A (Lift 𝓥 X)

global-≃-ap : Univalence
             (A : global-property-of-types)
             cumulative A
             (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )  X  Y  A X  A Y

global-≃-ap' : Univalence
              (F : Universe  Universe)
              (A : {𝓤 : Universe}  𝓤 ̇  (F 𝓤) ̇ )
              ({𝓤 𝓥 : Universe} (X : 𝓤 ̇ )  A X  A (Lift 𝓥 X))
              (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )  X  Y  A X  A Y

global-≃-ap' {𝓤} {𝓥} ua F A φ X Y e =

  A X          ≃⟨ φ X 
  A (Lift 𝓥 X) ≃⟨ Id→Eq (A (Lift 𝓥 X)) (A (Lift 𝓤 Y)) q 
  A (Lift 𝓤 Y) ≃⟨ ≃-sym (φ Y) 
  A Y          
 where
  d : Lift 𝓥 X  Lift 𝓤 Y
  d = Lift 𝓥 X ≃⟨ Lift-≃ X 
      X        ≃⟨ e 
      Y        ≃⟨ ≃-sym (Lift-≃ Y) 
      Lift 𝓤 Y 

  p : Lift 𝓥 X  Lift 𝓤 Y
  p = Eq→Id (ua (𝓤  𝓥)) (Lift 𝓥 X) (Lift 𝓤 Y) d

  q : A (Lift 𝓥 X)  A (Lift 𝓤 Y)
  q = ap A p

global-≃-ap ua = global-≃-ap' ua  𝓤  𝓤)