module GpdCont.Group.TwoCategory where open import GpdCont.Prelude open import GpdCont.Group.MapConjugator open import GpdCont.TwoCategory.Base open import GpdCont.TwoCategory.Isomorphism using (module LocalIso) import Cubical.Foundations.Path as Path open import Cubical.Categories.Category.Base open import Cubical.Algebra.Group.Base open import Cubical.Algebra.Group.Morphisms open import Cubical.Algebra.Group.MorphismProperties as GroupHom using (compGroupHom) module _ (ℓ : Level) where {-# INJECTIVE_FOR_INFERENCE isConjugator #-} {-# INJECTIVE_FOR_INFERENCE Group #-} private module _ (G : Group ℓ) where private open module G = GroupStr (str G) using (_·_) group-assoc-brace : ∀ {g h k l} → g · ((h · k) · l) ≡ (g · h) · (k · l) group-assoc-brace {g} {h} {k} {l} = sym (cong (g ·_) (G.·Assoc h k l)) ∙ G.·Assoc g h (k · l) hcompConjugator : ∀ {G H K : Group ℓ} {φ₁ φ₂ : GroupHom G H} {ψ₁ ψ₂ : GroupHom H K} → Conjugator φ₁ φ₂ → Conjugator ψ₁ ψ₂ → Conjugator (compGroupHom φ₁ ψ₁) (compGroupHom φ₂ ψ₂) hcompConjugator {H} {K} {φ₁ = φ₁*@(φ₁ , φ₁-hom)} {φ₂ = φ₂*@(φ₂ , φ₂-hom)} {ψ₁ = ψ₁*@(ψ₁ , ψ₁-hom)} {ψ₂ = ψ₂*@(ψ₂ , ψ₂-hom)} (h , h-conj) (k , k-conj) = comp-conj where open module K = GroupStr (str K) renaming (_·_ to _·ᴷ_) open module H = GroupStr (str H) renaming (_·_ to _·ᴴ_) _∙ₕ_ = compGroupHom h∙ₕk : ⟨ K ⟩ h∙ₕk = k K.· (ψ₂ h) abstract isConjugator-k∙ₕk : isConjugator (compGroupHom φ₁* ψ₁*) (compGroupHom φ₂* ψ₂*) h∙ₕk isConjugator-k∙ₕk g = ψ₁ (φ₁ g) ·ᴷ (k ·ᴷ ψ₂ h) ≡⟨ K.·Assoc _ _ _ ⟩ (ψ₁ (φ₁ g) ·ᴷ k) ·ᴷ ψ₂ h ≡⟨ cong (K._· ψ₂ h) (k-conj (φ₁ g)) ⟩ (k ·ᴷ ψ₂ (φ₁ g)) ·ᴷ ψ₂ h ≡⟨ sym $ K.·Assoc _ _ _ ⟩ k ·ᴷ (ψ₂ (φ₁ g) ·ᴷ ψ₂ h) ≡⟨ cong (k ·ᴷ_) $ sym $ ψ₂-hom .IsGroupHom.pres· (φ₁ g) h ⟩ k ·ᴷ (ψ₂ (φ₁ g ·ᴴ h)) ≡[ i ]⟨ k ·ᴷ (ψ₂ (h-conj g i)) ⟩ k ·ᴷ (ψ₂ (h ·ᴴ φ₂ g)) ≡⟨ cong (k ·ᴷ_) (ψ₂-hom .IsGroupHom.pres· h (φ₂ g)) ⟩ k ·ᴷ (ψ₂ h ·ᴷ ψ₂ (φ₂ g)) ≡⟨ K.·Assoc _ _ _ ⟩ (k ·ᴷ ψ₂ h) ·ᴷ ψ₂ (φ₂ g) ∎ comp-conj : Conjugator _ _ comp-conj .fst = h∙ₕk comp-conj .snd = isConjugator-k∙ₕk vinvConjugator : ∀ {G H : Group ℓ} {φ ψ : GroupHom G H} (h : Conjugator φ ψ) → Conjugator ψ φ vinvConjugator {H} {φ = (φ , _)} {ψ = (ψ , _)} (h , h-conj) = inv-conj where open module H = GroupStr (str H) inv-conj : Conjugator _ _ inv-conj .fst = inv h inv-conj .snd g = ψ g · inv h ≡⟨ sym (·IdL _) ∙ cong (_· (ψ g · inv h)) (sym $ ·InvL h) ⟩ (inv h · h) · (ψ g · inv h) ≡⟨ sym $ group-assoc-brace H ⟩ (inv h · (h · ψ g) · inv h) ≡[ i ]⟨ inv h · h-conj g (~ i) · (inv h) ⟩ (inv h · (φ g · h) · inv h) ≡⟨ group-assoc-brace H ⟩ (inv h · φ g) · (h · inv h) ≡[ i ]⟨ (inv h · φ g) · ·InvR h i ⟩ (inv h · φ g) · 1g ≡⟨ ·IdR _ ⟩ (inv h) · φ g ∎ twoGroupStr : TwoCategoryStr (Group ℓ) GroupHom Conjugator twoGroupStr .TwoCategoryStr.id-hom G = GroupHom.idGroupHom {G = G} twoGroupStr .TwoCategoryStr.comp-hom = GroupHom.compGroupHom twoGroupStr .TwoCategoryStr.id-rel = idConjugator twoGroupStr .TwoCategoryStr.trans = compConjugator twoGroupStr .TwoCategoryStr.comp-rel = hcompConjugator isTwoCategoryTwoGroupStr : IsTwoCategory (Group ℓ) GroupHom Conjugator twoGroupStr isTwoCategoryTwoGroupStr .IsTwoCategory.is-set-rel = isSetConjugator isTwoCategoryTwoGroupStr .IsTwoCategory.trans-assoc {y = H} h k l = Conjugator≡ $ sym $ str H .GroupStr.·Assoc _ _ _ isTwoCategoryTwoGroupStr .IsTwoCategory.trans-unit-left {y = H} h = Conjugator≡ $ str H .GroupStr.·IdL _ isTwoCategoryTwoGroupStr .IsTwoCategory.trans-unit-right {y = H} h = Conjugator≡ $ str H .GroupStr.·IdR _ isTwoCategoryTwoGroupStr .IsTwoCategory.comp-rel-id {y = H} {z = K} φ (ψ , ψ-hom) = Conjugator≡ $ sym goal where module H = GroupStr (str H) module K = GroupStr (str K) goal : K.1g K.· ψ H.1g ≡ K.1g goal = cong (K.1g K.·_) (ψ-hom .IsGroupHom.pres1) ∙ (K.·IdR K.1g) isTwoCategoryTwoGroupStr .IsTwoCategory.comp-rel-trans {y = H} {z = K} {g₂ = (ψ₂ , ψ₂-hom)} {g₃ = (ψ₃ , _)} (s , _) (t , _) (u , _) (v , v-conj) = Conjugator≡ goal where module H = GroupStr (str H) module K = GroupStr (str K) goal : (u K.· v) K.· (ψ₃ (s H.· t)) ≡ (u K.· (ψ₂ s)) K.· (v K.· (ψ₃ t)) goal = (u K.· v) K.· (ψ₃ (s H.· t)) ≡⟨ sym (K.·Assoc _ _ _) ⟩ u K.· (v K.· (ψ₃ (s H.· t))) ≡[ i ]⟨ u K.· v-conj (s H.· t) (~ i) ⟩ u K.· (ψ₂ (s H.· t)) K.· v ≡[ i ]⟨ u K.· ψ₂-hom .IsGroupHom.pres· s t i K.· v ⟩ u K.· ((ψ₂ s) K.· ψ₂ t) K.· v ≡⟨ group-assoc-brace K ⟩ (u K.· (ψ₂ s)) K.· (ψ₂ t K.· v) ≡[ i ]⟨ (u K.· (ψ₂ s)) K.· v-conj t i ⟩ (u K.· (ψ₂ s)) K.· (v K.· (ψ₃ t)) ∎ isTwoCategoryTwoGroupStr .IsTwoCategory.comp-hom-assoc = GroupHom.compGroupHomAssoc isTwoCategoryTwoGroupStr .IsTwoCategory.comp-hom-unit-left _ = GroupHom.GroupHom≡ refl isTwoCategoryTwoGroupStr .IsTwoCategory.comp-hom-unit-right = GroupHom.compGroupHomId isTwoCategoryTwoGroupStr .IsTwoCategory.comp-rel-assoc {z = K} {w = L} {g₂ = ψ₂ , _} {k₂ = ρ₂ , ρ₂-hom} (s , _) (t , _) (u , _) = ConjugatorPathP goal where module K = GroupStr (str K) module L = GroupStr (str L) goal : u L.· (ρ₂ (t K.· ψ₂ s)) ≡ (u L.· ρ₂ t) L.· (ρ₂ (ψ₂ s)) goal = u L.· (ρ₂ (t K.· ψ₂ s)) ≡⟨ cong (u L.·_) (ρ₂-hom .IsGroupHom.pres· _ _) ⟩ u L.· (ρ₂ t) L.· (ρ₂ (ψ₂ s)) ≡⟨ L.·Assoc u (ρ₂ t) (ρ₂ (ψ₂ s)) ⟩ (u L.· ρ₂ t) L.· (ρ₂ (ψ₂ s)) ∎ isTwoCategoryTwoGroupStr .IsTwoCategory.comp-rel-unit-left {x = G} {y = H} {g = ψ , ψ-hom} (s , s-conj) = ConjugatorPathP goal where module G = GroupStr (str G) module H = GroupStr (str H) goal : s H.· ψ G.1g ≡ s goal = cong (s H.·_) (ψ-hom .IsGroupHom.pres1) ∙ H.·IdR s isTwoCategoryTwoGroupStr .IsTwoCategory.comp-rel-unit-right {y = H} {f = φ , _} (r , r-conj) = ConjugatorPathP goal where module H = GroupStr (str H) goal : H.1g H.· r ≡ r goal = H.·IdL r TwoGroup : TwoCategory (ℓ-suc ℓ) ℓ ℓ TwoGroup .TwoCategory.ob = Group ℓ TwoGroup .TwoCategory.hom = GroupHom TwoGroup .TwoCategory.rel = Conjugator TwoGroup .TwoCategory.two-category-structure = twoGroupStr TwoGroup .TwoCategory.is-two-category = isTwoCategoryTwoGroupStr open LocalIso using (isLocallyGroupoidal ; isLocalInverse) isLocallyGroupoidalTwoGroup : isLocallyGroupoidal TwoGroup isLocallyGroupoidalTwoGroup h .fst = vinvConjugator h isLocallyGroupoidalTwoGroup {y = H} (h , _) .snd = is-inv where module H = GroupStr (str H) open isLocalInverse is-inv : isLocalInverse TwoGroup _ _ is-inv .dom-id = Conjugator≡ (H.·InvR h) is-inv .codom-id = Conjugator≡ (H.·InvL h)