open import GpdCont.Prelude open import Cubical.Categories.Category.Base open import Cubical.Categories.Displayed.Constructions.StructureOver module GpdCont.Categories.StructureOver {ℓo ℓh ℓoᴰ ℓhᴰ} (C : Category ℓo ℓh) (S : StructureOver C ℓoᴰ ℓhᴰ) where open import Cubical.Foundations.Equiv open import Cubical.Foundations.HLevels open import Cubical.Foundations.Isomorphism open import Cubical.Data.Sigma open import Cubical.Categories.Displayed.Base open import Cubical.Categories.Constructions.TotalCategory renaming (∫C to ∫) import GpdCont.Categories.Products as CatProducts private module S = StructureOver S Cᴰ = StructureOver→Catᴰ S module Cᴰ = Categoryᴰ Cᴰ ∫C = ∫ {C = C} Cᴰ module ∫C = Category ∫C module Products (ℓ) (ΠC : CatProducts.Products C ℓ) where open import GpdCont.HomotopySet open import GpdCont.Categories.Products ∫C ℓ private module C where open Category C public open CatProducts.Notation C ℓ ΠC public module _ (K : hSet ℓ) (c : ⟨ K ⟩ → ∫C.ob) (Πᴰ : S.ob[ C.Π K (fst ∘ c) ]) (πᴰ : ∀ k → S.Hom[ C.π K (fst ∘ c) k ][ Πᴰ , c k .snd ]) (Homᴰ↔Π : ∀ {x} {xᴰ : S.ob[ x ]} (f : ∀ k → C.Hom[ x , c k .fst ]) → (Cᴰ.Hom[ C.univ-iso K (fst ∘ c) x .Iso.inv f ][ xᴰ , Πᴰ ] → (∀ k → Cᴰ.Hom[ f k ][ xᴰ , c k .snd ])) × ((∀ k → Cᴰ.Hom[ f k ][ xᴰ , c k .snd ]) → Cᴰ.Hom[ C.univ-iso K (fst ∘ c) x .Iso.inv f ][ xᴰ , Πᴰ ]) ) where private Π : ∫C.ob Π .fst = C.Π K (fst ∘ c) Π .snd = Πᴰ proj : ∀ k → ∫C.Hom[ Π , c k ] proj k .fst = C.π K (fst ∘ c) k proj k .snd = πᴰ k univ-iso : (x : ∫C.ob) → Iso ∫C.Hom[ x , Π ] (∀ k → ∫C.Hom[ x , c k ]) univ-iso (x , xᴰ) = ∫C.Hom[ (x , xᴰ) , Π ] Iso⟨⟩ Σ[ f ∈ C.Hom[ x , C.Π K (fst ∘ c) ] ] Cᴰ.Hom[ f ][ xᴰ , Πᴰ ] Iso⟨ invIso $ Σ-cong-iso-fst (invIso $ C.univ-iso K (fst ∘ c) x) ⟩ Σ[ f ∈ (∀ k → C.Hom[ x , (c k .fst) ]) ] Cᴰ.Hom[ _ ][ xᴰ , Πᴰ ] Iso⟨ Σ-cong-iso-snd Homᴰ-iso ⟩ Σ[ f ∈ (∀ k → C.Hom[ x , (c k .fst) ]) ] (∀ k → Cᴰ.Hom[ f k ][ xᴰ , c k .snd ]) Iso⟨ invIso Σ-Π-Iso ⟩ (∀ k → ∫C.Hom[ (x , xᴰ) , c k ]) Iso∎ where Homᴰ-iso : (f : ∀ k → C.Hom[ x , c k .fst ]) → Iso Cᴰ.Hom[ C.univ-iso K (fst ∘ c) x .Iso.inv f ][ xᴰ , Πᴰ ] (∀ k → Cᴰ.Hom[ f k ][ xᴰ , c k .snd ]) Homᴰ-iso f = isProp→Iso S.isPropHomᴰ (isPropΠ λ k → S.isPropHomᴰ) (Homᴰ↔Π f .fst) (Homᴰ↔Π f .snd) ∫Product : Product K c ∫Product .UniversalElement.vertex = Π ∫Product .UniversalElement.element = proj ∫Product .UniversalElement.universal x = subst isEquiv (funExt λ x → funExt λ k → Σ≡Prop (λ f → S.isPropHomᴰ) refl) (isoToIsEquiv (univ-iso x))