module GpdCont.TwoCategory.TwoDiscrete where
open import GpdCont.Prelude
open import GpdCont.TwoCategory.Base
open import GpdCont.TwoCategory.Univalent
open import GpdCont.TwoCategory.LocalCategory
import Cubical.Foundations.GroupoidLaws as GL
open import Cubical.WildCat.Base using (WildCat ; _[_,_])
module _ {ℓo ℓh} (C : WildCat ℓo ℓh) (isGroupoidHom : (x y : WildCat.ob C) → isGroupoid (C [ x , y ])) where
private
module C = WildCat C
variable
x y z w : C.ob
f f₁ f₂ f₃ : C.Hom[ x , y ]
g g₁ g₂ g₃ : C.Hom[ y , z ]
k k₁ k₂ k₃ : C.Hom[ z , w ]
_∙ₕ_ :
f₁ ≡ f₂
→ g₁ ≡ g₂
→ f₁ C.⋆ g₁ ≡ f₂ C.⋆ g₂
_∙ₕ_ p q = cong₂ C._⋆_ p q
∙ₕ-interchange :
∀ (f₁≡f₂ : f₁ ≡ f₂)
→ (f₂≡f₃ : f₂ ≡ f₃)
→ (g₁≡g₂ : g₁ ≡ g₂)
→ (g₂≡g₃ : g₂ ≡ g₃)
→ (f₁≡f₂ ∙ f₂≡f₃) ∙ₕ (g₁≡g₂ ∙ g₂≡g₃) ≡ (f₁≡f₂ ∙ₕ g₁≡g₂) ∙ (f₂≡f₃ ∙ₕ g₂≡g₃)
∙ₕ-interchange = cong₂-∙ C._⋆_
∙ₕ-assoc :
∀ (f₁≡f₂ : f₁ ≡ f₂)
→ (g₁≡g₂ : g₁ ≡ g₂)
→ (k₁≡k₂ : k₁ ≡ k₂)
→ PathP (λ j → C.⋆Assoc f₁ g₁ k₁ j ≡ C.⋆Assoc f₂ g₂ k₂ j) ((f₁≡f₂ ∙ₕ g₁≡g₂) ∙ₕ k₁≡k₂) (f₁≡f₂ ∙ₕ (g₁≡g₂ ∙ₕ k₁≡k₂))
∙ₕ-assoc {f₁} {f₂} {g₁} {g₂} {k₁} {k₂} f₁≡f₂ g₁≡g₂ k₁≡k₂ = assoc' where
assoc' : Square ((f₁≡f₂ ∙ₕ g₁≡g₂) ∙ₕ k₁≡k₂) (f₁≡f₂ ∙ₕ (g₁≡g₂ ∙ₕ k₁≡k₂)) (C.⋆Assoc f₁ g₁ k₁) (C.⋆Assoc f₂ g₂ k₂)
assoc' j i = C.⋆Assoc (f₁≡f₂ i) (g₁≡g₂ i) (k₁≡k₂ i) j
∙ₕ-lUnit : ∀ (p : f ≡ g) → PathP (λ j → C.⋆IdL f j ≡ C.⋆IdL g j) (refl ∙ₕ p) p
∙ₕ-lUnit p j i = C.⋆IdL (p i) j
∙ₕ-rUnit : ∀ (p : f ≡ g) → PathP (λ j → C.⋆IdR f j ≡ C.⋆IdR g j) (p ∙ₕ refl) p
∙ₕ-rUnit p j i = C.⋆IdR (p i) j
twoDiscreteStr : TwoCategoryStr C.ob C.Hom[_,_] _≡_
twoDiscreteStr .TwoCategoryStr.id-hom x = C.id {x}
twoDiscreteStr .TwoCategoryStr.comp-hom = C._⋆_
twoDiscreteStr .TwoCategoryStr.id-rel f = refl′ f
twoDiscreteStr .TwoCategoryStr.trans = _∙_
twoDiscreteStr .TwoCategoryStr.comp-rel = _∙ₕ_
isTwoCategoryTwoDiscreteStr : IsTwoCategory _ _ _ twoDiscreteStr
isTwoCategoryTwoDiscreteStr .IsTwoCategory.is-set-rel {x} {y} = isGroupoidHom x y
isTwoCategoryTwoDiscreteStr .IsTwoCategory.trans-assoc f≡g g≡h h≡k = sym $ GL.assoc f≡g g≡h h≡k
isTwoCategoryTwoDiscreteStr .IsTwoCategory.trans-unit-left f≡g = sym $ GL.lUnit f≡g
isTwoCategoryTwoDiscreteStr .IsTwoCategory.trans-unit-right f≡g = sym $ GL.rUnit f≡g
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-rel-id f g = λ i j → f C.⋆ g
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-rel-trans = ∙ₕ-interchange
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-hom-assoc = C.⋆Assoc
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-hom-unit-left = C.⋆IdL
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-hom-unit-right = C.⋆IdR
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-rel-assoc = ∙ₕ-assoc
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-rel-unit-left = ∙ₕ-lUnit
isTwoCategoryTwoDiscreteStr .IsTwoCategory.comp-rel-unit-right = ∙ₕ-rUnit
TwoDiscrete : TwoCategory ℓo ℓh ℓh
TwoDiscrete .TwoCategory.ob = C.ob
TwoDiscrete .TwoCategory.hom = C.Hom[_,_]
TwoDiscrete .TwoCategory.rel = _≡_
TwoDiscrete .TwoCategory.two-category-structure = twoDiscreteStr
TwoDiscrete .TwoCategory.is-two-category = isTwoCategoryTwoDiscreteStr
isLocallyUnivalentTwoDiscrete : isLocallyUnivalent TwoDiscrete
isLocallyUnivalentTwoDiscrete x y = is-univ where
open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Equiv
open import Cubical.Data.Sigma
open import Cubical.Categories.Category.Base
x≡y : Category _ _
x≡y = LocalCategory TwoDiscrete x y
pathToIso′ : ∀ {f₁ f₂} (p : f₁ ≡ f₂) → CatIso x≡y f₁ f₂
pathToIso′ p = p , isiso (sym p) (GL.lCancel p) (GL.rCancel p)
coh : ∀ f₁ f₂ → pathToIso′ {f₁} {f₂} ≡ pathToIso
coh f₁ f₂ = funExt (J (λ f₂ (p : f₁ ≡ f₂) → pathToIso′ p ≡ pathToIso p) (sym pathToIso-refl))
isEquivPathToIso′ : ∀ f₁ f₂ → isEquiv (pathToIso′ {f₁} {f₂})
isEquivPathToIso′ f₁ f₂ = isoToIsEquiv (iso pathToIso′ fst (λ { (p , is-iso) → Σ≡Prop (λ _ → isPropIsIso _) refl }) λ _ → refl)
is-univ : isUnivalent _
is-univ .isUnivalent.univ f₁ f₂ = subst isEquiv (coh f₁ f₂) (isEquivPathToIso′ f₁ f₂)