Skip to content

MGS.Solved-Exercises

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.Solved-Exercises where

open import MGS.Equivalences public

subsingleton-criterion : {X : 𝓤 ̇ }
                        (X  is-singleton X)
                        is-subsingleton X

subsingleton-criterion' : {X : 𝓤 ̇ }
                         (X  is-subsingleton X)
                         is-subsingleton X

retract-of-subsingleton : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                         Y  X  is-subsingleton X  is-subsingleton Y

left-cancellable : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }  (X  Y)  𝓤  𝓥 ̇
left-cancellable f = {x x' : domain f}  f x  f x'  x  x'

lc-maps-reflect-subsingletons : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                               left-cancellable f
                               is-subsingleton Y
                               is-subsingleton X

has-retraction : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }  (X  Y)  𝓤  𝓥 ̇
has-retraction s = Σ r  (codomain s  domain s), r  s  id

sections-are-lc : {X : 𝓤 ̇ } {A : 𝓥 ̇ } (s : X  A)
                 has-retraction s  left-cancellable s

equivs-have-retractions : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                         is-equiv f  has-retraction f

equivs-have-sections : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                      is-equiv f  has-section f

equivs-are-lc : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
               is-equiv f  left-cancellable f

equiv-to-subsingleton : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                       X  Y
                       is-subsingleton Y
                       is-subsingleton X

comp-inverses : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
                (f : X  Y) (g : Y  Z)
                (i : is-equiv f) (j : is-equiv g)
                (f' : Y  X) (g' : Z  Y)
               f'  inverse f i
               g'  inverse g j
               f'  g'  inverse (g  f) (∘-is-equiv j i)

equiv-to-set : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
              X  Y
              is-set Y
              is-set X

sections-closed-under-∼ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f g : X  Y)
                         has-retraction f
                         g  f
                         has-retraction g

retractions-closed-under-∼ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f g : X  Y)
                            has-section f
                            g  f
                            has-section g

is-joyal-equiv : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }  (X  Y)  𝓤  𝓥 ̇
is-joyal-equiv f = has-section f × has-retraction f

one-inverse : (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )
              (f : X  Y) (r s : Y  X)
             (r  f  id)
             (f  s  id)
             r  s

joyal-equivs-are-invertible : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                             is-joyal-equiv f  invertible f

joyal-equivs-are-equivs : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                         is-joyal-equiv f  is-equiv f

invertibles-are-joyal-equivs : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                              invertible f  is-joyal-equiv f

equivs-are-joyal-equivs : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                         is-equiv f  is-joyal-equiv f

equivs-closed-under-∼ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {f g : X  Y}
                       is-equiv f
                       g  f
                       is-equiv g

equiv-to-singleton' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                     X  Y  is-singleton X  is-singleton Y

subtypes-of-sets-are-sets' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (m : X  Y)
                           left-cancellable m  is-set Y  is-set X

pr₁-lc : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
        ((x : X)  is-subsingleton (A x))
        left-cancellable  (t : Σ A)  pr₁ t)

subsets-of-sets-are-sets : (X : 𝓤 ̇ ) (A : X  𝓥 ̇ )
                          is-set X
                          ((x : X)  is-subsingleton (A x))
                          is-set (Σ x  X , A x)

to-subtype-= : {X : 𝓦 ̇ } {A : X  𝓥 ̇ }
               {x y : X} {a : A x} {b : A y}
              ((x : X)  is-subsingleton (A x))
              x  y
              (x , a)  (y , b)

pr₁-equiv : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
           ((x : X)  is-singleton (A x))
           is-equiv  (t : Σ A)  pr₁ t)

pr₁-≃ : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
       ((x : X)  is-singleton (A x))
       Σ A  X

pr₁-≃ i = pr₁ , pr₁-equiv i

ΠΣ-distr-≃ : {X : 𝓤 ̇ } {A : X  𝓥 ̇ } {P : (x : X)  A x  𝓦 ̇ }
            (Π x  X , Σ a  A x , P x a)
            (Σ f  Π A , Π x  X , P x (f x))

Σ-assoc : {X : 𝓤 ̇ } {Y : X  𝓥 ̇ } {Z : Σ Y  𝓦 ̇ }
         Σ Z  (Σ x  X , Σ y  Y x , Z (x , y))

⁻¹-≃ : {X : 𝓤 ̇ } (x y : X)  (x  y)  (y  x)

singleton-types-≃ : {X : 𝓤 ̇ } (x : X)  singleton-type' x  singleton-type x

singletons-≃ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
              is-singleton X  is-singleton Y  X  Y

maps-of-singletons-are-equivs : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                               is-singleton X  is-singleton Y  is-equiv f

logically-equivalent-subsingletons-are-equivalent : (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )
                                                   is-subsingleton X
                                                   is-subsingleton Y
                                                   X  Y
                                                   X  Y

singletons-are-equivalent : (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )
                           is-singleton X
                           is-singleton Y
                           X  Y

NatΣ-fiber-equiv : {X : 𝓤 ̇ } (A : X  𝓥 ̇ ) (B : X  𝓦 ̇ ) (φ : Nat A B)
                   (x : X) (b : B x)
                  fiber (φ x) b  fiber (NatΣ φ) (x , b)

NatΣ-equiv-gives-fiberwise-equiv : {X : 𝓤 ̇ } {A : X  𝓥 ̇ } {B : X  𝓦 ̇ }
                                   (φ : Nat A B)
                                  is-equiv (NatΣ φ)
                                  ((x : X)  is-equiv (φ x))

Σ-is-subsingleton : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
                   is-subsingleton X
                   ((x : X)  is-subsingleton (A x))
                   is-subsingleton (Σ A)

×-is-singleton : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                   is-singleton X
                   is-singleton Y
                   is-singleton (X × Y)

×-is-subsingleton : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                   is-subsingleton X
                   is-subsingleton Y
                   is-subsingleton (X × Y)

×-is-subsingleton' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                    ((Y  is-subsingleton X) × (X  is-subsingleton Y))
                    is-subsingleton (X × Y)

×-is-subsingleton'-back : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                         is-subsingleton (X × Y)
                         (Y  is-subsingleton X) × (X  is-subsingleton Y)

ap₂ : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } (f : X  Y  Z) {x x' : X} {y y' : Y}
     x  x'  y  y'  f x y  f x' y'

subsingleton-criterion = sol
 where
  sol : {X : 𝓤 ̇ }  (X  is-singleton X)  is-subsingleton X
  sol f x = singletons-are-subsingletons (domain f) (f x) x

subsingleton-criterion' = sol
 where
  sol : {X : 𝓤 ̇ }  (X  is-subsingleton X)  is-subsingleton X
  sol f x y = f x x y

retract-of-subsingleton = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
       Y  X  is-subsingleton X  is-subsingleton Y
  sol (r , s , η) i =  subsingleton-criterion
                         x  retract-of-singleton (r , s , η)
                                (pointed-subsingletons-are-singletons
                                  (codomain s) (s x) i))

lc-maps-reflect-subsingletons = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
       left-cancellable f  is-subsingleton Y  is-subsingleton X
  sol f l s x x' = l (s (f x) (f x'))

sections-are-lc = sol
 where
  sol : {X : 𝓤 ̇ } {A : 𝓥 ̇ } (s : X  A)
       has-retraction s  left-cancellable s
  sol s (r , ε) {x} {y} p = x       =⟨ (ε x)⁻¹ 
                            r (s x) =⟨ ap r p 
                            r (s y) =⟨ ε y 
                            y       

equivs-have-retractions = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)  is-equiv f  has-retraction f
  sol f e = (inverse f e , inverses-are-retractions f e)

equivs-have-sections = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)  is-equiv f  has-section f
  sol f e = (inverse f e , inverses-are-sections f e)

equivs-are-lc = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)  is-equiv f  left-cancellable f
  sol f e = sections-are-lc f (equivs-have-retractions f e)

equiv-to-subsingleton = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }  X  Y  is-subsingleton Y  is-subsingleton X
  sol (f , i) = lc-maps-reflect-subsingletons f (equivs-are-lc f i)

comp-inverses = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ }
        (f : X  Y) (g : Y  Z)
        (i : is-equiv f) (j : is-equiv g)
        (f' : Y  X) (g' : Z  Y)
       f'  inverse f i
       g'  inverse g j
       f'  g'  inverse (g  f) (∘-is-equiv j i)
  sol f g i j f' g' h k z =
   f' (g' z)                          =⟨ h (g' z) 
   inverse f i (g' z)                 =⟨ ap (inverse f i) (k z) 
   inverse f i (inverse g j z)        =⟨ inverse-of-∘ f g i j z 
   inverse (g  f) (∘-is-equiv j i) z 

equiv-to-set = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }  X  Y  is-set Y  is-set X
  sol e = subtypes-of-sets-are-sets'  e  (equivs-are-lc  e  (⌜⌝-is-equiv e))

sections-closed-under-∼ = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f g : X  Y)
       has-retraction f  g  f  has-retraction g
  sol f g (r , rf) h = (r ,
                        λ x  r (g x) =⟨ ap r (h x) 
                              r (f x) =⟨ rf x 
                              x       )

retractions-closed-under-∼ = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f g : X  Y)
       has-section f  g  f  has-section g
  sol f g (s , fs) h = (s ,
                        λ y  g (s y) =⟨ h (s y) 
                              f (s y) =⟨ fs y 
                              y )

one-inverse = sol
 where
  sol : (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )
        (f : X  Y) (r s : Y  X)
       (r  f  id)
       (f  s  id)
       r  s
  sol X Y f r s h k y = r y         =⟨ ap r ((k y)⁻¹) 
                        r (f (s y)) =⟨ h (s y) 
                        s y         

joyal-equivs-are-invertible = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
       is-joyal-equiv f  invertible f
  sol f ((s , ε) , (r , η)) = (s , sf , ε)
   where
    sf = λ (x : domain f)  s (f x)       =⟨ (η (s (f x)))⁻¹ 
                            r (f (s (f x))) =⟨ ap r (ε (f x)) 
                            r (f x)       =⟨ η x 
                            x            

joyal-equivs-are-equivs = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
       is-joyal-equiv f  is-equiv f
  sol f j = invertibles-are-equivs f (joyal-equivs-are-invertible f j)

invertibles-are-joyal-equivs = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
       invertible f  is-joyal-equiv f
  sol f (g , η , ε) = ((g , ε) , (g , η))

equivs-are-joyal-equivs = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
       is-equiv f  is-joyal-equiv f
  sol f e = invertibles-are-joyal-equivs f (equivs-are-invertible f e)

equivs-closed-under-∼ = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {f g : X  Y}
       is-equiv f  g  f  is-equiv g
  sol {𝓤} {𝓥} {X} {Y} {f} {g} e h = joyal-equivs-are-equivs g
                                      (retractions-closed-under-∼ f g
                                       (equivs-have-sections f e) h ,
                                      sections-closed-under-∼ f g
                                       (equivs-have-retractions f e) h)

equiv-to-singleton' = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
       X  Y  is-singleton X  is-singleton Y
  sol e = retract-of-singleton (≃-gives-▷ e)

subtypes-of-sets-are-sets' = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (m : X  Y)
       left-cancellable m  is-set Y  is-set X
  sol {𝓤} {𝓥} {X} m i h = types-with-wconstant-=-endomaps-are-sets X c
   where
    f : (x x' : X)  x  x'  x  x'
    f x x' r = i (ap m r)

    κ : (x x' : X) (r s : x  x')  f x x' r  f x x' s
    κ x x' r s = ap i (h (m x) (m x') (ap m r) (ap m s))

    c : wconstant-=-endomaps X
    c x x' = f x x' , κ x x'

pr₁-lc = sol
 where
  sol : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
       ((x : X)  is-subsingleton (A x))
       left-cancellable   (t : Σ A)  pr₁ t)
  sol i p = to-Σ-= (p , i _ _ _)

subsets-of-sets-are-sets = sol
 where
  sol : (X : 𝓤 ̇ ) (A : X  𝓥 ̇ )
      is-set X
      ((x : X)  is-subsingleton (A x))
      is-set (Σ x  X , A x)
  sol X A h p = subtypes-of-sets-are-sets' pr₁ (pr₁-lc p) h

to-subtype-= = sol
 where
  sol : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
        {x y : X} {a : A x} {b : A y}
       ((x : X)  is-subsingleton (A x))
       x  y
       (x , a)  (y , b)
  sol {𝓤} {𝓥} {X} {A} {x} {y} {a} {b} s p = to-Σ-= (p , s y (transport A p a) b)

pr₁-equiv = sol
 where
  sol : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
       ((x : X)  is-singleton (A x))
       is-equiv  (t : Σ A)  pr₁ t)
  sol {𝓤} {𝓥} {X} {A} s = invertibles-are-equivs pr₁ (g , η , ε)
   where
    g : X  Σ A
    g x = x , pr₁ (s x)

    ε : (x : X)  pr₁ (g x)  x
    ε x = refl (pr₁ (g x))

    η : (σ : Σ A)  g (pr₁ σ)  σ
    η (x , a) = to-subtype-=  x  singletons-are-subsingletons (A x) (s x)) (ε x)

ΠΣ-distr-≃ = sol
 where
  sol : {X : 𝓤 ̇ } {A : X  𝓥 ̇ } {P : (x : X)  A x  𝓦 ̇ }
       (Π x  X , Σ a  A x , P x a)
       (Σ f  Π A , Π x  X , P x (f x))
  sol {𝓤} {𝓥} {𝓦} {X} {A} {P} = invertibility-gives-≃ φ (γ , η , ε)
   where
    φ : (Π x  X , Σ a  A x , P x a)
       Σ f  Π A , Π x  X , P x (f x)
    φ g = ((λ x  pr₁ (g x)) , λ x  pr₂ (g x))

    γ : (Σ f  Π A , Π x  X , P x (f x))
       Π x  X , Σ a  A x , P x a
    γ (f , φ) x = f x , φ x

    η : γ  φ  id
    η = refl

    ε : φ  γ  id
    ε = refl

Σ-assoc = sol
 where
  sol : {X : 𝓤 ̇ } {Y : X  𝓥 ̇ } {Z : Σ Y  𝓦 ̇ }
       Σ Z  (Σ x  X , Σ y  Y x , Z (x , y))
  sol {𝓤} {𝓥} {𝓦} {X} {Y} {Z} = invertibility-gives-≃ f (g , refl , refl)
   where
    f : Σ Z  Σ x  X , Σ y  Y x , Z (x , y)
    f ((x , y) , z) = (x , (y , z))

    g : (Σ x  X , Σ y  Y x , Z (x , y))  Σ Z
    g (x , (y , z)) = ((x , y) , z)

⁻¹-is-equiv : {X : 𝓤 ̇ } (x y : X)
             is-equiv  (p : x  y)  p ⁻¹)
⁻¹-is-equiv x y = invertibles-are-equivs _⁻¹
                   (_⁻¹ , ⁻¹-involutive , ⁻¹-involutive)

⁻¹-≃ = sol
 where
  sol : {X : 𝓤 ̇ } (x y : X)  (x  y)  (y  x)
  sol x y = (_⁻¹ , ⁻¹-is-equiv x y)

singleton-types-≃ = sol
 where
  sol : {X : 𝓤 ̇ } (x : X)  singleton-type' x  singleton-type x
  sol x = Σ-cong  y  ⁻¹-≃ x y)

singletons-≃ = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
       is-singleton X  is-singleton Y  X  Y
  sol {𝓤} {𝓥} {X} {Y} i j = invertibility-gives-≃ f (g , η , ε)
   where
    f : X  Y
    f x = center Y j

    g : Y  X
    g y = center X i

    η : (x : X)  g (f x)  x
    η = centrality X i

    ε : (y : Y)  f (g y)  y
    ε = centrality Y j

maps-of-singletons-are-equivs = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
       is-singleton X  is-singleton Y  is-equiv f

  sol {𝓤} {𝓥} {X} {Y} f i j = invertibles-are-equivs f (g , η , ε)
   where
    g : Y  X
    g y = center X i

    η : (x : X)  g (f x)  x
    η = centrality X i

    ε : (y : Y)  f (g y)  y
    ε y = singletons-are-subsingletons Y j (f (g y)) y

logically-equivalent-subsingletons-are-equivalent = sol
 where
  sol : (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )
       is-subsingleton X  is-subsingleton Y  X  Y  X  Y
  sol  X Y i j (f , g) = invertibility-gives-≃ f
                          (g ,
                            x  i (g (f x)) x) ,
                            y  j (f (g y)) y))

singletons-are-equivalent = sol
 where
  sol : (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )
       is-singleton X  is-singleton Y  X  Y
  sol  X Y i j = invertibility-gives-≃  _  center Y j)
                  ((λ _  center X i) ,
                   centrality X i ,
                   centrality Y j)

NatΣ-fiber-equiv = sol
 where
  sol : {X : 𝓤 ̇ } (A : X  𝓥 ̇ ) (B : X  𝓦 ̇ ) (φ : Nat A B)
        (x : X) (b : B x)
       fiber (φ x) b  fiber (NatΣ φ) (x , b)
  sol A B φ x b = invertibility-gives-≃ f (g , ε , η)
   where
    f : fiber (φ x) b  fiber (NatΣ φ) (x , b)
    f (a , refl _) = ((x , a) , refl (x , φ x a))

    g : fiber (NatΣ φ) (x , b)  fiber (φ x) b
    g ((x , a) , refl _) = (a , refl (φ x a))

    ε : (w : fiber (φ x) b)  g (f w)  w
    ε (a , refl _) = refl (a , refl (φ x a))

    η : (t : fiber (NatΣ φ) (x , b))  f (g t)  t
    η ((x , a) , refl _) = refl ((x , a) , refl (NatΣ φ (x , a)))

NatΣ-equiv-gives-fiberwise-equiv = sol
 where
  sol : {X : 𝓤 ̇ } {A : X  𝓥 ̇ } {B : X  𝓦 ̇ } (φ : Nat A B)
       is-equiv (NatΣ φ)  ((x : X)  is-equiv (φ x))
  sol {𝓤} {𝓥} {𝓦} {X} {A} {B} φ e x b = γ
   where
    d : fiber (φ x) b  fiber (NatΣ φ) (x , b)
    d = NatΣ-fiber-equiv A B φ x b

    s : is-singleton (fiber (NatΣ φ) (x , b))
    s = e (x , b)

    γ : is-singleton (fiber (φ x) b)
    γ = equiv-to-singleton d s

Σ-is-subsingleton = sol
 where
  sol : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
       is-subsingleton X
       ((x : X)  is-subsingleton (A x))
       is-subsingleton (Σ A)
  sol i j (x , _) (y , _) = to-subtype-= j (i x y)

×-is-singleton = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
       is-singleton X
       is-singleton Y
       is-singleton (X × Y)
  sol (x , φ) (y , γ) = (x , y) , δ
   where
    δ :  z  x , y  z
    δ (x' , y' ) = to-×-= (φ x' , γ y')

×-is-subsingleton = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
       is-subsingleton X  is-subsingleton Y  is-subsingleton (X × Y)
  sol i j = Σ-is-subsingleton i  _  j)

×-is-subsingleton' = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
       ((Y  is-subsingleton X) × (X  is-subsingleton Y))
       is-subsingleton (X × Y)
  sol {𝓤} {𝓥} {X} {Y} (i , j) = k
   where
    k : is-subsingleton (X × Y)
    k (x , y) (x' , y') = to-×-= (i y x x' , j x y y')

×-is-subsingleton'-back = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
       is-subsingleton (X × Y)
       (Y  is-subsingleton X) × (X  is-subsingleton Y)
  sol {𝓤} {𝓥} {X} {Y} k = i , j
   where
    i : Y  is-subsingleton X
    i y x x' = ap pr₁ (k (x , y) (x' , y))

    j : X  is-subsingleton Y
    j x y y' = ap pr₂ (k (x , y) (x , y'))

ap₂ = sol
 where
  sol : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } (f : X  Y  Z) {x x' : X} {y y' : Y}
       x  x'  y  y'  f x y  f x' y'
  sol f (refl x) (refl y) = refl (f x y)