{-# OPTIONS --without-K --exact-split #-}
module _ where
open import TransportLemmas
open import EquivalenceType

open import HomotopyType
open import FunExtAxiom

open import EquivalenceType
open import QuasiinverseType
open import QuasiinverseLemmas
open import UnivalenceAxiom
open import UnivalenceTransport
open import UnivalenceIdEquiv
open import HLevelLemmas

Univalence lemmas

module UnivalenceComposition where
ua-comp
  :  {: Level} {A B C : Type ℓ}
   (α : A ≃ B)
   (β : B ≃ C)
  ---------------------------------
   ua (α :>≃ β) == (ua α) · (ua β)

ua-comp α β  =
 begin
   ua (α :>≃ β)
     ≡⟨ ap ua (:>≃-ite-ua α β) ⟩
   ua (ite (ua α · ua β))
     ≡⟨ ua-η ((ua α) · (ua β))(ua α) · (ua β)

Inverses are preserved (Type-check this takes ~30min)

postulate
 ua-inv-r
  :  {: Level} {A B : Type ℓ}
   (α : A ≃ B)
  -------------------------------
   ua α · ua (≃-sym α) == refl A

{-
ua-inv-r {A = A} α =
  begin
    ua α · ua (≃-sym α)
      ==⟨ ! (ua-comp α (≃-sym α)) ⟩
    ua (≃-trans α (≃-sym α))
      ==⟨ ap ua (≃-trans-inv α) ⟩
    ua idEqv
      ==⟨ UnivalenceLemmas.ua-id ⟩
    refl A

-}
ua-inv
  :  {: Level} {A B : Type ℓ}
   (α : A ≃ B)
  -------------------------
   ua (≃-sym α) ≡ ! (ua α)

ua-inv α =
  begin
    ua (≃-sym α)
      ≡⟨ ap (_· ua (≃-sym α)) (! (·-linv (ua α))) ⟩
    ! (ua α) · ua α · ua (≃-sym α)
      ≡⟨ ·-assoc (! (ua α)) _ _ ⟩
    ! (ua α) · (ua α · ua (≃-sym α))
      ≡⟨ ap (! (ua α) ·_) (ua-inv-r α) ⟩
    ! (ua α) · refl _
      ≡⟨ ! (·-runit (! ((ua α)))) ⟩
    ! (ua α)