open import GpdCont.Prelude hiding (J)
open import Cubical.Categories.Category.Base using (Category ; _[_,_])
module GpdCont.Categories.Family (ℓ : Level) {ℓo ℓh} (C : Category ℓo ℓh) where
open import GpdCont.Univalence
open import GpdCont.HomotopySet
import GpdCont.Categories.Products as Pr
open import Cubical.Foundations.Equiv
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Isomorphism
open import Cubical.Data.Sigma
open import Cubical.Categories.Instances.Sets using (SET)
open import Cubical.Categories.Constructions.TotalCategory.Base using (∫C)
open import Cubical.Categories.Displayed.Base as Disp using (Categoryᴰ)
open import Cubical.Categories.Presheaf.Representable
module _ where
private
module C = Category C
open Categoryᴰ
Famᴰ : Categoryᴰ (SET ℓ) (ℓ-max ℓo ℓ) (ℓ-max ℓh ℓ)
Famᴰ .ob[_] X = ⟨ X ⟩ → C.ob
Famᴰ .Hom[_][_,_] {x = J} {y = K} f Xⱼ Yₖ = ∀ (j : ⟨ J ⟩) → C.Hom[ (Xⱼ j) , Yₖ (f j) ]
Famᴰ .idᴰ j = C.id
Famᴰ ._⋆ᴰ_ {f} φ ψ = λ j → φ j C.⋆ ψ (f j)
Famᴰ .⋆IdLᴰ φ = funExt λ j → C.⋆IdL (φ j)
Famᴰ .⋆IdRᴰ φ = funExt λ j → C.⋆IdR (φ j)
Famᴰ .⋆Assocᴰ φ ψ υ = funExt λ j → C.⋆Assoc (φ j) (ψ _) (υ _)
Famᴰ .isSetHomᴰ = isSetΠ λ j → C.isSetHom
Fam = ∫C Famᴰ
{-# INJECTIVE_FOR_INFERENCE Fam #-}
{-# INJECTIVE_FOR_INFERENCE Famᴰ #-}
Fam≡ : ∀ {x@(J , X) y@(K , Y) : Category.ob Fam} → (p : J ≡ K) → (q : PathP (λ i → ⟨ p i ⟩ → C.ob) X Y) → x ≡ y
Fam≡ p q i .fst = p i
Fam≡ p q i .snd = q i
FamHom≡ : ∀ {X Y} {f×φ@(f , φ) g×ψ@(g , ψ) : Fam [ X , Y ]}
→ (p : f ≡ g)
→ (∀ j → PathP (λ i → C [ X .snd j , Y .snd (p i j) ]) (φ j) (ψ j))
→ f×φ ≡ g×ψ
FamHom≡ p q i .fst = p i
FamHom≡ p q i .snd j = q j i
private
module Fam = Category Fam
module Notation where
private
module C = Category C
Index : Fam.ob → hSet ℓ
Index = fst
El : (x : Fam.ob) → ⟨ Index x ⟩ → C.ob
El = snd
HomIndex : {x y : Fam.ob} → Fam.Hom[ x , y ] → ⟨ Index x ⟩ → ⟨ Index y ⟩
HomIndex = fst
HomEl : {x y : Fam.ob} → (f : Fam.Hom[ x , y ]) → (j : ⟨ Index x ⟩) → C.Hom[ El x j , El y (HomIndex f j) ]
HomEl = snd
open Notation
module Coproducts where
open import GpdCont.Categories.Coproducts Fam ℓ as FamCoproduct
private
module C = Category C
module _ (K : hSet ℓ) (c : ⟨ K ⟩ → Fam.ob) where
coprod : Fam.ob
coprod .fst = ΣSet K (Index ∘ c)
coprod .snd = uncurry (El ∘ c)
inj : (k : ⟨ K ⟩) → Σ[ f ∈ (⟨ Index (c k) ⟩ → Σ[ k ∈ ⟨ K ⟩ ] ⟨ Index (c k) ⟩) ] ∀ j → C.Hom[ El (c k) j , El (c (f j .fst)) (f j .snd) ]
inj k .fst j = k , j
inj k .snd j = C.id {x = El (c k) j}
module _ (y : Fam.ob) where
univ-iso : Iso Fam.Hom[ coprod , y ] ((k : ⟨ K ⟩) → Fam.Hom[ c k , y ])
univ-iso .Iso.fun f = λ k → inj k Fam.⋆ f
univ-iso .Iso.inv g .fst (k , j) = g k .fst j
univ-iso .Iso.inv g .snd (k , j) = g k .snd j
univ-iso .Iso.rightInv g = funExt λ k → FamHom≡ refl (λ j → C.⋆IdL (g k .snd j))
univ-iso .Iso.leftInv f = FamHom≡ refl λ kj → C.⋆IdL (f .snd kj)
is-univ : isEquiv (univ-iso .Iso.fun)
is-univ = isoToIsEquiv univ-iso
FamCoproduct : Coproduct K c
FamCoproduct .UniversalElement.vertex = coprod
FamCoproduct .UniversalElement.element = inj
FamCoproduct .UniversalElement.universal = is-univ
FamCoproducts : Coproducts
FamCoproducts = FamCoproduct
module Products (p : Pr.Products C ℓ) where
private
open module FamProduct = Pr Fam ℓ
module C where
open Category C public
open Pr.Notation C ℓ p public
module _ (K : hSet ℓ) (c : ⟨ K ⟩ → Fam.ob) where
private
c′ : (φ : ∀ k → ⟨ Index (c k) ⟩) (k : ⟨ K ⟩) → C.ob
c′ φ k = El (c k) (φ k)
prod : Fam.ob
prod .fst = ΠSet {S = ⟨ K ⟩} λ k → Index (c k)
prod .snd = λ (φ : ∀ k → ⟨ Index (c k) ⟩) → C.Π K (c′ φ)
proj : (k : ⟨ K ⟩) → Fam.Hom[ prod , c k ]
proj k .fst φ = φ k
proj k .snd φ = C.π K (c′ φ) k
univ-iso : ∀ (x : Fam.ob) → Iso Fam.Hom[ x , prod ] ((k : ⟨ K ⟩) → Fam.Hom[ x , c k ])
univ-iso x =
Fam.Hom[ x , prod ]
Iso⟨⟩
Σ[ φ ∈ (⟨ Index x ⟩ → (k : ⟨ K ⟩) → ⟨ Index (c k) ⟩) ] ((j : ⟨ Index x ⟩) → C.Hom[ El x j , C.Π K (c′ (φ j)) ])
Iso⟨ invIso Σ-Π-Iso ⟩
((j : ⟨ Index x ⟩) → Σ[ φ ∈ ((k : ⟨ K ⟩) → ⟨ Index (c k) ⟩) ] (C.Hom[ El x j , C.Π K (c′ φ) ]))
Iso⟨ codomainIsoDep (λ j → Σ-cong-iso-snd λ φ → C.univ-iso K (c′ φ) (El x j)) ⟩
((j : ⟨ Index x ⟩) → Σ[ φ ∈ ((k : ⟨ K ⟩) → ⟨ Index (c k) ⟩) ] ((k : ⟨ K ⟩) → C.Hom[ El x j , c′ φ k ]))
Iso⟨ codomainIsoDep (λ j → invIso Σ-Π-Iso) ⟩
((j : ⟨ Index x ⟩) → (k : ⟨ K ⟩) → Σ[ i ∈ ⟨ Index (c k) ⟩ ] (C.Hom[ El x j , El (c k) i ]))
Iso⟨ flipIso ⟩
((k : ⟨ K ⟩) → (j : ⟨ Index x ⟩) → Σ[ i ∈ ⟨ Index (c k) ⟩ ] (C.Hom[ El x j , El (c k) i ]))
Iso⟨ codomainIsoDep (λ k → Σ-Π-Iso) ⟩
((k : ⟨ K ⟩) → Σ[ φ ∈ ((j : ⟨ Index x ⟩) → ⟨ Index (c k) ⟩) ] (∀ j → C.Hom[ El x j , El (c k) (φ j) ]))
Iso⟨⟩
((k : ⟨ K ⟩) → Fam.Hom[ x , c k ]) ∎Iso
univ : (x : Fam.ob) → isEquiv (univ-iso x .Iso.fun)
univ = isoToIsEquiv ∘ univ-iso
FamProduct : Product K c
FamProduct .UniversalElement.vertex = prod
FamProduct .UniversalElement.element = proj
FamProduct .UniversalElement.universal = univ
FamProducts : Products
FamProducts = FamProduct