{-# OPTIONS --without-K --safe #-}
open import Categories.Category
module Categories.Object.Product.Indexed.Properties {o ℓ e} (C : Category o ℓ e) where
open import Function.Base using () renaming (_∘_ to _∙_)
open import Level
open import Categories.Category.Construction.StrictDiscrete using (Discrete; lift-func)
open import Categories.Category.Complete using (Complete)
open import Categories.Category.Lift using (liftC; unliftF)
open import Categories.Diagram.Cone using (Cone; Cone⇒)
open import Categories.Diagram.Limit using (Limit)
open import Categories.Functor using (Functor; _∘F_)
open import Categories.Object.Product.Indexed C using (IndexedProductOf; AllProductsOf)
import Relation.Binary.PropositionalEquality as ≡
private
variable
o′ ℓ′ e′ : Level
open Category C
lowerAllProductsOf : ∀ {i} j → AllProductsOf (i ⊔ j) → AllProductsOf i
lowerAllProductsOf j prod P = record
{ X = X
; π = π ∙ lift
; ⟨_⟩ = λ f → ⟨ f ∙ lower ⟩
; commute = commute
; unique = λ eq → unique eq
}
where open IndexedProductOf (prod {Lift j _} (P ∙ lower))
module _ {i} (Com : Complete (i ⊔ o′) (i ⊔ ℓ′) (i ⊔ e′) C) where
module _ {I : Set i} (P : I → Obj) where
private
Z = liftC o′ ℓ′ e′ (Discrete I)
F = lift-func C P ∘F unliftF o′ ℓ′ e′ (Discrete I)
module L = Limit (Com F)
K : ∀ {Y} → (∀ i → Y ⇒ P i) → Cone F
K f = record
{ apex = record
{ ψ = λ i → f (lower i)
; commute = λ { (lift ≡.refl) → identityˡ }
}
}
Complete⇒IndexedProductOf : IndexedProductOf P
Complete⇒IndexedProductOf = record
{ X = L.apex
; π = λ i → L.proj (lift i)
; ⟨_⟩ = λ f → L.rep (K f)
; commute = Cone⇒.commute (L.rep-cone (K _))
; unique = λ eq → L.terminal.!-unique record
{ commute = eq
}
}