module GpdCont.TwoCategory.Family.Base where open import GpdCont.Prelude open import GpdCont.HomotopySet open import GpdCont.TwoCategory.Base open import GpdCont.TwoCategory.HomotopySet using (SetEq ; isTwoCategorySetStr) open import GpdCont.TwoCategory.Displayed.Base open import Cubical.Foundations.Equiv open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism import Cubical.Foundations.GroupoidLaws as GL open import Cubical.Functions.FunExtEquiv import Cubical.Data.Equality as Eq {-# INJECTIVE_FOR_INFERENCE ⟨_⟩ #-} module _ {ℓo ℓh ℓr} (C : TwoCategory ℓo ℓh ℓr) (ℓ : Level) where private module C = TwoCategory C module SetEq = TwoCategory (SetEq ℓ) Fam₀ : SetEq.ob → Type (ℓ-max ℓo ℓ) Fam₀ x = ⟨ x ⟩ → C.ob {-# INJECTIVE_FOR_INFERENCE Fam₀ #-} Fam₁ : {x y : SetEq.ob} → (f : SetEq.hom x y) → (xᴰ : Fam₀ x) (yᴰ : Fam₀ y) → Type (ℓ-max ℓh ℓ) Fam₁ {x} f xᴰ yᴰ = (j : ⟨ x ⟩) → C.hom (xᴰ j) (yᴰ (f j)) {-# INJECTIVE_FOR_INFERENCE Fam₁ #-} Famᴰ₂ : {x y : SetEq.ob} {f : SetEq.hom x y} → {xᴰ : Fam₀ x} → (yᴰ : Fam₀ y) → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ f xᴰ yᴰ) → Type (ℓ-max ℓr ℓ) Famᴰ₂ {x} yᴰ fᴰ gᴰ = (j : ⟨ x ⟩) → C.rel (fᴰ j) (gᴰ j) Fam₂J[_] : {x y : SetEq.ob} {f g : SetEq.hom x y} → {xᴰ : Fam₀ x} → (yᴰ : Fam₀ y) → (r : f ≡ g) → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ g xᴰ yᴰ) → Type (ℓ-max ℓr ℓ) Fam₂J[_] {x} {f} {xᴰ} yᴰ = J (λ g (p : f ≡ g) → (fᴰ : Fam₁ f xᴰ yᴰ) (gᴰ : Fam₁ g xᴰ yᴰ) → Type _) (Famᴰ₂ yᴰ) private Fam₂[_] : {x y : SetEq.ob} {f g : SetEq.hom x y} → {xᴰ : Fam₀ x} → (yᴰ : Fam₀ y) → (r : SetEq.rel f g) → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ g xᴰ yᴰ) → Type (ℓ-max ℓr ℓ) Fam₂[_] {x} yᴰ Eq.refl = Famᴰ₂ yᴰ Fam₂ : {x y : SetEq.ob} {f g : SetEq.hom x y} → {xᴰ : Fam₀ x} → {yᴰ : Fam₀ y} → (r : SetEq.rel f g) → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ g xᴰ yᴰ) → Type (ℓ-max ℓr ℓ) Fam₂ {yᴰ} = Fam₂[ yᴰ ] {-# INJECTIVE_FOR_INFERENCE Fam₂[_] #-} {-# INJECTIVE_FOR_INFERENCE Fam₂ #-} Fam₁-comp[_] : ∀ {x y z : SetEq.ob} {f : SetEq.hom x y} {g : SetEq.hom y z} → {xᴰ : Fam₀ x} {yᴰ : Fam₀ y} (zᴰ : Fam₀ z) → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ g yᴰ zᴰ) → Fam₁ (SetEq.comp-hom f g) xᴰ zᴰ Fam₁-comp[_] {f} zᴰ fᴰ gᴰ j = fᴰ j C.∙₁ gᴰ (f j) Fam₁-comp : ∀ {x y z : SetEq.ob} {f : SetEq.hom x y} {g : SetEq.hom y z} → {xᴰ : Fam₀ x} {yᴰ : Fam₀ y} {zᴰ : Fam₀ z} → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ g yᴰ zᴰ) → Fam₁ (SetEq.comp-hom f g) xᴰ zᴰ Fam₁-comp {zᴰ} = Fam₁-comp[ zᴰ ] _∙ᵥ_ : ∀ {x y : SetEq.ob} {f g h : SetEq.hom x y} {r : SetEq.rel f g} {s : SetEq.rel g h} → {xᴰ : Fam₀ x} {yᴰ : Fam₀ y} → {fᴰ : Fam₁ f xᴰ yᴰ} → {gᴰ : Fam₁ g xᴰ yᴰ} → {hᴰ : Fam₁ h xᴰ yᴰ} → (rᴰ : Fam₂[ yᴰ ] r fᴰ gᴰ) → (sᴰ : Fam₂[ yᴰ ] s gᴰ hᴰ) → (Fam₂[ yᴰ ] (SetEq.trans r s) fᴰ hᴰ) _∙ᵥ_ {r = Eq.refl} {s = Eq.refl} rᴰ sᴰ j = C.trans (rᴰ j) (sᴰ j) _∙ₕ_ : ∀ {x y z : SetEq.ob} {f₁ f₂ : SetEq.hom x y} {g₁ g₂ : SetEq.hom y z} → {r : SetEq.rel f₁ f₂} {s : SetEq.rel g₁ g₂} → {xᴰ : Fam₀ x} {yᴰ : Fam₀ y} {zᴰ : Fam₀ z} → {f₁ᴰ : Fam₁ f₁ xᴰ yᴰ} → {f₂ᴰ : Fam₁ f₂ xᴰ yᴰ} → {g₁ᴰ : Fam₁ g₁ yᴰ zᴰ} → {g₂ᴰ : Fam₁ g₂ yᴰ zᴰ} → (rᴰ : Fam₂[ yᴰ ] r f₁ᴰ f₂ᴰ) → (sᴰ : Fam₂[ zᴰ ] s g₁ᴰ g₂ᴰ) → Fam₂[ zᴰ ] (SetEq.comp-rel r s) (Fam₁-comp[ zᴰ ] f₁ᴰ g₁ᴰ) (Fam₁-comp[ zᴰ ] f₂ᴰ g₂ᴰ) _∙ₕ_ {f₁} {r = Eq.refl} {s = Eq.refl} rᴰ sᴰ j = C.comp-rel (rᴰ j) (sᴰ (f₁ j)) opaque isSetFam₂ : ∀ {x y} {f g : SetEq.hom x y} (s : SetEq.rel f g) → {xᴰ : Fam₀ x} {yᴰ : Fam₀ y} → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ g xᴰ yᴰ) → isSet (Fam₂[ yᴰ ] s fᴰ gᴰ) isSetFam₂ Eq.refl fᴰ gᴰ = isSetΠ λ j → C.is-set-rel (fᴰ j) (gᴰ j) FamStrᴰ : TwoCategoryStrᴰ (SetEq ℓ) _ _ _ Fam₀ Fam₁ Fam₂ FamStrᴰ .TwoCategoryStrᴰ.id-homᴰ xᴰ j = C.id-hom (xᴰ j) FamStrᴰ .TwoCategoryStrᴰ.comp-homᴰ {zᴰ} fᴰ gᴰ = Fam₁-comp[ zᴰ ] fᴰ gᴰ FamStrᴰ .TwoCategoryStrᴰ.id-relᴰ {yᴰ} fᴰ j = C.id-rel (fᴰ j) FamStrᴰ .TwoCategoryStrᴰ.transᴰ {yᴰ} rᴰ sᴰ = _∙ᵥ_ {yᴰ = yᴰ} rᴰ sᴰ FamStrᴰ .TwoCategoryStrᴰ.comp-relᴰ = _∙ₕ_ isTwoCategoryFamᴰ : IsTwoCategoryᴰ (SetEq ℓ) _ _ _ Fam₀ Fam₁ Fam₂ FamStrᴰ isTwoCategoryFamᴰ .IsTwoCategoryᴰ.is-set-relᴰ {s} = isSetFam₂ s isTwoCategoryFamᴰ .IsTwoCategoryᴰ.trans-assocᴰ {r = Eq.refl} {s = Eq.refl} {t = Eq.refl} rᴰ sᴰ tᴰ = funExt λ j → C.trans-assoc (rᴰ j) (sᴰ j) (tᴰ j) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.trans-unit-leftᴰ {s = Eq.refl} sᴰ = funExt λ j → C.trans-unit-left (sᴰ j) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.trans-unit-rightᴰ {r = Eq.refl} rᴰ = funExt λ j → C.trans-unit-right (rᴰ j) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-rel-idᴰ {f} fᴰ gᴰ = funExt λ j → C.comp-rel-id (fᴰ j) (gᴰ (f j)) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-rel-transᴰ {f₁} {s = Eq.refl} {t = Eq.refl} {u = Eq.refl} {v = Eq.refl} sᴰ tᴰ uᴰ vᴰ = funExt λ j → C.comp-rel-trans (sᴰ j) (tᴰ j) (uᴰ (f₁ j)) (vᴰ (f₁ j)) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-hom-assocᴰ {f} {g} fᴰ gᴰ hᴰ = funExt λ j → C.comp-hom-assoc (fᴰ j) (gᴰ (f j)) (hᴰ (g (f j))) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-hom-unit-leftᴰ gᴰ = funExt λ j → C.comp-hom-unit-left (gᴰ j) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-hom-unit-rightᴰ fᴰ = funExt λ j → C.comp-hom-unit-right (fᴰ j) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-rel-assocᴰ {f₁} {g₁} {s = Eq.refl} {t = Eq.refl} {u = Eq.refl} sᴰ tᴰ uᴰ = funExt λ j → C.comp-rel-assoc (sᴰ j) (tᴰ (f₁ j)) (uᴰ (g₁ (f₁ j))) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-rel-unit-leftᴰ {s = Eq.refl} sᴰ = funExt λ j → C.comp-rel-unit-left (sᴰ j) isTwoCategoryFamᴰ .IsTwoCategoryᴰ.comp-rel-unit-rightᴰ {r = Eq.refl} rᴰ = funExt λ j → C.comp-rel-unit-right (rᴰ j) Famᴰ : TwoCategoryᴰ (SetEq ℓ) (ℓ-max ℓo ℓ) (ℓ-max ℓh ℓ) (ℓ-max ℓr ℓ) Famᴰ .TwoCategoryᴰ.ob[_] = Fam₀ Famᴰ .TwoCategoryᴰ.hom[_] = Fam₁ Famᴰ .TwoCategoryᴰ.rel[_] {yᴰ} = Fam₂[ yᴰ ] Famᴰ .TwoCategoryᴰ.two-category-structureᴰ = FamStrᴰ Famᴰ .TwoCategoryᴰ.is-two-categoryᴰ = isTwoCategoryFamᴰ Fam : TwoCategory (ℓ-max ℓo (ℓ-suc ℓ)) (ℓ-max ℓh ℓ) (ℓ-max ℓr ℓ) Fam = TotalTwoCategory.∫ (SetEq ℓ) Famᴰ Fam₂PathP : {x y : SetEq.ob} {f g : SetEq.hom x y} → {xᴰ : Fam₀ x} → (yᴰ : Fam₀ y) → (r : f ≡ g) → (fᴰ : Fam₁ f xᴰ yᴰ) → (gᴰ : Fam₁ g xᴰ yᴰ) → Type _ Fam₂PathP {x} {xᴰ} yᴰ r fᴰ gᴰ = PathP (λ i → Fam₁ (r i) xᴰ yᴰ) fᴰ gᴰ