{-# OPTIONS --without-K #-} module hott.equivalence.biinvertible where open import sum open import equality open import function.core open import function.isomorphism.core open import function.isomorphism.utils open import function.overloading open import function.extensionality open import hott.level.core open import hott.level.closure open import hott.equivalence.core open import hott.equivalence.alternative open import sets.unit module _ {i j}{X : Set i}{Y : Set j} where InvL : (X → Y) → Set _ InvL f = Σ (Y → X) λ g → (x : X) → g (f x) ≡ x InvR : (X → Y) → Set _ InvR f = Σ (Y → X) λ g → (y : Y) → f (g y) ≡ y BiInv : (X → Y) → Set _ BiInv f = InvL f × InvR f _≈₂_ : ∀ {i j} → Set i → Set j → Set _ X ≈₂ Y = Σ (X → Y) BiInv module _ {i j}{X : Set i}{Y : Set j} where ≅⇒b : X ≅ Y → X ≈₂ Y ≅⇒b f = apply f , (invert f , _≅_.iso₁ f) , (invert f , _≅_.iso₂ f) b⇒≅ : X ≈₂ Y → X ≅ Y b⇒≅ (f , (g , α) , (h , β)) = record { to = f ; from = g ; iso₁ = α ; iso₂ = λ y → sym (ap (f ∘' g) (β y)) · ap f (α (h y)) · β y } module _ (isom : X ≅ Y) where private f : X → Y f = apply isom φ : ∀ {k} (Z : Set k) → (X → Z) ≅ (Y → Z) φ Z = record { to = λ u → u ∘ invert isom ; from = λ v → v ∘ f ; iso₁ = λ u → funext λ x → ap u (_≅_.iso₁ isom x) ; iso₂ = λ v → funext λ y → ap v (_≅_.iso₂ isom y) } invl-level : contr (InvL f) invl-level = iso-level (Σ-ap-iso refl≅ λ g → sym≅ strong-funext-iso) (proj₂ (≅⇒≈ (sym≅ (φ X))) id) private ψ : ∀ {k} (Z : Set k) → (Z → X) ≅ (Z → Y) ψ Z = record { to = λ u → f ∘ u ; from = λ v → invert isom ∘ v ; iso₁ = λ u → funext λ x → _≅_.iso₁ isom (u x) ; iso₂ = λ v → funext λ y → _≅_.iso₂ isom (v y) } invr-level : contr (InvR f) invr-level = iso-level (Σ-ap-iso refl≅ λ h → sym≅ strong-funext-iso) (proj₂ (≅⇒≈ (ψ Y)) id) BiInv-level : (f : X → Y) → h 1 (BiInv f) BiInv-level f b₁ b₂ = h↑ (×-contr (invl-level isom) (invr-level isom)) b₁ b₂ where isom : X ≅ Y isom = b⇒≅ (f , b₁) b⇔≈ : (X ≈₂ Y) ≅ (X ≈ Y) b⇔≈ = record { to = λ b → ≅⇒≈ (b⇒≅ b) ; from = λ φ → (≅⇒b (≈⇒≅ φ)) ; iso₁ = λ { (f , b) → ap (λ b → f , b) (h1⇒prop (BiInv-level f) _ _) } ; iso₂ = λ { (f , e) → ap (λ e → f , e) (h1⇒prop (weak-equiv-h1 f) _ _) } }