module GpdCont.TwoCategory.Isomorphism where open import GpdCont.Prelude open import GpdCont.TwoCategory.Base open import GpdCont.TwoCategory.LocalCategory open import Cubical.Foundations.HLevels open import Cubical.Data.Sigma.Properties open import Cubical.Categories.Category.Base using (isIso) private variable ℓo ℓh ℓr : Level module Isomorphism (C : TwoCategory ℓo ℓh ℓr) where private module C = TwoCategory C variable x y : C.ob f : C.hom x y g : C.hom y x r : C.rel f g s : C.rel g f record Inverse (f : C.hom x y) (g : C.hom y x) : Type ℓh where field dom-id : f C.∙₁ g ≡ C.id-hom x codom-id : g C.∙₁ f ≡ C.id-hom y IsomorphismStr : (f : C.hom x y) → Type ℓh IsomorphismStr f = Σ[ g ∈ C.hom _ _ ] Inverse f g Isomorphism : (x y : C.ob) → Type ℓh Isomorphism x y = Σ[ f ∈ C.hom x y ] IsomorphismStr f module LocalIso (C : TwoCategory ℓo ℓh ℓr) where private module C = TwoCategory C variable x y : C.ob f : C.hom x y g : C.hom y x r : C.rel f g s : C.rel g f record isLocalInverse {f g : C.hom x y} (r : C.rel f g) (s : C.rel g f) : Type ℓr where field dom-id : r C.∙ᵥ s ≡ C.id-rel f codom-id : s C.∙ᵥ r ≡ C.id-rel g unquoteDecl isLocalInverse-Iso-Σ = declareRecordIsoΣ isLocalInverse-Iso-Σ (quote isLocalInverse) instance isLocalIsoToΣ : RecordToΣ (isLocalInverse r s) isLocalIsoToΣ = toΣ isLocalInverse-Iso-Σ isPropIsLocalInverse : isProp (isLocalInverse r s) isPropIsLocalInverse = recordIsOfHLevel 1 (isProp× (C.is-set-rel _ _ _ _) (C.is-set-rel _ _ _ _)) hasLocalInverse : (r : C.rel f g) → Type ℓr hasLocalInverse r = Σ[ s ∈ C.rel _ _ ] isLocalInverse r s isPropHasLocalInverse : isProp (hasLocalInverse r) isPropHasLocalInverse {r} (s , s-inv) (s′ , s′-inv) = goal where open C s≡s′ : s ≡ s′ s≡s′ = s ≡⟨ sym $ trans-unit-left s ⟩ id-rel _ ∙ᵥ s ≡⟨ sym $ cong (_∙ᵥ s) (s′-inv .isLocalInverse.codom-id) ⟩ (s′ ∙ᵥ r) ∙ᵥ s ≡⟨ trans-assoc _ _ _ ⟩ s′ ∙ᵥ (r ∙ᵥ s) ≡⟨ cong (s′ ∙ᵥ_) (s-inv .isLocalInverse.dom-id) ⟩ s′ ∙ᵥ id-rel _ ≡⟨ trans-unit-right s′ ⟩ s′ ∎ goal : (s , s-inv) ≡ (s′ , s′-inv) goal = Σ≡Prop (λ _ → isPropIsLocalInverse) s≡s′ LocalIso : (f g : C.hom x y) → Type ℓr LocalIso f g = Σ[ r ∈ C.rel f g ] hasLocalInverse r isLocallyGroupoidal : Type (ℓ-max ℓo (ℓ-max ℓh ℓr)) isLocallyGroupoidal = ∀ {x y : C.ob} {f g : C.hom x y} (r : C.rel f g) → hasLocalInverse r isLocallyGroupoidal→isLocalCategoryIso : isLocallyGroupoidal → ∀ {x y} {f g : C.hom x y} (r : C.rel f g) → isIso (LocalCategory C x y) r isLocallyGroupoidal→isLocalCategoryIso inverses r .isIso.inv = inverses r .fst isLocallyGroupoidal→isLocalCategoryIso inverses r .isIso.sec = inverses r .snd .isLocalInverse.codom-id isLocallyGroupoidal→isLocalCategoryIso inverses r .isIso.ret = inverses r .snd .isLocalInverse.dom-id isPropIsLocallyGroupoidal : isProp isLocallyGroupoidal isPropIsLocallyGroupoidal = isPropImplicitΠ4 λ _ _ _ _ → isPropΠ λ _ → isPropHasLocalInverse