Properties of equivalences depending on function extensionality.

(Not included in UF.Equiv because the module UF.funext defines function
extensionality as the equivalence of happly for suitable parameters.)

\begin{code}

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

module UF.Equiv-FunExt where

open import MLTT.Spartan
open import UF.Base
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.Retracts
open import UF.FunExt
open import UF.Equiv
open import UF.EquivalenceExamples

being-vv-equiv-is-prop' : funext ๐“ฅ (๐“ค โŠ” ๐“ฅ)
                        โ†’ funext (๐“ค โŠ” ๐“ฅ) (๐“ค โŠ” ๐“ฅ)
                        โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (f : X โ†’ Y)
                        โ†’ is-prop (is-vv-equiv f)
being-vv-equiv-is-prop' {๐“ค} {๐“ฅ} fe fe' f = ฮ -is-prop
                                             fe
                                             (ฮป x โ†’ being-singleton-is-prop fe' )

being-vv-equiv-is-prop : FunExt
                       โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                         (f : X โ†’ Y)
                       โ†’ is-prop (is-vv-equiv f)
being-vv-equiv-is-prop {๐“ค} {๐“ฅ} fe =
 being-vv-equiv-is-prop' (fe ๐“ฅ (๐“ค โŠ” ๐“ฅ)) (fe (๐“ค โŠ” ๐“ฅ) (๐“ค โŠ” ๐“ฅ))

qinv-post' : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ }
          โ†’ naive-funext ๐“ฆ ๐“ค
          โ†’ naive-funext ๐“ฆ ๐“ฅ
          โ†’ (f : X โ†’ Y)
          โ†’ qinv f
          โ†’ qinv (ฮป (h : A โ†’ X) โ†’ f โˆ˜ h)
qinv-post' {๐“ค} {๐“ฅ} {๐“ฆ} {X} {Y} {A} nfe nfe' f (g , ฮท , ฮต) = (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)

qinv-post : (โˆ€ ๐“ค ๐“ฅ โ†’ naive-funext ๐“ค ๐“ฅ)
          โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ }
            (f : X โ†’ Y)
          โ†’ qinv f
          โ†’ qinv (ฮป (h : A โ†’ X) โ†’ f โˆ˜ h)
qinv-post {๐“ค} {๐“ฅ} {๐“ฆ} nfe = qinv-post' (nfe ๐“ฆ ๐“ค) (nfe ๐“ฆ ๐“ฅ)

equiv-post : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ }
           โ†’ naive-funext ๐“ฆ ๐“ค
           โ†’ naive-funext ๐“ฆ ๐“ฅ
           โ†’ (f : X โ†’ Y)
           โ†’ is-equiv f
           โ†’ is-equiv (ฮป (h : A โ†’ X) โ†’ f โˆ˜ h)
equiv-post nfe nfe' f e = qinvs-are-equivs
                           (f โˆ˜_) (qinv-post' nfe nfe' f (equivs-are-qinvs f e))

qinv-pre' : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ }
          โ†’ naive-funext ๐“ฅ ๐“ฆ
          โ†’ naive-funext ๐“ค ๐“ฆ
          โ†’ (f : X โ†’ Y)
          โ†’ qinv f
          โ†’ qinv (ฮป (h : Y โ†’ A) โ†’ h โˆ˜ f)
qinv-pre' {๐“ค} {๐“ฅ} {๐“ฆ} {X} {Y} {A} nfe nfe' f (g , ฮท , ฮต) = (g' , ฮท' , ฮต')
 where
  f' : (Y โ†’ A) โ†’ (X โ†’ A)
  f' h = h โˆ˜ f

  g' : (X โ†’ A) โ†’ (Y โ†’ A)
  g' k = k โˆ˜ g

  ฮท' : (h : Y โ†’ A) โ†’ g' (f' h) ๏ผ h
  ฮท' h = nfe (ฮป y โ†’ ap h (ฮต y))

  ฮต' : (k : X โ†’ A) โ†’ f' (g' k) ๏ผ k
  ฮต' k = nfe' (ฮป x โ†’ ap k (ฮท x))

qinv-pre : (โˆ€ ๐“ค ๐“ฅ โ†’ naive-funext ๐“ค ๐“ฅ)
         โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ } (f : X โ†’ Y)
         โ†’ qinv f
         โ†’ qinv (ฮป (h : Y โ†’ A) โ†’ h โˆ˜ f)
qinv-pre {๐“ค} {๐“ฅ} {๐“ฆ} nfe = qinv-pre' (nfe ๐“ฅ ๐“ฆ) (nfe ๐“ค ๐“ฆ)

retractions-have-at-most-one-section' : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                                      โ†’ funext ๐“ฅ ๐“ค
                                      โ†’ funext ๐“ฅ ๐“ฅ
                                      โ†’ (f : X โ†’ Y)
                                      โ†’ is-section f
                                      โ†’ is-prop (has-section f)
retractions-have-at-most-one-section' {๐“ค} {๐“ฅ} {X} {Y} fe fe' f (g , gf) (h , fh) =
 singletons-are-props c (h , fh)
 where
  a : qinv f
  a = equivs-are-qinvs f ((h , fh) , g , gf)

  b : is-singleton(fiber (f โˆ˜_) id)
  b = qinvs-are-vv-equivs (f โˆ˜_) (qinv-post' (dfunext fe) (dfunext fe') f a) id

  r : fiber (f โˆ˜_) id โ†’ has-section f
  r (h , p) = (h , happly' (f โˆ˜ h) id p)

  s : has-section f โ†’ fiber (f โˆ˜_) id
  s (h , ฮท) = (h , dfunext fe' ฮท)

  rs : (ฯƒ : has-section f) โ†’ r (s ฯƒ) ๏ผ ฯƒ
  rs (h , ฮท) = ap (ฮป - โ†’ (h , -)) q
   where
    q : happly' (f โˆ˜ h) id (dfunext fe' ฮท) ๏ผ ฮท
    q = happly-funext fe' (f โˆ˜ h) id ฮท

  c : is-singleton (has-section f)
  c = retract-of-singleton (r , s , rs) b

sections-have-at-most-one-retraction' : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                                      โ†’ funext ๐“ค ๐“ค
                                      โ†’ funext ๐“ฅ ๐“ค
                                      โ†’ (f : X โ†’ Y)
                                      โ†’ has-section f
                                      โ†’ is-prop (is-section f)
sections-have-at-most-one-retraction' {๐“ค} {๐“ฅ} {X} {Y} fe fe' f (g , fg) (h , hf) =
 singletons-are-props c (h , hf)
 where
  a : qinv f
  a = equivs-are-qinvs f ((g , fg) , (h , hf))

  b : is-singleton(fiber (_โˆ˜ f) id)
  b = qinvs-are-vv-equivs (_โˆ˜ f) (qinv-pre' (dfunext fe') (dfunext fe) f a) id

  r : fiber (_โˆ˜ f) id โ†’ is-section f
  r (h , p) = (h , happly' (h โˆ˜ f) id p)

  s : is-section f โ†’ fiber (_โˆ˜ f) id
  s (h , ฮท) = (h , dfunext fe ฮท)

  rs : (ฯƒ : is-section f) โ†’ r (s ฯƒ) ๏ผ ฯƒ
  rs (h , ฮท) = ap (ฮป - โ†’ (h , -)) q
   where
    q : happly' (h โˆ˜ f) id (dfunext fe ฮท) ๏ผ ฮท
    q = happly-funext fe (h โˆ˜ f) id ฮท

  c : is-singleton (is-section f)
  c = retract-of-singleton (r , s , rs) b

retractions-have-at-most-one-section : FunExt
                                     โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                                       (f : X โ†’ Y)
                                     โ†’ is-section f
                                     โ†’ is-prop (has-section f)
retractions-have-at-most-one-section {๐“ค} {๐“ฅ} fe =
 retractions-have-at-most-one-section' (fe ๐“ฅ ๐“ค) (fe ๐“ฅ ๐“ฅ)

sections-have-at-most-one-retraction : FunExt
                                     โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                                       (f : X โ†’ Y)
                                     โ†’ has-section f
                                     โ†’ is-prop (is-section f)
sections-have-at-most-one-retraction {๐“ค} {๐“ฅ} fe =
 sections-have-at-most-one-retraction' (fe ๐“ค ๐“ค) (fe ๐“ฅ ๐“ค)

being-equiv-is-prop' : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                     โ†’ funext ๐“ฅ ๐“ค
                     โ†’ funext ๐“ฅ ๐“ฅ
                     โ†’ funext ๐“ค ๐“ค
                     โ†’ funext ๐“ฅ ๐“ค
                     โ†’ (f : X โ†’ Y)
                     โ†’ is-prop (is-equiv f)
being-equiv-is-prop' fe fe' fe'' fe''' f =
 ร—-prop-criterion
  (retractions-have-at-most-one-section' fe fe' f ,
   sections-have-at-most-one-retraction' fe'' fe''' f)

being-equiv-is-prop : FunExt
                    โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                      (f : X โ†’ Y)
                    โ†’ is-prop (is-equiv f)
being-equiv-is-prop {๐“ค} {๐“ฅ} fe f =
 being-equiv-is-prop' (fe ๐“ฅ ๐“ค) (fe ๐“ฅ ๐“ฅ) (fe ๐“ค ๐“ค) (fe ๐“ฅ ๐“ค) f

being-equiv-is-prop'' : {X Y : ๐“ค ฬ‡ }
                      โ†’ funext ๐“ค ๐“ค
                      โ†’ (f : X โ†’ Y)
                      โ†’ is-prop (is-equiv f)
being-equiv-is-prop'' fe = being-equiv-is-prop' fe fe fe fe

โ‰ƒ-assoc' : funext ๐“ฃ ๐“ค
         โ†’ funext ๐“ฃ ๐“ฃ
         โ†’ funext ๐“ค ๐“ค
         โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {Z : ๐“ฆ ฬ‡ } {T : ๐“ฃ ฬ‡ }
           (ฮฑ : X โ‰ƒ Y) (ฮฒ : Y โ‰ƒ Z) (ฮณ : Z โ‰ƒ T)
         โ†’ ฮฑ โ— (ฮฒ โ— ฮณ) ๏ผ (ฮฑ โ— ฮฒ) โ— ฮณ
โ‰ƒ-assoc' feโ‚€ fโ‚ fโ‚‚ (f , a) (g , b) (h , c) = to-ฮฃ-๏ผ (p , q)
 where
  p : (h โˆ˜ g) โˆ˜ f ๏ผ h โˆ˜ (g โˆ˜ f)
  p = refl

  d e : is-equiv (h โˆ˜ g โˆ˜ f)
  d = โˆ˜-is-equiv a (โˆ˜-is-equiv b c)
  e = โˆ˜-is-equiv (โˆ˜-is-equiv a b) c

  q : transport is-equiv p d ๏ผ e
  q = being-equiv-is-prop' feโ‚€ fโ‚ fโ‚‚ feโ‚€ (h โˆ˜ g โˆ˜ f) _ _

to-โ‰ƒ-๏ผ : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡}
        โ†’ Fun-Ext
        โ†’ {f g : X โ†’ Y} {i : is-equiv f} {j : is-equiv g}
        โ†’ f โˆผ g
        โ†’ (f , i) ๏ผ[ X โ‰ƒ Y ] (g , j)
to-โ‰ƒ-๏ผ fe h = to-subtype-๏ผ
               (being-equiv-is-prop' fe fe fe fe)
                        (dfunext fe h)

โ‰ƒ-assoc : FunExt
        โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {Z : ๐“ฆ ฬ‡ } {T : ๐“ฃ ฬ‡ }
          (ฮฑ : X โ‰ƒ Y) (ฮฒ : Y โ‰ƒ Z) (ฮณ : Z โ‰ƒ T)
        โ†’ ฮฑ โ— (ฮฒ โ— ฮณ) ๏ผ (ฮฑ โ— ฮฒ) โ— ฮณ
โ‰ƒ-assoc fe = โ‰ƒ-assoc' (fe _ _) (fe _ _) (fe _ _)

\end{code}

The above proof can be condensed to one line in the style of the
following two proofs, which exploit the fact that the identity map is
a neutral element for ordinary function composition, definitionally:

\begin{code}

โ‰ƒ-refl-left' : funext ๐“ฅ ๐“ค
             โ†’ funext ๐“ฅ ๐“ฅ
             โ†’ funext ๐“ค ๐“ค
             โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (ฮฑ : X โ‰ƒ Y)
             โ†’ โ‰ƒ-refl X โ— ฮฑ ๏ผ ฮฑ
โ‰ƒ-refl-left' feโ‚€ feโ‚ feโ‚‚ ฮฑ = to-ฮฃ-๏ผ' (being-equiv-is-prop' feโ‚€ feโ‚ feโ‚‚ feโ‚€ _ _ _)

โ‰ƒ-refl-right' : funext ๐“ฅ ๐“ค
              โ†’ funext ๐“ฅ ๐“ฅ
              โ†’ funext ๐“ค ๐“ค
              โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                (ฮฑ : X โ‰ƒ Y)
              โ†’ ฮฑ โ— โ‰ƒ-refl Y ๏ผ ฮฑ
โ‰ƒ-refl-right' feโ‚€ feโ‚ feโ‚‚  ฮฑ = to-ฮฃ-๏ผ' (being-equiv-is-prop' feโ‚€ feโ‚ feโ‚‚ feโ‚€ _ _ _)

โ‰ƒ-sym-involutive' : funext ๐“ฅ ๐“ค
                  โ†’ funext ๐“ฅ ๐“ฅ
                  โ†’ funext ๐“ค ๐“ค
                  โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                    (ฮฑ : X โ‰ƒ Y)
                  โ†’ โ‰ƒ-sym (โ‰ƒ-sym ฮฑ) ๏ผ ฮฑ
โ‰ƒ-sym-involutive' feโ‚€ feโ‚ feโ‚‚ (f , a) = to-ฮฃ-๏ผ
                                         (inversion-involutive f a ,
                                          being-equiv-is-prop' feโ‚€ feโ‚ feโ‚‚ feโ‚€ f _ a)

โ‰ƒ-Sym' : funext ๐“ฅ ๐“ค
       โ†’ funext ๐“ฅ ๐“ฅ
       โ†’ funext ๐“ค ๐“ค
       โ†’ funext ๐“ค ๐“ฅ
       โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
       โ†’ (X โ‰ƒ Y) โ‰ƒ (Y โ‰ƒ X)
โ‰ƒ-Sym' feโ‚€ feโ‚ feโ‚‚ feโ‚ƒ = qinveq โ‰ƒ-sym
                          (โ‰ƒ-sym ,
                           โ‰ƒ-sym-involutive' feโ‚€ feโ‚ feโ‚‚ ,
                           โ‰ƒ-sym-involutive' feโ‚ƒ feโ‚‚ feโ‚)

โ‰ƒ-Sym'' : funext ๐“ค ๐“ค
        โ†’ {X Y : ๐“ค ฬ‡ }
        โ†’ (X โ‰ƒ Y) โ‰ƒ (Y โ‰ƒ X)
โ‰ƒ-Sym'' fe = โ‰ƒ-Sym' fe fe fe fe

โ‰ƒ-Sym : FunExt
      โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
      โ†’ (X โ‰ƒ Y) โ‰ƒ (Y โ‰ƒ X)
โ‰ƒ-Sym {๐“ค} {๐“ฅ} fe = โ‰ƒ-Sym' (fe ๐“ฅ ๐“ค) (fe ๐“ฅ ๐“ฅ) (fe ๐“ค ๐“ค) (fe ๐“ค ๐“ฅ)

โ‰ƒ-refl-left : FunExt
            โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
              (ฮฑ : X โ‰ƒ Y)
            โ†’ โ‰ƒ-refl X โ— ฮฑ ๏ผ ฮฑ
โ‰ƒ-refl-left fe = โ‰ƒ-refl-left' (fe _ _) (fe _ _) (fe _ _)

โ‰ƒ-refl-right : FunExt
             โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
               (ฮฑ : X โ‰ƒ Y)
             โ†’ ฮฑ โ— โ‰ƒ-refl Y ๏ผ ฮฑ
โ‰ƒ-refl-right fe = โ‰ƒ-refl-right' (fe _ _) (fe _ _) (fe _ _)

โ‰ƒ-sym-involutive : FunExt
                 โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                   (ฮฑ : X โ‰ƒ Y)
                 โ†’ โ‰ƒ-sym (โ‰ƒ-sym ฮฑ) ๏ผ ฮฑ
โ‰ƒ-sym-involutive {๐“ค} {๐“ฅ} fe = โ‰ƒ-sym-involutive' (fe ๐“ฅ ๐“ค) (fe ๐“ฅ ๐“ฅ) (fe ๐“ค ๐“ค)

โ‰ƒ-sym-left-inverse' : funext ๐“ฅ ๐“ฅ
                    โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                      (ฮฑ : X โ‰ƒ Y)
                    โ†’ โ‰ƒ-sym ฮฑ โ— ฮฑ ๏ผ โ‰ƒ-refl Y
โ‰ƒ-sym-left-inverse' fe {X} {Y} (f , e) = ฮณ
 where
  ฮฑ = (f , e)

  p : f โˆ˜ inverse f e ๏ผ id
  p = dfunext fe (inverses-are-sections f e)

  ฮณ : โ‰ƒ-sym ฮฑ โ— ฮฑ ๏ผ โ‰ƒ-refl Y
  ฮณ = to-ฮฃ-๏ผ (p , being-equiv-is-prop' fe fe fe fe _ _ _)

โ‰ƒ-sym-left-inverse : FunExt
                   โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
                     (ฮฑ : X โ‰ƒ Y)
                   โ†’ โ‰ƒ-sym ฮฑ โ— ฮฑ ๏ผ โ‰ƒ-refl Y
โ‰ƒ-sym-left-inverse fe = โ‰ƒ-sym-left-inverse' (fe _ _)

โ‰ƒ-sym-right-inverse' : funext ๐“ค ๐“ค
                     โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (ฮฑ : X โ‰ƒ Y)
                     โ†’ ฮฑ โ— โ‰ƒ-sym ฮฑ ๏ผ โ‰ƒ-refl X
โ‰ƒ-sym-right-inverse' fe {X} (f , e) = ฮณ
 where
  ฮฑ = (f , e)

  p : inverse f e โˆ˜ f ๏ผ id
  p = dfunext fe (inverses-are-retractions f e)

  ฮณ : ฮฑ โ— โ‰ƒ-sym ฮฑ ๏ผ โ‰ƒ-refl X
  ฮณ = to-ฮฃ-๏ผ (p , being-equiv-is-prop' fe fe fe fe _ _ _)

โ‰ƒ-sym-right-inverse : FunExt
                    โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (ฮฑ : X โ‰ƒ Y)
                    โ†’ ฮฑ โ— โ‰ƒ-sym ฮฑ ๏ผ โ‰ƒ-refl X
โ‰ƒ-sym-right-inverse fe = โ‰ƒ-sym-right-inverse' (fe _ _)

โ‰ƒ-cong-left' : {๐“ค ๐“ฅ ๐“ฆ : Universe}
             โ†’ funext ๐“ฆ ๐“ค
             โ†’ funext ๐“ฆ ๐“ฆ
             โ†’ funext ๐“ค ๐“ค
             โ†’ funext ๐“ฆ ๐“ฅ
             โ†’ funext ๐“ฅ ๐“ฅ
             โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {Z : ๐“ฆ ฬ‡ }
             โ†’ X โ‰ƒ Y
             โ†’ (X โ‰ƒ Z) โ‰ƒ (Y โ‰ƒ Z)
โ‰ƒ-cong-left' feโ‚€ feโ‚ feโ‚‚ feโ‚ƒ feโ‚„ {X} {Y} {Z} ฮฑ = ฮณ
 where
  p = ฮป ฮณ โ†’ ฮฑ โ— (โ‰ƒ-sym ฮฑ โ— ฮณ) ๏ผโŸจ โ‰ƒ-assoc' feโ‚€ feโ‚ feโ‚‚ ฮฑ (โ‰ƒ-sym ฮฑ) ฮณ โŸฉ
            (ฮฑ โ— โ‰ƒ-sym ฮฑ) โ— ฮณ ๏ผโŸจ ap (_โ— ฮณ) (โ‰ƒ-sym-right-inverse' feโ‚‚ ฮฑ) โŸฉ
            โ‰ƒ-refl _ โ— ฮณ      ๏ผโŸจ โ‰ƒ-refl-left' feโ‚€ feโ‚ feโ‚‚ _ โŸฉ
            ฮณ                 โˆŽ
  q = ฮป ฮฒ โ†’ โ‰ƒ-sym ฮฑ โ— (ฮฑ โ— ฮฒ) ๏ผโŸจ โ‰ƒ-assoc' feโ‚ƒ feโ‚ feโ‚„ (โ‰ƒ-sym ฮฑ) ฮฑ ฮฒ โŸฉ
            (โ‰ƒ-sym ฮฑ โ— ฮฑ) โ— ฮฒ ๏ผโŸจ ap (_โ— ฮฒ) (โ‰ƒ-sym-left-inverse' feโ‚„ ฮฑ) โŸฉ
            โ‰ƒ-refl _ โ— ฮฒ      ๏ผโŸจ โ‰ƒ-refl-left' feโ‚ƒ feโ‚ feโ‚„ _ โŸฉ
            ฮฒ                 โˆŽ

  ฮณ : (X โ‰ƒ Z) โ‰ƒ (Y โ‰ƒ Z)
  ฮณ = qinveq ((โ‰ƒ-sym ฮฑ) โ—_) ((ฮฑ โ—_), p , q)

โ‰ƒ-cong-left'' : funext ๐“ค ๐“ค
              โ†’ {X Y Z : ๐“ค ฬ‡ }
              โ†’ X โ‰ƒ Y
              โ†’ (X โ‰ƒ Z) โ‰ƒ (Y โ‰ƒ Z)
โ‰ƒ-cong-left'' fe = โ‰ƒ-cong-left' fe fe fe fe fe

โ‰ƒ-cong-left : FunExt
            โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {Z : ๐“ฆ ฬ‡ }
            โ†’ X โ‰ƒ Y
            โ†’ (X โ‰ƒ Z) โ‰ƒ (Y โ‰ƒ Z)
โ‰ƒ-cong-left fe = โ‰ƒ-cong-left' (fe _ _) (fe _ _) (fe _ _) (fe _ _) (fe _ _)

โ‰ƒ-cong-right : FunExt
             โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ }
             โ†’ X โ‰ƒ Y
             โ†’ (A โ‰ƒ X) โ‰ƒ (A โ‰ƒ Y)
โ‰ƒ-cong-right fe {X} {Y} {A} ฮฑ =
 (A โ‰ƒ X) โ‰ƒโŸจ โ‰ƒ-Sym fe โŸฉ
 (X โ‰ƒ A) โ‰ƒโŸจ โ‰ƒ-cong-left fe ฮฑ โŸฉ
 (Y โ‰ƒ A) โ‰ƒโŸจ โ‰ƒ-Sym fe โŸฉ
 (A โ‰ƒ Y) โ– 

โ‰ƒ-cong : FunExt
       โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ } {B : ๐“ฃ ฬ‡ }
       โ†’ X โ‰ƒ A
       โ†’ Y โ‰ƒ B
       โ†’ (X โ‰ƒ Y) โ‰ƒ (A โ‰ƒ B)
โ‰ƒ-cong fe {X} {Y} {A} {B} ฮฑ ฮฒ =
 (X โ‰ƒ Y) โ‰ƒโŸจ โ‰ƒ-cong-left  fe ฮฑ โŸฉ
 (A โ‰ƒ Y) โ‰ƒโŸจ โ‰ƒ-cong-right fe ฮฒ โŸฉ
 (A โ‰ƒ B) โ– 

โ‰ƒ-is-prop : FunExt
          โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
          โ†’ is-prop Y
          โ†’ is-prop (X โ‰ƒ Y)
โ‰ƒ-is-prop {๐“ค} {๐“ฅ} fe i (f , e) (f' , e') =
 to-subtype-๏ผ
  (being-equiv-is-prop fe)
  (dfunext (fe ๐“ค ๐“ฅ) (ฮป x โ†’ i (f x) (f' x)))

โ‰ƒ-is-prop' : FunExt
           โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
           โ†’ is-prop X
           โ†’ is-prop (X โ‰ƒ Y)
โ‰ƒ-is-prop' fe i = equiv-to-prop (โ‰ƒ-Sym fe) (โ‰ƒ-is-prop fe i)

\end{code}

Propositional and functional extesionality give univalence for
propositions. Notice that P is assumed to be a proposition, but X
ranges over arbitrary types:

\begin{code}

propext-funext-give-prop-ua : propext ๐“ค
                            โ†’ funext ๐“ค ๐“ค
                            โ†’ (X : ๐“ค ฬ‡ ) (P : ๐“ค ฬ‡ )
                            โ†’ is-prop P
                            โ†’ is-equiv (idtoeq X P)
propext-funext-give-prop-ua {๐“ค} pe fe X P i = (eqtoid , ฮท) , (eqtoid , ฮต)
 where
  l : X โ‰ƒ P โ†’ is-prop X
  l e = equiv-to-prop e i

  eqtoid : X โ‰ƒ P โ†’ X ๏ผ P
  eqtoid (f , (r , rf) , h) = pe (l (f , (r , rf) , h)) i f r

  m : is-prop (X โ‰ƒ P)
  m (f , e) (f' , e') = to-ฮฃ-๏ผ (dfunext fe (ฮป x โ†’ i (f x) (f' x)) ,
                                being-equiv-is-prop'' fe f' _ e')
  ฮท : (e : X โ‰ƒ P) โ†’ idtoeq X P (eqtoid e) ๏ผ e
  ฮท e = m (idtoeq X P (eqtoid e)) e

  ฮต : (q : X ๏ผ P) โ†’ eqtoid (idtoeq X P q) ๏ผ q
  ฮต q = identifications-with-props-are-props pe fe P i X (eqtoid (idtoeq X P q)) q

prop-univalent-โ‰ƒ : propext ๐“ค
                 โ†’ funext ๐“ค ๐“ค
                 โ†’ (X P : ๐“ค ฬ‡ )
                 โ†’ is-prop P
                 โ†’ (X ๏ผ P) โ‰ƒ (X โ‰ƒ P)
prop-univalent-โ‰ƒ pe fe X P i = idtoeq X P ,
                               propext-funext-give-prop-ua pe fe X P i

prop-univalent-โ‰ƒ' : propext ๐“ค
                  โ†’ funext ๐“ค ๐“ค
                  โ†’ (X P : ๐“ค ฬ‡ )
                  โ†’ is-prop P
                  โ†’ (P ๏ผ X) โ‰ƒ (P โ‰ƒ X)
prop-univalent-โ‰ƒ' pe fe X P i = (P ๏ผ X) โ‰ƒโŸจ ๏ผ-flip โŸฉ
                                (X ๏ผ P) โ‰ƒโŸจ prop-univalent-โ‰ƒ pe fe X P i โŸฉ
                                (X โ‰ƒ P)  โ‰ƒโŸจ โ‰ƒ-Sym'' fe โŸฉ
                                (P โ‰ƒ X)  โ– 
\end{code}

Added 24th Feb 2023.

\begin{code}

prop-โ‰ƒ-โ‰ƒ-โ†” : Fun-Ext
           โ†’ {P : ๐“ค ฬ‡ } {Q : ๐“ฅ ฬ‡ }
           โ†’ is-prop P
           โ†’ is-prop Q
           โ†’ (P โ‰ƒ Q) โ‰ƒ (P โ†” Q)
prop-โ‰ƒ-โ‰ƒ-โ†” fe i j = qinveq (ฮป f โ†’ โŒœ f โŒ ,  โŒœ f โŒโปยน)
                     ((ฮป (g , h) โ†’ qinveq g
                                    (h ,
                                    (ฮป p โ†’ i (h (g p)) p) ,
                                    (ฮป q โ†’ j (g (h q)) q))) ,
                      (ฮป f โ†’ to-subtype-๏ผ
                              (being-equiv-is-prop (ฮป _ _ โ†’ fe))
                               refl) ,
                      (ฮป _ โ†’ refl))

prop-๏ผ-โ‰ƒ-โ†” : Prop-Ext
            โ†’ Fun-Ext
            โ†’ {P Q : ๐“ค ฬ‡ }
            โ†’ is-prop P
            โ†’ is-prop Q
            โ†’ (P ๏ผ Q) โ‰ƒ (P โ†” Q)
prop-๏ผ-โ‰ƒ-โ†” pe fe i j = prop-univalent-โ‰ƒ pe fe _ _ j
                      โ— prop-โ‰ƒ-โ‰ƒ-โ†” fe i j

\end{code}

Added 3rd November 2023.

\begin{code}

open import UF.Subsingletons-Properties
open import UF.Sets
open import UF.Sets-Properties

โ‰ƒ-is-set : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
         โ†’ Fun-Ext
         โ†’ is-set X
         โ†’ is-set (X โ‰ƒ Y)
โ‰ƒ-is-set {๐“ค} {๐“ฅ} {X} {Y} fe X-is-set {๐•—} {๐•˜} =
 ฮฃ-is-set
  (ฮ -is-set fe (ฮป _ โ†’ equiv-to-set (โ‰ƒ-sym ๐•—) X-is-set))
  (ฮป _ โ†’ props-are-sets (being-equiv-is-prop (ฮป _ _ โ†’ fe) _))

\end{code}