module GpdCont.TwoCategory.Displayed.Base where open import GpdCont.Prelude open import GpdCont.TwoCategory.Base open import GpdCont.TwoCategory.LaxFunctor open import GpdCont.TwoCategory.StrictFunctor open import Cubical.Foundations.HLevels open import Cubical.Data.Sigma using (Σ≡Prop) module _ {ℓo ℓh ℓr} (C : TwoCategory ℓo ℓh ℓr) (ℓoᴰ ℓhᴰ ℓrᴰ : Level) where private ℓC = ℓ-of C ℓCᴰ : Level ℓCᴰ = ℓMax ℓoᴰ ℓhᴰ ℓrᴰ module C = TwoCategory C module _ (ob[_] : C.ob → Type ℓoᴰ) (hom[_] : {x y : C.ob} (f : C.hom x y) (xᴰ : ob[ x ]) (yᴰ : ob[ y ]) → Type ℓhᴰ) (rel[_] : {x y : C.ob} {f g : C.hom x y} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → (s : C.rel f g) → (fᴰ : hom[ f ] xᴰ yᴰ) → (gᴰ : hom[ g ] xᴰ yᴰ) → Type ℓrᴰ) where open C record TwoCategoryStrᴰ : Type (ℓ-max ℓC ℓCᴰ) where no-eta-equality field id-homᴰ : ∀ {x} (xᴰ : ob[ x ]) → hom[ id-hom x ] xᴰ xᴰ comp-homᴰ : ∀ {x y z} {f : hom x y} {g : hom y z} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} {zᴰ : ob[ z ]} → (fᴰ : hom[ f ] xᴰ yᴰ) → (gᴰ : hom[ g ] yᴰ zᴰ) → hom[ comp-hom f g ] xᴰ zᴰ field id-relᴰ : ∀ {x y} {f : hom x y} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → (fᴰ : hom[ f ] xᴰ yᴰ) → rel[ id-rel f ] fᴰ fᴰ transᴰ : ∀ {x y} → {f g h : hom x y} → {r : rel f g} → {s : rel g h} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → {fᴰ : hom[ f ] xᴰ yᴰ} → {gᴰ : hom[ g ] xᴰ yᴰ} → {hᴰ : hom[ h ] xᴰ yᴰ} → (rᴰ : rel[ r ] fᴰ gᴰ) → (sᴰ : rel[ s ] gᴰ hᴰ) → rel[ trans r s ] fᴰ hᴰ comp-relᴰ : ∀ {x y z} → {f₁ f₂ : hom x y} → {g₁ g₂ : hom y z} → {r : rel f₁ f₂} → {s : rel g₁ g₂} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} {zᴰ : ob[ z ]} → {f₁ᴰ : hom[ f₁ ] xᴰ yᴰ} → {f₂ᴰ : hom[ f₂ ] xᴰ yᴰ} → {g₁ᴰ : hom[ g₁ ] yᴰ zᴰ} → {g₂ᴰ : hom[ g₂ ] yᴰ zᴰ} → (rᴰ : rel[ r ] f₁ᴰ f₂ᴰ) → (sᴰ : rel[ s ] g₁ᴰ g₂ᴰ) → rel[ comp-rel r s ] (comp-homᴰ f₁ᴰ g₁ᴰ) (comp-homᴰ f₂ᴰ g₂ᴰ) _∙₁ᴰ_ = comp-homᴰ _∙ᵥᴰ_ = transᴰ _∙ₕᴰ_ = comp-relᴰ record IsTwoCategoryᴰ (sᴰ : TwoCategoryStrᴰ) : Type (ℓ-max ℓC ℓCᴰ) where no-eta-equality private open module sᴰ = TwoCategoryStrᴰ sᴰ field is-set-relᴰ : {x y : ob} {f g : hom x y} {s : rel f g} → {xᴰ : ob[ x ]} → {yᴰ : ob[ y ]} → (fᴰ : hom[ f ] xᴰ yᴰ) → (gᴰ : hom[ g ] xᴰ yᴰ) → isSet (rel[ s ] fᴰ gᴰ) field trans-assocᴰ : {x y : ob} → {f g h k : hom x y} → {r : rel f g} → {s : rel g h} → {t : rel h k} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → {fᴰ : hom[ f ] xᴰ yᴰ} → {gᴰ : hom[ g ] xᴰ yᴰ} → {hᴰ : hom[ h ] xᴰ yᴰ} → {kᴰ : hom[ k ] xᴰ yᴰ} → (rᴰ : rel[ r ] fᴰ gᴰ) → (sᴰ : rel[ s ] gᴰ hᴰ) → (tᴰ : rel[ t ] hᴰ kᴰ) → PathP (λ i → rel[ trans-assoc r s t i ] fᴰ kᴰ) ((rᴰ ∙ᵥᴰ sᴰ) ∙ᵥᴰ tᴰ) (rᴰ ∙ᵥᴰ (sᴰ ∙ᵥᴰ tᴰ)) trans-unit-leftᴰ : {x y : ob} → {f g : hom x y} → {s : rel f g} → {xᴰ : ob[ x ]} → {yᴰ : ob[ y ]} → {fᴰ : hom[ f ] xᴰ yᴰ} → {gᴰ : hom[ g ] xᴰ yᴰ} → (sᴰ : rel[ s ] fᴰ gᴰ) → PathP (λ i → rel[ trans-unit-left s i ] fᴰ gᴰ) (id-relᴰ fᴰ ∙ᵥᴰ sᴰ) sᴰ trans-unit-rightᴰ : {x y : ob} → {f g : hom x y} → {r : rel f g} → {xᴰ : ob[ x ]} → {yᴰ : ob[ y ]} → {fᴰ : hom[ f ] xᴰ yᴰ} → {gᴰ : hom[ g ] xᴰ yᴰ} → (rᴰ : rel[ r ] fᴰ gᴰ) → PathP (λ i → rel[ trans-unit-right r i ] fᴰ gᴰ) (rᴰ ∙ᵥᴰ id-relᴰ gᴰ) rᴰ field comp-rel-idᴰ : {x y z : ob} {f : hom x y} {g : hom y z} → {xᴰ : ob[ x ]} → {yᴰ : ob[ y ]} → {zᴰ : ob[ z ]} → (fᴰ : hom[ f ] xᴰ yᴰ) → (gᴰ : hom[ g ] yᴰ zᴰ) → PathP (λ i → rel[ comp-rel-id f g i ] (fᴰ ∙₁ᴰ gᴰ) (fᴰ ∙₁ᴰ gᴰ)) (id-relᴰ (fᴰ ∙₁ᴰ gᴰ)) (id-relᴰ fᴰ ∙ₕᴰ id-relᴰ gᴰ) comp-rel-transᴰ : {x y z : ob} {f₁ f₂ f₃ : hom x y} {g₁ g₂ g₃ : hom y z} → {s : rel f₁ f₂} {t : rel f₂ f₃} {u : rel g₁ g₂} {v : rel g₂ g₃} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} {zᴰ : ob[ z ]} → {f₁ᴰ : hom[ f₁ ] xᴰ yᴰ} → {f₂ᴰ : hom[ f₂ ] xᴰ yᴰ} → {f₃ᴰ : hom[ f₃ ] xᴰ yᴰ} → {g₁ᴰ : hom[ g₁ ] yᴰ zᴰ} → {g₂ᴰ : hom[ g₂ ] yᴰ zᴰ} → {g₃ᴰ : hom[ g₃ ] yᴰ zᴰ} → (sᴰ : rel[ s ] f₁ᴰ f₂ᴰ) → (tᴰ : rel[ t ] f₂ᴰ f₃ᴰ) → (uᴰ : rel[ u ] g₁ᴰ g₂ᴰ) → (vᴰ : rel[ v ] g₂ᴰ g₃ᴰ) → PathP (λ i → rel[ comp-rel-trans s t u v i ] (f₁ᴰ ∙₁ᴰ g₁ᴰ) (f₃ᴰ ∙₁ᴰ g₃ᴰ)) ((sᴰ ∙ᵥᴰ tᴰ) ∙ₕᴰ (uᴰ ∙ᵥᴰ vᴰ)) ((sᴰ ∙ₕᴰ uᴰ) ∙ᵥᴰ (tᴰ ∙ₕᴰ vᴰ)) field comp-hom-assocᴰ : {x y z w : ob} {f : hom x y} {g : hom y z} {h : hom z w} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} {zᴰ : ob[ z ]} {wᴰ : ob[ w ]} → (fᴰ : hom[ f ] xᴰ yᴰ) → (gᴰ : hom[ g ] yᴰ zᴰ) → (hᴰ : hom[ h ] zᴰ wᴰ) → PathP (λ i → hom[ C.comp-hom-assoc f g h i ] xᴰ wᴰ) ((fᴰ ∙₁ᴰ gᴰ) ∙₁ᴰ hᴰ) (fᴰ ∙₁ᴰ (gᴰ ∙₁ᴰ hᴰ)) comp-hom-unit-leftᴰ : {x y : C.ob} {g : C.hom x y} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → (gᴰ : hom[ g ] xᴰ yᴰ) → PathP (λ i → hom[ C.comp-hom-unit-left g i ] xᴰ yᴰ) (id-homᴰ xᴰ ∙₁ᴰ gᴰ) gᴰ comp-hom-unit-rightᴰ : {x y : C.ob} {f : C.hom x y} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → (fᴰ : hom[ f ] xᴰ yᴰ) → PathP (λ i → hom[ C.comp-hom-unit-right f i ] xᴰ yᴰ) (fᴰ ∙₁ᴰ id-homᴰ yᴰ) fᴰ field comp-rel-assocᴰ : {x y z w : ob} {f₁ f₂ : hom x y} {g₁ g₂ : hom y z} {k₁ k₂ : hom z w} → {s : rel f₁ f₂} {t : rel g₁ g₂} {u : rel k₁ k₂} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} {zᴰ : ob[ z ]} {wᴰ : ob[ w ]} → {f₁ᴰ : hom[ f₁ ] xᴰ yᴰ} → {f₂ᴰ : hom[ f₂ ] xᴰ yᴰ} → {g₁ᴰ : hom[ g₁ ] yᴰ zᴰ} → {g₂ᴰ : hom[ g₂ ] yᴰ zᴰ} → {k₁ᴰ : hom[ k₁ ] zᴰ wᴰ} → {k₂ᴰ : hom[ k₂ ] zᴰ wᴰ} → (sᴰ : rel[ s ] f₁ᴰ f₂ᴰ) → (tᴰ : rel[ t ] g₁ᴰ g₂ᴰ) → (uᴰ : rel[ u ] k₁ᴰ k₂ᴰ) → PathP (λ i → rel[ comp-rel-assoc s t u i ] (comp-hom-assocᴰ f₁ᴰ g₁ᴰ k₁ᴰ i) (comp-hom-assocᴰ f₂ᴰ g₂ᴰ k₂ᴰ i)) ((sᴰ ∙ₕᴰ tᴰ) ∙ₕᴰ uᴰ) (sᴰ ∙ₕᴰ (tᴰ ∙ₕᴰ uᴰ)) comp-rel-unit-leftᴰ : {x y : ob} {f g : hom x y} {s : rel f g} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → {fᴰ : hom[ f ] xᴰ yᴰ} → {gᴰ : hom[ g ] xᴰ yᴰ} → (sᴰ : rel[ s ] fᴰ gᴰ) → PathP (λ i → rel[ comp-rel-unit-left s i ] (comp-hom-unit-leftᴰ fᴰ i) (comp-hom-unit-leftᴰ gᴰ i)) (id-relᴰ (id-homᴰ xᴰ) ∙ₕᴰ sᴰ) sᴰ comp-rel-unit-rightᴰ : {x y : ob} {f g : hom x y} {r : rel f g} → {xᴰ : ob[ x ]} {yᴰ : ob[ y ]} → {fᴰ : hom[ f ] xᴰ yᴰ} → {gᴰ : hom[ g ] xᴰ yᴰ} → (rᴰ : rel[ r ] fᴰ gᴰ) → PathP (λ i → rel[ comp-rel-unit-right r i ] (comp-hom-unit-rightᴰ fᴰ i) (comp-hom-unit-rightᴰ gᴰ i)) (rᴰ ∙ₕᴰ id-relᴰ (id-homᴰ yᴰ)) rᴰ record TwoCategoryᴰ : Type (ℓ-max ℓC (ℓ-suc ℓCᴰ)) where no-eta-equality field ob[_] : C.ob → Type ℓoᴰ hom[_] : {x y : C.ob} (f : C.hom x y) (xᴰ : ob[ x ]) (yᴰ : ob[ y ]) → Type ℓhᴰ rel[_] : {x y : C.ob} {f g : C.hom x y} → {xᴰ : ob[ x ]} → {yᴰ : ob[ y ]} → (s : C.rel f g) → (fᴰ : hom[ f ] xᴰ yᴰ) → (gᴰ : hom[ g ] xᴰ yᴰ) → Type ℓrᴰ field two-category-structureᴰ : TwoCategoryStrᴰ ob[_] hom[_] rel[_] is-two-categoryᴰ : IsTwoCategoryᴰ ob[_] hom[_] rel[_] two-category-structureᴰ open TwoCategoryStrᴰ two-category-structureᴰ public open IsTwoCategoryᴰ is-two-categoryᴰ public module TotalTwoCategory {ℓo ℓh ℓr} (C : TwoCategory ℓo ℓh ℓr) {ℓoᴰ ℓhᴰ ℓrᴰ : Level} (Cᴰ : TwoCategoryᴰ C ℓoᴰ ℓhᴰ ℓrᴰ) where private open module C = TwoCategory C open module Cᴰ = TwoCategoryᴰ Cᴰ ∫₀ : Type _ ∫₀ = Σ ob ob[_] ∫₁ : (x y : ∫₀) → Type _ ∫₁ (x , xᴰ) (y , yᴰ) = Σ[ f ∈ hom x y ] hom[ f ] xᴰ yᴰ ∫₂ : {x y : ∫₀} (f g : ∫₁ x y) → Type _ ∫₂ (f , fᴰ) (g , gᴰ) = Σ[ r ∈ rel f g ] rel[ r ] fᴰ gᴰ ∫₁≡ : {x y : ∫₀} {f g : ∫₁ x y} → (p : f .fst ≡ g .fst) → (pᴰ : PathP (λ i → hom[ p i ] (x .snd) (y .snd)) (f .snd) (g .snd)) → f ≡ g ∫₁≡ p pᴰ i .fst = p i ∫₁≡ p pᴰ i .snd = pᴰ i ∫₂≡ : {x y : ∫₀} {f g : ∫₁ x y} {r s : ∫₂ f g} → (p : r .fst ≡ s .fst) → (pᴰ : PathP (λ i → rel[ p i ] (f .snd) (g .snd)) (r .snd) (s .snd)) → r ≡ s ∫₂≡ p pᴰ i .fst = p i ∫₂≡ p pᴰ i .snd = pᴰ i ∫-two-category-structure : TwoCategoryStr ∫₀ ∫₁ ∫₂ ∫-two-category-structure .TwoCategoryStr.id-hom (x , xᴰ) = id-hom x , id-homᴰ xᴰ ∫-two-category-structure .TwoCategoryStr.comp-hom (f , fᴰ) (g , gᴰ) = (f ∙₁ g) , fᴰ ∙₁ᴰ gᴰ ∫-two-category-structure .TwoCategoryStr.id-rel (f , fᴰ) = id-rel f , id-relᴰ fᴰ ∫-two-category-structure .TwoCategoryStr.trans (r , rᴰ) (s , sᴰ) = r ∙ᵥ s , rᴰ ∙ᵥᴰ sᴰ ∫-two-category-structure .TwoCategoryStr.comp-rel (r , rᴰ) (s , sᴰ) = r ∙ₕ s , rᴰ ∙ₕᴰ sᴰ ∫-is-two-cat : IsTwoCategory ∫₀ ∫₁ ∫₂ ∫-two-category-structure ∫-is-two-cat .IsTwoCategory.is-set-rel (f , fᴰ) (g , gᴰ) = isSetΣ (is-set-rel f g) λ r → (is-set-relᴰ fᴰ gᴰ) ∫-is-two-cat .IsTwoCategory.trans-assoc (r , rᴰ) (s , sᴰ) (t , tᴰ) i .fst = trans-assoc r s t i ∫-is-two-cat .IsTwoCategory.trans-assoc (r , rᴰ) (s , sᴰ) (t , tᴰ) i .snd = trans-assocᴰ rᴰ sᴰ tᴰ i ∫-is-two-cat .IsTwoCategory.trans-unit-left (r , rᴰ) i .fst = trans-unit-left r i ∫-is-two-cat .IsTwoCategory.trans-unit-left (r , rᴰ) i .snd = trans-unit-leftᴰ rᴰ i ∫-is-two-cat .IsTwoCategory.trans-unit-right (r , rᴰ) i .fst = trans-unit-right r i ∫-is-two-cat .IsTwoCategory.trans-unit-right (r , rᴰ) i .snd = trans-unit-rightᴰ rᴰ i ∫-is-two-cat .IsTwoCategory.comp-rel-id (f , fᴰ) (g , gᴰ) i .fst = comp-rel-id f g i ∫-is-two-cat .IsTwoCategory.comp-rel-id (f , fᴰ) (g , gᴰ) i .snd = comp-rel-idᴰ fᴰ gᴰ i ∫-is-two-cat .IsTwoCategory.comp-rel-trans (s , sᴰ) (t , tᴰ) (u , uᴰ) (v , vᴰ) i .fst = comp-rel-trans s t u v i ∫-is-two-cat .IsTwoCategory.comp-rel-trans (s , sᴰ) (t , tᴰ) (u , uᴰ) (v , vᴰ) i .snd = comp-rel-transᴰ sᴰ tᴰ uᴰ vᴰ i ∫-is-two-cat .IsTwoCategory.comp-hom-assoc (f , fᴰ) (g , gᴰ) (h , hᴰ) = ∫₁≡ (comp-hom-assoc f g h) (comp-hom-assocᴰ fᴰ gᴰ hᴰ) ∫-is-two-cat .IsTwoCategory.comp-hom-unit-left (g , gᴰ) = ∫₁≡ (comp-hom-unit-left g) (comp-hom-unit-leftᴰ gᴰ) ∫-is-two-cat .IsTwoCategory.comp-hom-unit-right (f , fᴰ) = ∫₁≡ (comp-hom-unit-right f) (comp-hom-unit-rightᴰ fᴰ) ∫-is-two-cat .IsTwoCategory.comp-rel-assoc (s , sᴰ) (t , tᴰ) (u , uᴰ) i .fst = comp-rel-assoc s t u i ∫-is-two-cat .IsTwoCategory.comp-rel-assoc (s , sᴰ) (t , tᴰ) (u , uᴰ) i .snd = comp-rel-assocᴰ sᴰ tᴰ uᴰ i ∫-is-two-cat .IsTwoCategory.comp-rel-unit-left (s , sᴰ) i .fst = comp-rel-unit-left s i ∫-is-two-cat .IsTwoCategory.comp-rel-unit-left (s , sᴰ) i .snd = comp-rel-unit-leftᴰ sᴰ i ∫-is-two-cat .IsTwoCategory.comp-rel-unit-right (r , rᴰ) i .fst = comp-rel-unit-right r i ∫-is-two-cat .IsTwoCategory.comp-rel-unit-right (r , rᴰ) i .snd = comp-rel-unit-rightᴰ rᴰ i ∫ : TwoCategory (ℓ-max ℓo ℓoᴰ) (ℓ-max ℓh ℓhᴰ) (ℓ-max ℓr ℓrᴰ) ∫ .TwoCategory.ob = ∫₀ ∫ .TwoCategory.hom = ∫₁ ∫ .TwoCategory.rel = ∫₂ ∫ .TwoCategory.two-category-structure = ∫-two-category-structure ∫ .TwoCategory.is-two-category = ∫-is-two-cat Fst : StrictFunctor ∫ C Fst .StrictFunctor.F-ob = fst Fst .StrictFunctor.F-hom = fst Fst .StrictFunctor.F-rel = fst Fst .StrictFunctor.F-rel-id = refl Fst .StrictFunctor.F-rel-trans r s = refl Fst .StrictFunctor.F-hom-comp f g = refl Fst .StrictFunctor.F-hom-id x = refl Fst .StrictFunctor.F-assoc-filler-left f g h .fst = refl Fst .StrictFunctor.F-assoc-filler-left f g h .snd = reflSquare ((fst f ∙₁ fst g) ∙₁ fst h) Fst .StrictFunctor.F-assoc-filler-right f g h .fst = refl Fst .StrictFunctor.F-assoc-filler-right f g h .snd = reflSquare ((fst f) ∙₁ (fst g ∙₁ fst h)) Fst .StrictFunctor.F-assoc f g h = λ i j → comp-hom-assoc (fst f) (fst g) (fst h) i Fst .StrictFunctor.F-unit-left-filler {x} f .fst = refl Fst .StrictFunctor.F-unit-left-filler {x} f .snd = reflSquare ((id-hom (fst x)) ∙₁ (fst f)) Fst .StrictFunctor.F-unit-left f = λ i j → comp-hom-unit-left (fst f) i Fst .StrictFunctor.F-unit-right-filler {y} f .fst = refl Fst .StrictFunctor.F-unit-right-filler {y} f .snd = reflSquare ((fst f) ∙₁ (id-hom (fst y))) Fst .StrictFunctor.F-unit-right f = λ i j → comp-hom-unit-right (fst f) i