open import GpdCont.Prelude
open import Cubical.Categories.Category.Base
import GpdCont.Categories.Products as CatProducts
module GpdCont.Categories.ProductCategory {ℓo ℓo′ ℓh ℓh′}
{C : Category ℓo ℓh}
{D : Category ℓo′ ℓh′}
(ℓ : Level)
(ΠC : CatProducts.Products C ℓ)
(ΠD : CatProducts.Products D ℓ)
where
open import GpdCont.HomotopySet
open import Cubical.Foundations.Isomorphism
open import Cubical.Data.Sigma
open import Cubical.Categories.Constructions.BinProduct using (_×C_)
private
C×D = C ×C D
module C×D = Category C×D
module C where
open Category C public
open CatProducts.Notation C ℓ ΠC public
module D where
open Category D public
open CatProducts.Notation D ℓ ΠD public
module _ (K : hSet ℓ) (xy : ⟨ K ⟩ → C×D.ob) where
open CatProducts C×D ℓ
private
Π : C×D.ob
Π .fst = C.Π K (fst ∘ xy)
Π .snd = D.Π K (snd ∘ xy)
univ-iso : (zw : C×D.ob) → Iso C×D.Hom[ zw , Π ] (∀ k → C×D.Hom[ zw , xy k ])
univ-iso (z , w) =
C.Hom[ z , C.Π K (fst ∘ xy) ] × D.Hom[ w , D.Π K (snd ∘ xy) ] Iso⟨ prodIso (C.univ-iso K _ _) (D.univ-iso K _ _) ⟩
(∀ k → C.Hom[ z , xy k .fst ]) × (∀ k → D.Hom[ w , xy k .snd ]) Iso⟨ invIso Σ-Π-Iso ⟩
(∀ k → C×D.Hom[ (z , w) , xy k ]) Iso∎
ProductCategoryProduct : Product K xy
ProductCategoryProduct .UniversalElement.vertex = C.Π K (fst ∘ xy) , D.Π K (snd ∘ xy)
ProductCategoryProduct .UniversalElement.element = λ k → C.π K (fst ∘ xy) k , D.π K (snd ∘ xy) k
ProductCategoryProduct .UniversalElement.universal = isoToIsEquiv ∘ univ-iso