{-# OPTIONS --without-K --safe #-}
open import Level
open import Categories.Category
open import Categories.Functor using (Functor; _βF_; Endofunctor)
open import Categories.Functor.Hom
open import Categories.Diagram.Colimit
open import Data.Product
open import Colimit-Lemmas
open import Filtered
module Presentable {o β fil-level}
(π : Category o β β)
(o' β' e' : Level)
(Fil : Category o' β' e' β Set fil-level)
where
private
module π = Category π
open import Hom-Colimit-Choice π
open LiftHom o' β' e'
open import Categories.Object.Coproduct (π)
open import Categories.Morphism (π)
open import Categories.Morphism.Reasoning.Core π
finitary : {o'' β'' e'' : Level} {β° : Category o'' β'' e''} (F : Functor π β°) β Set _
finitary F =
β (π : Category o' β' e') β
Fil π β
(J : Functor π π) β
preserves-colimit J F
presentable : π.Obj β Set _
presentable X = finitary LiftHom[ X ,-]
presentable-coproduct : {A B : π.Obj} β (coprod : Coproduct A B) β
(β {π} β Fil π β filtered π) β
presentable A β presentable B β presentable (Coproduct.A+B coprod)
presentable-coproduct {A} {B} coprod Pβfiltered A-pres B-pres π π-has-P J J-colim =
hom-colim-construct
J-colim
(filtered.bounds (Pβfiltered π-has-P))
A+B
(Ξ» [f,g] β Part1.goal [f,g])
Ξ» {i} [f,g] [f',g'] prβfgβprβfg' β
let
open Part2 i [f,g] [f',g'] prβfgβprβfg'
in
i' , (m , (m , (
coproduct-jointly-epic coprod
(record { case-precompose-iβ = case1 ; case-precompose-iβ = case2 }))))
where
open Coproduct coprod
open Category π
module π = Category π
module J = Functor J
module J-colim = Colimit J-colim
open has-upper-bounds (filtered.bounds (Pβfiltered π-has-P))
A-preserves-J = A-pres π π-has-P J J-colim
B-preserves-J = B-pres π π-has-P J J-colim
Hom-A-colim = Colimit-from-prop A-preserves-J
Hom-B-colim = Colimit-from-prop B-preserves-J
module Part1 ([f,g] : A+B β J-colim.coapex) where
f = [f,g] β iβ
g = [f,g] β iβ
T-f : Triangle _ f
T-f = hom-colim-choice J-colim A (A-pres π π-has-P J) f
module T-f = Triangle T-f
T-g : Triangle _ g
T-g = hom-colim-choice J-colim B (B-pres π π-has-P J) g
module T-g = Triangle T-g
Bo = upper-bound T-f.x T-g.x
p' = [ (J.β (is-aboveβ _ _) β T-f.p') , (J.β (is-aboveβ _ _) β T-g.p') ]
open HomReasoning
case1 = begin
[f,g] β iβ β‘β¨β©
f ββ¨ T-f.commutes β©
J-colim.proj T-f.x β T-f.p' βΛβ¨ J-colim.colimit-commute _ β©ββ¨refl β©
(J-colim.proj Bo β J.β (is-aboveβ _ _)) β T-f.p' ββ¨ assoc β©
J-colim.proj Bo β (J.β (is-aboveβ _ _) β T-f.p') βΛβ¨ reflβ©ββ¨ injectβ β©
J-colim.proj Bo β p' β iβ ββ¨ sym-assoc β©
(J-colim.proj Bo β p') β iβ
β
case2 = begin
[f,g] β iβ ββ¨ T-g.commutes β©
J-colim.proj T-g.x β T-g.p' βΛβ¨ J-colim.colimit-commute _ β©ββ¨refl β©
(J-colim.proj Bo β J.β (is-aboveβ _ _)) β T-g.p' ββ¨ assoc β©
J-colim.proj Bo β (J.β (is-aboveβ _ _) β T-g.p') βΛβ¨ reflβ©ββ¨ injectβ β©
J-colim.proj Bo β p' β iβ ββ¨ sym-assoc β©
(J-colim.proj Bo β p') β iβ
β
goal : Triangle J-colim [f,g]
goal = record {
x = Bo ;
p' = p' ;
commutes = coproduct-jointly-epic coprod (record {
case-precompose-iβ = case1 ;
case-precompose-iβ = case2 })
}
module Part2 (i : π.Obj) ([f,g] [f',g'] : A+B β J.Fβ i)
(prβfgβprβfg' : J-colim.proj i β [f,g] β J-colim.proj i β [f',g']) where
module fil = filtered (Pβfiltered π-has-P)
open HomReasoning
f = [f,g] β iβ
g = [f,g] β iβ
f' = [f',g'] β iβ
g' = [f',g'] β iβ
prβfβprβf' : J-colim.proj i β ([f,g] β iβ) β J-colim.proj i β ([f',g'] β iβ)
prβfβprβf' = extendΚ³ prβfgβprβfg'
i-u-f-f'-prop =
hom-colim-unique-factor J-colim (Pβfiltered π-has-P)
A A-preserves-J _ _ prβfβprβf'
i-f = projβ i-u-f-f'-prop
u-f = projβ (projβ i-u-f-f'-prop)
u-f' = projβ (projβ(projβ i-u-f-f'-prop))
u-fβfβu-f'βf' = (projβ(projβ(projβ i-u-f-f'-prop)))
Mf = fil.merge-all u-f u-f'
module Mf = MergedMorphisms Mf
v-f = Mf.merge π.β u-f
v-f-prop : J.β v-f β f β J.β v-f β f'
v-f-prop =
begin
J.β v-f β f ββ¨ J.homomorphism β©ββ¨refl β©
(J.β Mf.merge β J.β u-f) β f ββ¨ extendΛ‘ u-fβfβu-f'βf' β©
(J.β Mf.merge β J.β u-f') β f' βΛβ¨ J.homomorphism β©ββ¨refl β©
J.β (Mf.merge π.β u-f') β f' βΛβ¨ J.F-resp-β Mf.prop β©ββ¨refl β©
J.β v-f β f'
β
g-unique-factor =
hom-colim-unique-factor J-colim (Pβfiltered π-has-P)
B B-preserves-J g g' (extendΚ³ prβfgβprβfg')
i-g = projβ g-unique-factor
u-g = projβ (projβ g-unique-factor)
u-g' = projβ (projβ(projβ g-unique-factor))
u-gβgβu-g'βg' = (projβ(projβ(projβ g-unique-factor)))
Mg = fil.merge-all u-g u-g'
module Mg = MergedMorphisms Mg
v-g = Mg.merge π.β u-g
v-g-prop : J.β v-g β g β J.β v-g β g'
v-g-prop =
begin
J.β v-g β g ββ¨ J.homomorphism β©ββ¨refl β©
(J.β Mg.merge β J.β u-g) β g ββ¨ extendΛ‘ u-gβgβu-g'βg' β©
(J.β Mg.merge β J.β u-g') β g' βΛβ¨ J.homomorphism β©ββ¨refl β©
J.β (Mg.merge π.β u-g') β g' βΛβ¨ J.F-resp-β Mg.prop β©ββ¨refl β©
J.β v-g β g'
β
closed = fil.close-span v-f v-g
module closed = ClosedSpan closed
i' = closed.tip
e-f = closed.close-fst
e-g = closed.close-snd
m = e-f π.β v-f
case1 =
begin
(J.β m β [f,g]) β iβ ββ¨ assoc β©
J.β m β f ββ¨ J.homomorphism β©ββ¨refl β©
(J.β e-f β J.β v-f) β f ββ¨ assoc β©
J.β e-f β (J.β v-f β f) ββ¨ reflβ©ββ¨ v-f-prop β©
J.β e-f β (J.β v-f β f') ββ¨ sym-assoc β©
(J.β e-f β J.β v-f) β f' βΛβ¨ J.homomorphism β©ββ¨refl β©
J.β m β [f',g'] β iβ ββ¨ sym-assoc β©
(J.β m β [f',g']) β iβ
β
case2 =
begin
(J.β m β [f,g]) β iβ ββ¨ assoc β©
J.β m β g ββ¨ J.F-resp-β closed.commutes β©ββ¨refl β©
J.β (e-g π.β v-g) β g ββ¨ J.homomorphism β©ββ¨refl β©
(J.β e-g β J.β v-g) β g ββ¨ assoc β©
J.β e-g β (J.β v-g β g) ββ¨ reflβ©ββ¨ v-g-prop β©
J.β e-g β (J.β v-g β g') ββ¨ sym-assoc β©
(J.β e-g β J.β v-g) β g' βΛβ¨ J.homomorphism β©ββ¨refl β©
J.β (e-g π.β v-g) β [f',g'] β iβ βΛβ¨ J.F-resp-β closed.commutes β©ββ¨refl β©
J.β m β [f',g'] β iβ ββ¨ sym-assoc β©
(J.β m β [f',g']) β iβ
β