Quasiinverses¶
Two functions are quasi-inverses if we can construct a function
providing (g ∘ f) x = x
and (f ∘ g) y = y
for any given x
and y
.
{-# OPTIONS --without-K --exact-split #-}
open import TransportLemmas
open import EquivalenceType
open import HomotopyType
open import HomotopyLemmas
open import HalfAdjointType
module QuasiinverseType {ℓ₁ ℓ₂ : Level} {A : Type ℓ₁}{B : Type ℓ₂} where
qinv
: (A → B)
→ Type (ℓ₁ ⊔ ℓ₂)
qinv f = Σ (B → A) (λ g → ((f ∘ g) ∼ id) × ((g ∘ f) ∼ id))
quasiinverse = qinv
linv
: (A → B)
→ Type (ℓ₁ ⊔ ℓ₂)
linv f = Σ (B → A) (λ g → (g ∘ f) ∼ id-on A)
left-inverse = linv
rinv
: (A → B)
→ Type (ℓ₁ ⊔ ℓ₂)
rinv f = Σ (B → A) (λ g → (f ∘ g) ∼ id-on B)
right-inverse = rinv
Biinverse is another equivalent notion of the right equivalence for HoTT.
biinv : (A → B) → Type (ℓ₁ ⊔ ℓ₂)
biinv f = linv f × rinv f
biinverse = biinv
bi-inverse = biinv
A desire consequence (qinv → biinv):
qinv-biinv : (f : A → B) → qinv f → biinv f
qinv-biinv f (g , (u1 , u2)) = (g , u2) , (g , u1)
biinv-qinv
: (f : A → B)
→ biinv f → qinv f
biinv-qinv f ((h , α) , (g , β)) = g , (β , δ)
where
γ1 : g ∼ ((h ∘ f) ∘ g)
γ1 = rcomp-∼ g (h-sym (h ∘ f) id α)
γ2 : ((h ∘ f) ∘ g) ∼ (h ∘ (f ∘ g))
γ2 x = idp
γ : g ∼ h
γ = γ1 ● (γ2 ● (lcomp-∼ h β))
δ : (g ∘ f) ∼ id
δ = (rcomp-∼ f γ) ● α
equiv-biinv
: (f : A → B)
→ isContrMap f
--------------
→ biinv f
equiv-biinv f contrf =
(remap eq , rlmap-inverse-h eq) , (remap eq , lrmap-inverse-h eq)
where
eq : A ≃ B
eq = f , contrf
qinv-ishae
: {f : A → B}
→ qinv f
---------
→ ishae f
qinv-ishae {f} (g , (ε , η)) = record {
g = g ;
η = η ;
ε = λ b → inv (ε (f (g b))) · ap f (η (g b)) · ε b ;
τ = τ
}
where
aux-lemma : (a : A) → ap f (η (g (f a))) · ε (f a) == ε (f (g (f a))) · ap f (η a)
aux-lemma a =
begin
ap f (η ((g ∘ f) a)) · ε (f a)
==⟨ ap (λ u → ap f u · ε (f a)) (h-naturality-id η) ⟩
ap f (ap (g ∘ f) (η a)) · ε (f a)
==⟨ ap (_· ε (f a)) (ap-comp (g ∘ f) f (η a)) ⟩
ap (f ∘ (g ∘ f)) (η a) · ε (f a)
==⟨ inv (h-naturality (λ x → ε (f x)) (η a)) ⟩
ε (f (g (f a))) · ap f (η a)
∎
τ : (a : A) → ap f (η a) == (inv (ε (f (g (f a)))) · ap f (η (g (f a))) · ε (f a))
τ a =
begin
ap f (η a)
==⟨ ap (_· ap f (η a)) (inv (·-linv (ε (f (g (f a)))))) ⟩
inv (ε (f (g (f a)))) · ε (f (g (f a))) · ap f (η a)
==⟨ ·-assoc (inv (ε (f (g (f a))))) _ (ap f (η a)) ⟩
inv (ε (f (g (f a)))) · (ε (f (g (f a))) · ap f (η a))
==⟨ ap (inv (ε (f (g (f a)))) ·_) (inv (aux-lemma a)) ⟩
inv (ε (f (g (f a)))) · (ap f (η (g (f a))) · ε (f a))
==⟨ inv (·-assoc (inv (ε (f (g (f a))))) _ (ε (f a))) ⟩
inv (ε (f (g (f a)))) · ap f (η (g (f a))) · ε (f a)
∎
Quasiinverses create equivalences.
qinv-≃
: (f : A → B)
→ qinv f
-------------
→ A ≃ B
qinv-≃ f = ishae-≃ ∘ qinv-ishae
quasiinverse-to-≃ = qinv-≃
≃-qinv
: A ≃ B
----------------
→ Σ (A → B) qinv
≃-qinv eq =
lemap eq , (remap eq , (lrmap-inverse-h eq , rlmap-inverse-h eq))
≃-to-quasiinverse = ≃-qinv
Half-adjoint equivalences are quasiinverses.
ishae-qinv
: {f : A → B}
→ ishae f
---------
→ qinv f
ishae-qinv {f} (hae g η ε τ) = g , (ε , η)
≃-ishae
: (e : A ≃ B)
--------------
→ ishae (e ∙→)
≃-ishae e = qinv-ishae (π₂ (≃-qinv e))