module GpdCont.Equiv where
open import GpdCont.Prelude
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.Equiv.Properties using (equivAdjointEquiv ; domIsoDep)
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Univalence using (pathToEquiv ; EquivJ)
open import Cubical.Foundations.Transport using (transportComposite)
open import Cubical.Functions.FunExtEquiv using (funExtEquiv)
private
variable
ℓ : Level
A B : Type ℓ
pathToEquivSym : ∀ {ℓ} {A B : Type ℓ}
→ (p : A ≡ B)
→ pathToEquiv (sym p) ≡ invEquiv (pathToEquiv p)
pathToEquivSym p = equivEq lem where
lem : transport (sym p) ≡ invEquiv (pathToEquiv p) .fst
lem = funExt λ b → sym (transportRefl (transport (sym p) b))
pathToEquivComp : ∀ {ℓ} {A B C : Type ℓ}
→ (p : A ≡ B) (q : B ≡ C)
→ pathToEquiv (p ∙ q) ≡ pathToEquiv p ∙ₑ pathToEquiv q
pathToEquivComp p q = equivEq $ funExt $ transportComposite p q
equivΠCodComp : ∀ {ℓ ℓ'} {A : Type ℓ} {F G H : A → Type ℓ'}
→ (α : (a : A) → F a ≃ G a)
→ (β : (a : A) → G a ≃ H a)
→ equivΠCod (λ a → α a ∙ₑ β a) ≡ equivΠCod α ∙ₑ equivΠCod β
equivΠCodComp α β = equivEq refl
symEquiv : ∀ {ℓ} {A : Type ℓ} {x y : A} → (x ≡ y) ≃ (y ≡ x)
symEquiv = strictEquiv sym sym
equivAdjointEquivExtCodomain : ∀ {ℓ ℓ' ℓ''} {A : Type ℓ} {B : Type ℓ'} {C : Type ℓ''}
→ (e : A ≃ B) (f : C → A) (g : C → B)
→ (f ≡ invEq e ∘ g) ≃ (equivFun e ∘ f ≡ g)
equivAdjointEquivExtCodomain {C} e f g = invEquiv funExtEquiv ∙ₑ equivΠCod lemma ∙ₑ funExtEquiv where
lemma : ∀ (c : C) → (f c ≡ invEq e (g c)) ≃ (equivFun e (f c) ≡ g c)
lemma c = equivAdjointEquiv e
equivAdjointEquivExtDomain : ∀ {ℓ ℓ'} {A B : Type ℓ} {C : Type ℓ'}
→ (e : A ≃ B) (f : B → C) (g : A → C)
→ (g ∘ invEq e ≡ f) ≃ (g ≡ f ∘ equivFun e)
equivAdjointEquivExtDomain {B} {C} =
EquivJ
(λ A e → (f : B → C) (g : A → C) → (g ∘ invEq e ≡ f) ≃ (g ≡ f ∘ equivFun e))
(λ f g → idEquiv (g ≡ f))
lineEquiv : ∀ {A B : I → Type ℓ} (f : (i : I) → A i → B i)
→ (is-equiv₀ : isEquiv (f i0))
→ (is-equiv₁ : isEquiv (f i1))
→ ∀ φ → A φ ≃ B φ
lineEquiv f is-equiv₀ is-equiv₁ φ = λ where
.fst → f φ
.snd → isProp→PathP (λ i → isPropIsEquiv (f i)) is-equiv₀ is-equiv₁ φ
secEquiv : (e : A ≃ B) → ∀ (φ : I) → B ≃ B
secEquiv {B} e = lineEquiv (λ φ b → secEq e b φ) (equivIsEquiv (invEquiv e ∙ₑ e)) (idIsEquiv B)
retEquiv : (e : A ≃ B) → ∀ (φ : I) → A ≃ A
retEquiv {A} e = lineEquiv (λ φ a → retEq e a φ) (equivIsEquiv (e ∙ₑ invEquiv e)) (idIsEquiv A)
equivΠDomain : ∀ {ℓ₀ ℓ₁ ℓB} {A₀ : Type ℓ₀} {A₁ : Type ℓ₁} {B : A₁ → Type ℓB}
→ (e : A₀ ≃ A₁)
→ ((a₁ : A₁) → B a₁) ≃ ((a₀ : A₀) → B (equivFun e a₀))
equivΠDomain e = isoToEquiv (domIsoDep (equivToIso e))
isSet→section-equivToIso : isSet A → isSet B → section (equivToIso {A = A} {B = B}) isoToEquiv
isSet→section-equivToIso set-A set-B = retIsEq {f = isoToEquiv} (isSet→isEquiv-isoToPath set-A set-B)