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 --without-K --exact-split --safe #-}

module MGS-Equivalence-Constructions where

open import MGS-More-FunExt-Consequences public

id-โ‰ƒ-left : dfunext ๐“ฅ (๐“ค โŠ” ๐“ฅ)
          โ†’ dfunext (๐“ค โŠ” ๐“ฅ) (๐“ค โŠ” ๐“ฅ)
          โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (ฮฑ : X โ‰ƒ Y)
          โ†’ id-โ‰ƒ X โ— ฮฑ โ‰ก ฮฑ

id-โ‰ƒ-left fe fe' ฮฑ = to-subtype-โ‰ก (being-equiv-is-subsingleton fe fe') (refl _)

โ‰ƒ-sym-left-inverse : dfunext ๐“ฅ ๐“ฅ
                   โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (ฮฑ : X โ‰ƒ Y)
                   โ†’ โ‰ƒ-sym ฮฑ โ— ฮฑ โ‰ก id-โ‰ƒ Y

โ‰ƒ-sym-left-inverse fe (f , e) = to-subtype-โ‰ก (being-equiv-is-subsingleton fe fe) p
 where
  p : f โˆ˜ inverse f e โ‰ก id
  p = fe (inverses-are-sections f e)

โ‰ƒ-sym-right-inverse : dfunext ๐“ค ๐“ค
                    โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (ฮฑ : X โ‰ƒ Y)
                    โ†’ ฮฑ โ— โ‰ƒ-sym ฮฑ โ‰ก id-โ‰ƒ X

โ‰ƒ-sym-right-inverse fe (f , e) = to-subtype-โ‰ก (being-equiv-is-subsingleton fe fe) p
 where
  p : inverse f e โˆ˜ f โ‰ก id
  p = fe (inverses-are-retractions f e)

โ‰ƒ-Sym : dfunext ๐“ฅ (๐“ค โŠ” ๐“ฅ) โ†’ dfunext ๐“ค (๐“ค โŠ” ๐“ฅ) โ†’ dfunext (๐“ค โŠ” ๐“ฅ) (๐“ค โŠ” ๐“ฅ)
      โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
      โ†’ (X โ‰ƒ Y) โ‰ƒ (Y โ‰ƒ X)

โ‰ƒ-Sym feโ‚€ feโ‚ feโ‚‚ = โ‰ƒ-sym , โ‰ƒ-sym-is-equiv feโ‚€ feโ‚ feโ‚‚

โ‰ƒ-Comp : dfunext ๐“ฆ (๐“ฅ โŠ” ๐“ฆ) โ†’ dfunext (๐“ฅ โŠ” ๐“ฆ) (๐“ฅ โŠ” ๐“ฆ )
       โ†’ dfunext ๐“ฅ ๐“ฅ โ†’ dfunext ๐“ฆ (๐“ค โŠ” ๐“ฆ)
       โ†’ dfunext (๐“ค โŠ” ๐“ฆ) (๐“ค โŠ” ๐“ฆ ) โ†’ dfunext ๐“ค ๐“ค
       โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } (Z : ๐“ฆ ฬ‡ )
       โ†’ X โ‰ƒ Y โ†’ (Y โ‰ƒ Z) โ‰ƒ (X โ‰ƒ Z)

โ‰ƒ-Comp feโ‚€ feโ‚ feโ‚‚ feโ‚ƒ feโ‚„ feโ‚… Z ฮฑ = invertibility-gives-โ‰ƒ (ฮฑ โ—_)
                                      ((โ‰ƒ-sym ฮฑ โ—_) , p , q)
 where
  p = ฮป ฮฒ โ†’ โ‰ƒ-sym ฮฑ โ— (ฮฑ โ— ฮฒ) โ‰กโŸจ โ—-assoc feโ‚€ feโ‚ (โ‰ƒ-sym ฮฑ) ฮฑ ฮฒ โŸฉ
            (โ‰ƒ-sym ฮฑ โ— ฮฑ) โ— ฮฒ โ‰กโŸจ ap (_โ— ฮฒ) (โ‰ƒ-sym-left-inverse feโ‚‚ ฮฑ) โŸฉ
            id-โ‰ƒ _ โ— ฮฒ        โ‰กโŸจ id-โ‰ƒ-left feโ‚€ feโ‚ _ โŸฉ
            ฮฒ                 โˆŽ

  q = ฮป ฮณ โ†’ ฮฑ โ— (โ‰ƒ-sym ฮฑ โ— ฮณ) โ‰กโŸจ โ—-assoc feโ‚ƒ feโ‚„ ฮฑ (โ‰ƒ-sym ฮฑ) ฮณ โŸฉ
            (ฮฑ โ— โ‰ƒ-sym ฮฑ) โ— ฮณ โ‰กโŸจ ap (_โ— ฮณ) (โ‰ƒ-sym-right-inverse feโ‚… ฮฑ) โŸฉ
            id-โ‰ƒ _ โ— ฮณ        โ‰กโŸจ id-โ‰ƒ-left feโ‚ƒ feโ‚„ _ โŸฉ
            ฮณ                 โˆŽ

Eq-Eq-cong' : dfunext ๐“ฅ (๐“ค โŠ” ๐“ฅ) โ†’ dfunext (๐“ค โŠ” ๐“ฅ) (๐“ค โŠ” ๐“ฅ) โ†’ dfunext ๐“ค ๐“ค
            โ†’ dfunext ๐“ฅ (๐“ฅ โŠ” ๐“ฆ) โ†’ dfunext (๐“ฅ โŠ” ๐“ฆ) (๐“ฅ โŠ” ๐“ฆ) โ†’ dfunext ๐“ฆ ๐“ฆ
            โ†’ dfunext ๐“ฆ (๐“ฅ โŠ” ๐“ฆ) โ†’ dfunext ๐“ฅ ๐“ฅ โ†’ dfunext ๐“ฆ (๐“ฆ โŠ” ๐“ฃ)
            โ†’ dfunext (๐“ฆ โŠ” ๐“ฃ) (๐“ฆ โŠ” ๐“ฃ) โ†’ dfunext ๐“ฃ ๐“ฃ โ†’ dfunext ๐“ฃ (๐“ฆ โŠ” ๐“ฃ)
            โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ } {B : ๐“ฃ ฬ‡ }
            โ†’ X โ‰ƒ A โ†’ Y โ‰ƒ B โ†’ (X โ‰ƒ Y) โ‰ƒ (A โ‰ƒ B)

Eq-Eq-cong' feโ‚€ feโ‚ feโ‚‚ feโ‚ƒ feโ‚„ feโ‚… feโ‚† feโ‚‡ feโ‚ˆ feโ‚‰ feโ‚โ‚€ feโ‚โ‚ {X} {Y} {A} {B} ฮฑ ฮฒ =

  X โ‰ƒ Y   โ‰ƒโŸจ โ‰ƒ-Comp feโ‚€ feโ‚ feโ‚‚ feโ‚ƒ feโ‚„ feโ‚… Y (โ‰ƒ-sym ฮฑ) โŸฉ
  A โ‰ƒ Y   โ‰ƒโŸจ โ‰ƒ-Sym feโ‚ƒ feโ‚† feโ‚„ โŸฉ
  Y โ‰ƒ A   โ‰ƒโŸจ โ‰ƒ-Comp feโ‚† feโ‚„ feโ‚‡ feโ‚ˆ feโ‚‰ feโ‚โ‚€ A (โ‰ƒ-sym ฮฒ) โŸฉ
  B โ‰ƒ A   โ‰ƒโŸจ โ‰ƒ-Sym feโ‚ˆ feโ‚โ‚ feโ‚‰ โŸฉ
  A โ‰ƒ B   โ– 

Eq-Eq-cong : global-dfunext
           โ†’ {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ } {A : ๐“ฆ ฬ‡ } {B : ๐“ฃ ฬ‡ }
           โ†’ X โ‰ƒ A โ†’ Y โ‰ƒ B โ†’ (X โ‰ƒ Y) โ‰ƒ (A โ‰ƒ B)

Eq-Eq-cong fe = Eq-Eq-cong' fe fe fe fe fe fe fe fe fe fe fe fe

\end{code}