Theory CZH_UCAT_Universal
sectionβΉUniversal arrowβΊ
theory CZH_UCAT_Universal
imports
CZH_UCAT_Introduction
CZH_Elementary_Categories.CZH_ECAT_FUNCT
CZH_Elementary_Categories.CZH_ECAT_Set
CZH_Elementary_Categories.CZH_ECAT_Hom
begin
subsectionβΉBackgroundβΊ
textβΉ
The following section is based, primarily, on the elements of the content
of Chapter III-1 in \cite{mac_lane_categories_2010}.
βΊ
subsectionβΉUniversal mapβΊ
textβΉ
The universal map is a convenience utility that allows treating
a part of the definition of the universal arrow as an arrow in the
category βΉSetβΊ.
βΊ
subsubsectionβΉDefinition and elementary propertiesβΊ
definition umap_of :: "V β V β V β V β V β V"
where "umap_of π c r u d =
[
(Ξ»f'ββ©βHom (πβ¦HomDomβ¦) r d. πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπβ¦HomCodβ¦β u),
Hom (πβ¦HomDomβ¦) r d,
Hom (πβ¦HomCodβ¦) c (πβ¦ObjMapβ¦β¦dβ¦)
]β©β"
definition umap_fo :: "V β V β V β V β V β V"
where "umap_fo π c r u d = umap_of (op_cf π) c r u d"
textβΉComponents.βΊ
lemma (in is_functor) umap_of_components:
assumes "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "umap_of π c r u dβ¦ArrValβ¦ = (Ξ»f'ββ©βHom π r d. πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπ
β u)"
and "umap_of π c r u dβ¦ArrDomβ¦ = Hom π r d"
and "umap_of π c r u dβ¦ArrCodβ¦ = Hom π
c (πβ¦ObjMapβ¦β¦dβ¦)"
unfolding umap_of_def arr_field_simps
by (simp_all add: cat_cs_simps nat_omega_simps)
lemma (in is_functor) umap_fo_components:
assumes "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
shows "umap_fo π c r u dβ¦ArrValβ¦ = (Ξ»f'ββ©βHom π d r. u ββ©Aβπ
β πβ¦ArrMapβ¦β¦f'β¦)"
and "umap_fo π c r u dβ¦ArrDomβ¦ = Hom π d r"
and "umap_fo π c r u dβ¦ArrCodβ¦ = Hom π
(πβ¦ObjMapβ¦β¦dβ¦) c"
unfolding
umap_fo_def
is_functor.umap_of_components[
OF is_functor_op, unfolded cat_op_simps, OF assms
]
proof(rule vsv_eqI)
fix f' assume "f' ββ©β πβ©β (Ξ»f'ββ©βHom π d r. πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβop_cat π
β u)"
then have f': "f' : d β¦βπβ r" by simp
then have πf': "πβ¦ArrMapβ¦β¦f'β¦ : πβ¦ObjMapβ¦β¦dβ¦ β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
by (auto intro: cat_cs_intros)
from f' show
"(Ξ»f'ββ©βHom π d r. πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβop_cat π
β u)β¦f'β¦ =
(Ξ»f'ββ©βHom π d r. u ββ©Aβπ
β πβ¦ArrMapβ¦β¦f'β¦)β¦f'β¦"
by (simp add: HomCod.op_cat_Comp[OF assms πf'])
qed simp_all
textβΉUniversal maps for the opposite functor.βΊ
lemma (in is_functor) op_umap_of[cat_op_simps]: "umap_of (op_cf π) = umap_fo π"
unfolding umap_fo_def by simp
lemma (in is_functor) op_umap_fo[cat_op_simps]: "umap_fo (op_cf π) = umap_of π"
unfolding umap_fo_def by (simp add: cat_op_simps)
lemmas [cat_op_simps] =
is_functor.op_umap_of
is_functor.op_umap_fo
subsubsectionβΉArrow valueβΊ
lemma umap_of_ArrVal_vsv[cat_cs_intros]: "vsv (umap_of π c r u dβ¦ArrValβ¦)"
unfolding umap_of_def arr_field_simps by (simp add: nat_omega_simps)
lemma umap_fo_ArrVal_vsv[cat_cs_intros]: "vsv (umap_fo π c r u dβ¦ArrValβ¦)"
unfolding umap_fo_def by (rule umap_of_ArrVal_vsv)
lemma (in is_functor) umap_of_ArrVal_vdomain:
assumes "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "πβ©β (umap_of π c r u dβ¦ArrValβ¦) = Hom π r d"
unfolding umap_of_components[OF assms] by simp
lemmas [cat_cs_simps] = is_functor.umap_of_ArrVal_vdomain
lemma (in is_functor) umap_fo_ArrVal_vdomain:
assumes "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
shows "πβ©β (umap_fo π c r u dβ¦ArrValβ¦) = Hom π d r"
unfolding umap_fo_components[OF assms] by simp
lemmas [cat_cs_simps] = is_functor.umap_fo_ArrVal_vdomain
lemma (in is_functor) umap_of_ArrVal_app:
assumes "f' : r β¦βπβ d" and "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "umap_of π c r u dβ¦ArrValβ¦β¦f'β¦ = πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπ
β u"
using assms(1) unfolding umap_of_components[OF assms(2)] by simp
lemmas [cat_cs_simps] = is_functor.umap_of_ArrVal_app
lemma (in is_functor) umap_fo_ArrVal_app:
assumes "f' : d β¦βπβ r" and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
shows "umap_fo π c r u dβ¦ArrValβ¦β¦f'β¦ = u ββ©Aβπ
β πβ¦ArrMapβ¦β¦f'β¦"
proof-
from assms have "πβ¦ArrMapβ¦β¦f'β¦ : πβ¦ObjMapβ¦β¦dβ¦ β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
by (auto intro: cat_cs_intros)
from this assms(2) have πf'[simp]:
"πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβop_cat π
β u = u ββ©Aβπ
β πβ¦ArrMapβ¦β¦f'β¦"
by (simp add: cat_op_simps)
from
is_functor_axioms
is_functor.umap_of_ArrVal_app[
OF is_functor_op, unfolded cat_op_simps,
OF assms
]
show ?thesis
by (simp add: cat_op_simps cat_cs_simps)
qed
lemmas [cat_cs_simps] = is_functor.umap_fo_ArrVal_app
lemma (in is_functor) umap_of_ArrVal_vrange:
assumes "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "ββ©β (umap_of π c r u dβ¦ArrValβ¦) ββ©β Hom π
c (πβ¦ObjMapβ¦β¦dβ¦)"
proof(intro vsubset_antisym vsubsetI)
interpret vsv βΉumap_of π c r u dβ¦ArrValβ¦βΊ
unfolding umap_of_components[OF assms] by simp
fix g assume "g ββ©β ββ©β (umap_of π c r u dβ¦ArrValβ¦)"
then obtain f'
where g_def: "g = umap_of π c r u dβ¦ArrValβ¦β¦f'β¦"
and f': "f' ββ©β πβ©β (umap_of π c r u dβ¦ArrValβ¦)"
unfolding umap_of_components[OF assms] by auto
then have f': "f' : r β¦βπβ d"
unfolding umap_of_ArrVal_vdomain[OF assms] by simp
then have πf': "πβ¦ArrMapβ¦β¦f'β¦ : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β πβ¦ObjMapβ¦β¦dβ¦"
by (auto intro!: cat_cs_intros)
have g_def: "g = πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπ
β u"
unfolding g_def umap_of_ArrVal_app[OF f' assms]..
from πf' assms show "g ββ©β Hom π
c (πβ¦ObjMapβ¦β¦dβ¦)"
unfolding g_def by (auto intro: cat_cs_intros)
qed
lemma (in is_functor) umap_fo_ArrVal_vrange:
assumes "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
shows "ββ©β (umap_fo π c r u dβ¦ArrValβ¦) ββ©β Hom π
(πβ¦ObjMapβ¦β¦dβ¦) c"
by
(
rule is_functor.umap_of_ArrVal_vrange[
OF is_functor_op, unfolded cat_op_simps, OF assms, folded umap_fo_def
]
)
subsubsectionβΉUniversal map is an arrow in the category βΉSetβΊβΊ
lemma (in is_functor) cf_arr_Set_umap_of:
assumes "category Ξ± π"
and "category Ξ± π
"
and r: "r ββ©β πβ¦Objβ¦"
and d: "d ββ©β πβ¦Objβ¦"
and u: "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "arr_Set Ξ± (umap_of π c r u d)"
proof(intro arr_SetI)
interpret HomDom: category Ξ± π by (rule assms(1))
interpret HomCod: category Ξ± π
by (rule assms(2))
note umap_of_components = umap_of_components[OF u]
from u d have c: "c ββ©β π
β¦Objβ¦" and πd: "(πβ¦ObjMapβ¦β¦dβ¦) ββ©β π
β¦Objβ¦"
by (auto intro: cat_cs_intros)
show "vfsequence (umap_of π c r u d)" unfolding umap_of_def by simp
show "vcard (umap_of π c r u d) = 3β©β"
unfolding umap_of_def by (simp add: nat_omega_simps)
from umap_of_ArrVal_vrange[OF u] show
"ββ©β (umap_of π c r u dβ¦ArrValβ¦) ββ©β umap_of π c r u dβ¦ArrCodβ¦"
unfolding umap_of_components by simp
from r d show "umap_of π c r u dβ¦ArrDomβ¦ ββ©β Vset Ξ±"
unfolding umap_of_components by (intro HomDom.cat_Hom_in_Vset)
from c πd show "umap_of π c r u dβ¦ArrCodβ¦ ββ©β Vset Ξ±"
unfolding umap_of_components by (intro HomCod.cat_Hom_in_Vset)
qed (auto simp: umap_of_components[OF u])
lemma (in is_functor) cf_arr_Set_umap_fo:
assumes "category Ξ± π"
and "category Ξ± π
"
and r: "r ββ©β πβ¦Objβ¦"
and d: "d ββ©β πβ¦Objβ¦"
and u: "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
shows "arr_Set Ξ± (umap_fo π c r u d)"
proof-
from assms(1) have π: "category Ξ± (op_cat π)"
by (auto intro: cat_cs_intros)
from assms(2) have π
: "category Ξ± (op_cat π
)"
by (auto intro: cat_cs_intros)
show ?thesis
by
(
rule
is_functor.cf_arr_Set_umap_of[
OF is_functor_op, unfolded cat_op_simps, OF π π
r d u
]
)
qed
lemma (in is_functor) cf_umap_of_is_arr:
assumes "category Ξ± π"
and "category Ξ± π
"
and "r ββ©β πβ¦Objβ¦"
and "d ββ©β πβ¦Objβ¦"
and "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "umap_of π c r u d : Hom π r d β¦βcat_Set Ξ±β Hom π
c (πβ¦ObjMapβ¦β¦dβ¦)"
proof(intro cat_Set_is_arrI)
show "arr_Set Ξ± (umap_of π c r u d)"
by (rule cf_arr_Set_umap_of[OF assms])
qed (simp_all add: umap_of_components[OF assms(5)])
lemma (in is_functor) cf_umap_of_is_arr':
assumes "category Ξ± π"
and "category Ξ± π
"
and "r ββ©β πβ¦Objβ¦"
and "d ββ©β πβ¦Objβ¦"
and "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
and "A = Hom π r d"
and "B = Hom π
c (πβ¦ObjMapβ¦β¦dβ¦)"
and "β = cat_Set Ξ±"
shows "umap_of π c r u d : A β¦βββ B"
using assms(1-5) unfolding assms(6-8) by (rule cf_umap_of_is_arr)
lemmas [cat_cs_intros] = is_functor.cf_umap_of_is_arr'
lemma (in is_functor) cf_umap_fo_is_arr:
assumes "category Ξ± π"
and "category Ξ± π
"
and "r ββ©β πβ¦Objβ¦"
and "d ββ©β πβ¦Objβ¦"
and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
shows "umap_fo π c r u d : Hom π d r β¦βcat_Set Ξ±β Hom π
(πβ¦ObjMapβ¦β¦dβ¦) c"
proof(intro cat_Set_is_arrI)
show "arr_Set Ξ± (umap_fo π c r u d)"
by (rule cf_arr_Set_umap_fo[OF assms])
qed (simp_all add: umap_fo_components[OF assms(5)])
lemma (in is_functor) cf_umap_fo_is_arr':
assumes "category Ξ± π"
and "category Ξ± π
"
and "r ββ©β πβ¦Objβ¦"
and "d ββ©β πβ¦Objβ¦"
and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
and "A = Hom π d r"
and "B = Hom π
(πβ¦ObjMapβ¦β¦dβ¦) c"
and "β = cat_Set Ξ±"
shows "umap_fo π c r u d : A β¦βββ B"
using assms(1-5) unfolding assms(6-8) by (rule cf_umap_fo_is_arr)
lemmas [cat_cs_intros] = is_functor.cf_umap_fo_is_arr'
subsectionβΉUniversal arrow: definition and elementary propertiesβΊ
textβΉSee Chapter III-1 in \cite{mac_lane_categories_2010}.βΊ
definition universal_arrow_of :: "V β V β V β V β bool"
where "universal_arrow_of π c r u β·
(
r ββ©β πβ¦HomDomβ¦β¦Objβ¦ β§
u : c β¦βπβ¦HomCodβ¦β πβ¦ObjMapβ¦β¦rβ¦ β§
(
βr' u'.
r' ββ©β πβ¦HomDomβ¦β¦Objβ¦ βΆ
u' : c β¦βπβ¦HomCodβ¦β πβ¦ObjMapβ¦β¦r'β¦ βΆ
(β!f'. f' : r β¦βπβ¦HomDomβ¦β r' β§ u' = umap_of π c r u r'β¦ArrValβ¦β¦f'β¦)
)
)"
definition universal_arrow_fo :: "V β V β V β V β bool"
where "universal_arrow_fo π c r u β‘ universal_arrow_of (op_cf π) c r u"
textβΉRules.βΊ
mk_ide (in is_functor) rf
universal_arrow_of_def[where π=π, unfolded cf_HomDom cf_HomCod]
|intro universal_arrow_ofI|
|dest universal_arrow_ofD[dest]|
|elim universal_arrow_ofE[elim]|
lemma (in is_functor) universal_arrow_foI:
assumes "r ββ©β πβ¦Objβ¦"
and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
and "βr' u'. β¦ r' ββ©β πβ¦Objβ¦; u' : πβ¦ObjMapβ¦β¦r'β¦ β¦βπ
β c β§ βΉ
β!f'. f' : r' β¦βπβ r β§ u' = umap_fo π c r u r'β¦ArrValβ¦β¦f'β¦"
shows "universal_arrow_fo π c r u"
by
(
simp add:
is_functor.universal_arrow_ofI
[
OF is_functor_op,
folded universal_arrow_fo_def,
unfolded cat_op_simps,
OF assms
]
)
lemma (in is_functor) universal_arrow_foD[dest]:
assumes "universal_arrow_fo π c r u"
shows "r ββ©β πβ¦Objβ¦"
and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
and "βr' u'. β¦ r' ββ©β πβ¦Objβ¦; u' : πβ¦ObjMapβ¦β¦r'β¦ β¦βπ
β c β§ βΉ
β!f'. f' : r' β¦βπβ r β§ u' = umap_fo π c r u r'β¦ArrValβ¦β¦f'β¦"
by
(
auto simp:
is_functor.universal_arrow_ofD
[
OF is_functor_op,
folded universal_arrow_fo_def,
unfolded cat_op_simps,
OF assms
]
)
lemma (in is_functor) universal_arrow_foE[elim]:
assumes "universal_arrow_fo π c r u"
obtains "r ββ©β πβ¦Objβ¦"
and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
and "βr' u'. β¦ r' ββ©β πβ¦Objβ¦; u' : πβ¦ObjMapβ¦β¦r'β¦ β¦βπ
β c β§ βΉ
β!f'. f' : r' β¦βπβ r β§ u' = umap_fo π c r u r'β¦ArrValβ¦β¦f'β¦"
using assms by (auto simp: universal_arrow_foD)
textβΉElementary properties.βΊ
lemma (in is_functor) op_cf_universal_arrow_of[cat_op_simps]:
"universal_arrow_of (op_cf π) c r u β· universal_arrow_fo π c r u"
unfolding universal_arrow_fo_def ..
lemma (in is_functor) op_cf_universal_arrow_fo[cat_op_simps]:
"universal_arrow_fo (op_cf π) c r u β· universal_arrow_of π c r u"
unfolding universal_arrow_fo_def cat_op_simps ..
lemmas (in is_functor) [cat_op_simps] =
is_functor.op_cf_universal_arrow_of
is_functor.op_cf_universal_arrow_fo
subsectionβΉUniquenessβΊ
textβΉ
The following properties are related to the uniqueness of the
universal arrow. These properties can be inferred from the content of
Chapter III-1 in \cite{mac_lane_categories_2010}.
βΊ
lemma (in is_functor) cf_universal_arrow_of_ex_is_arr_isomorphism:
assumes "universal_arrow_of π c r u" and "universal_arrow_of π c r' u'"
obtains f where "f : r β¦β©iβ©sβ©oβπβ r'" and "u' = umap_of π c r u r'β¦ArrValβ¦β¦fβ¦"
proof-
note ua1 = universal_arrow_ofD[OF assms(1)]
note ua2 = universal_arrow_ofD[OF assms(2)]
from ua1(1) have πr: "πβ¦CIdβ¦β¦rβ¦ : r β¦βπβ r" by (auto intro: cat_cs_intros)
from ua1(1) have "πβ¦ArrMapβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦ = π
β¦CIdβ¦β¦πβ¦ObjMapβ¦β¦rβ¦β¦"
by (auto intro: cat_cs_intros)
with ua1(1,2) have u_def: "u = umap_of π c r u rβ¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦"
unfolding umap_of_ArrVal_app[OF πr ua1(2)] by (auto simp: cat_cs_simps)
from ua2(1) have πr': "πβ¦CIdβ¦β¦r'β¦ : r' β¦βπβ r'" by (auto intro: cat_cs_intros)
from ua2(1) have "πβ¦ArrMapβ¦β¦πβ¦CIdβ¦β¦r'β¦β¦ = π
β¦CIdβ¦β¦πβ¦ObjMapβ¦β¦r'β¦β¦"
by (auto intro: cat_cs_intros)
with ua2(1,2) have u'_def: "u' = umap_of π c r' u' r'β¦ArrValβ¦β¦πβ¦CIdβ¦β¦r'β¦β¦"
unfolding umap_of_ArrVal_app[OF πr' ua2(2)] by (auto simp: cat_cs_simps)
from πr u_def universal_arrow_ofD(3)[OF assms(1) ua1(1,2)] have eq_CId_rI:
"β¦ f' : r β¦βπβ r; u = umap_of π c r u rβ¦ArrValβ¦β¦f'β¦ β§ βΉ f' = πβ¦CIdβ¦β¦rβ¦"
for f'
by blast
from πr' u'_def universal_arrow_ofD(3)[OF assms(2) ua2(1,2)] have eq_CId_r'I:
"β¦ f' : r' β¦βπβ r'; u' = umap_of π c r' u' r'β¦ArrValβ¦β¦f'β¦ β§ βΉ
f' = πβ¦CIdβ¦β¦r'β¦"
for f'
by blast
from ua1(3)[OF ua2(1,2)] obtain f
where f: "f : r β¦βπβ r'"
and u'_def: "u' = umap_of π c r u r'β¦ArrValβ¦β¦fβ¦"
and "g : r β¦βπβ r' βΉ u' = umap_of π c r u r'β¦ArrValβ¦β¦gβ¦ βΉ f = g"
for g
by metis
from ua2(3)[OF ua1(1,2)] obtain f'
where f': "f' : r' β¦βπβ r"
and u_def: "u = umap_of π c r' u' rβ¦ArrValβ¦β¦f'β¦"
and "g : r' β¦βπβ r βΉ u = umap_of π c r' u' rβ¦ArrValβ¦β¦gβ¦ βΉ f' = g"
for g
by metis
have "f : r β¦β©iβ©sβ©oβπβ r'"
proof(intro is_arr_isomorphismI is_inverseI)
show f: "f : r β¦βπβ r'" by (rule f)
show f': "f' : r' β¦βπβ r" by (rule f')
show "f : r β¦βπβ r'" by (rule f)
from f' have πf': "πβ¦ArrMapβ¦β¦f'β¦ : πβ¦ObjMapβ¦β¦r'β¦ β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
by (auto intro: cat_cs_intros)
from f have πf: "πβ¦ArrMapβ¦β¦fβ¦ : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β πβ¦ObjMapβ¦β¦r'β¦"
by (auto intro: cat_cs_intros)
note u'_def' = u'_def[symmetric, unfolded umap_of_ArrVal_app[OF f ua1(2)]]
and u_def' = u_def[symmetric, unfolded umap_of_ArrVal_app[OF f' ua2(2)]]
show "f' ββ©Aβπβ f = πβ¦CIdβ¦β¦rβ¦"
proof(rule eq_CId_rI)
from f f' show f'f: "f' ββ©Aβπβ f : r β¦βπβ r"
by (auto intro: cat_cs_intros)
from ua1(2) πf' πf show "u = umap_of π c r u rβ¦ArrValβ¦β¦f' ββ©Aβπβ fβ¦"
unfolding umap_of_ArrVal_app[OF f'f ua1(2)] cf_ArrMap_Comp[OF f' f]
by (simp add: HomCod.cat_Comp_assoc u'_def' u_def')
qed
show "f ββ©Aβπβ f' = πβ¦CIdβ¦β¦r'β¦"
proof(rule eq_CId_r'I)
from f f' show ff': "f ββ©Aβπβ f' : r' β¦βπβ r'"
by (auto intro: cat_cs_intros)
from ua2(2) πf' πf show "u' = umap_of π c r' u' r'β¦ArrValβ¦β¦f ββ©Aβπβ f'β¦"
unfolding umap_of_ArrVal_app[OF ff' ua2(2)] cf_ArrMap_Comp[OF f f']
by (simp add: HomCod.cat_Comp_assoc u'_def' u_def')
qed
qed
with u'_def that show ?thesis by auto
qed
lemma (in is_functor) cf_universal_arrow_fo_ex_is_arr_isomorphism:
assumes "universal_arrow_fo π c r u"
and "universal_arrow_fo π c r' u'"
obtains f where "f : r' β¦β©iβ©sβ©oβπβ r" and "u' = umap_fo π c r u r'β¦ArrValβ¦β¦fβ¦"
by
(
elim
is_functor.cf_universal_arrow_of_ex_is_arr_isomorphism[
OF is_functor_op, unfolded cat_op_simps, OF assms
]
)
lemma (in is_functor) cf_universal_arrow_of_unique:
assumes "universal_arrow_of π c r u"
and "universal_arrow_of π c r' u'"
shows "β!f'. f' : r β¦βπβ r' β§ u' = umap_of π c r u r'β¦ArrValβ¦β¦f'β¦"
proof-
note ua1 = universal_arrow_ofD[OF assms(1)]
note ua2 = universal_arrow_ofD[OF assms(2)]
from ua1(3)[OF ua2(1,2)] show ?thesis .
qed
lemma (in is_functor) cf_universal_arrow_fo_unique:
assumes "universal_arrow_fo π c r u"
and "universal_arrow_fo π c r' u'"
shows "β!f'. f' : r' β¦βπβ r β§ u' = umap_fo π c r u r'β¦ArrValβ¦β¦f'β¦"
proof-
note ua1 = universal_arrow_foD[OF assms(1)]
note ua2 = universal_arrow_foD[OF assms(2)]
from ua1(3)[OF ua2(1,2)] show ?thesis .
qed
lemma (in is_functor) cf_universal_arrow_of_is_arr_isomorphism:
assumes "universal_arrow_of π c r u"
and "universal_arrow_of π c r' u'"
and "f : r β¦βπβ r'"
and "u' = umap_of π c r u r'β¦ArrValβ¦β¦fβ¦"
shows "f : r β¦β©iβ©sβ©oβπβ r'"
proof-
from assms(3,4) cf_universal_arrow_of_unique[OF assms(1,2)] have eq:
"g : r β¦βπβ r' βΉ u' = umap_of π c r u r'β¦ArrValβ¦β¦gβ¦ βΉ f = g" for g
by blast
from assms(1,2) obtain f'
where iso_f': "f' : r β¦β©iβ©sβ©oβπβ r'"
and u'_def: "u' = umap_of π c r u r'β¦ArrValβ¦β¦f'β¦"
by (auto elim: cf_universal_arrow_of_ex_is_arr_isomorphism)
then have f': "f' : r β¦βπβ r'" by auto
from iso_f' show ?thesis unfolding eq[OF f' u'_def, symmetric].
qed
lemma (in is_functor) cf_universal_arrow_fo_is_arr_isomorphism:
assumes "universal_arrow_fo π c r u"
and "universal_arrow_fo π c r' u'"
and "f : r' β¦βπβ r"
and "u' = umap_fo π c r u r'β¦ArrValβ¦β¦fβ¦"
shows "f : r' β¦β©iβ©sβ©oβπβ r"
by
(
rule
is_functor.cf_universal_arrow_of_is_arr_isomorphism[
OF is_functor_op, unfolded cat_op_simps, OF assms
]
)
subsectionβΉUniversal natural transformationβΊ
subsubsectionβΉDefinition and elementary propertiesβΊ
textβΉ
The concept of the universal natural transformation is introduced for the
statement of the elements of a variant of Proposition 1 in Chapter III-2
in \cite{mac_lane_categories_2010}.
βΊ
definition ntcf_ua_of :: "V β V β V β V β V β V"
where "ntcf_ua_of Ξ± π c r u =
[
(Ξ»dββ©βπβ¦HomDomβ¦β¦Objβ¦. umap_of π c r u d),
Homβ©Oβ©.β©CβΞ±βπβ¦HomDomβ¦(r,-),
Homβ©Oβ©.β©CβΞ±βπβ¦HomCodβ¦(c,-) ββ©Cβ©F π,
πβ¦HomDomβ¦,
cat_Set Ξ±
]β©β"
definition ntcf_ua_fo :: "V β V β V β V β V β V"
where "ntcf_ua_fo Ξ± π c r u = ntcf_ua_of Ξ± (op_cf π) c r u"
textβΉComponents.βΊ
lemma ntcf_ua_of_components:
shows "ntcf_ua_of Ξ± π c r uβ¦NTMapβ¦ = (Ξ»dββ©βπβ¦HomDomβ¦β¦Objβ¦. umap_of π c r u d)"
and "ntcf_ua_of Ξ± π c r uβ¦NTDomβ¦ = Homβ©Oβ©.β©CβΞ±βπβ¦HomDomβ¦(r,-)"
and "ntcf_ua_of Ξ± π c r uβ¦NTCodβ¦ = Homβ©Oβ©.β©CβΞ±βπβ¦HomCodβ¦(c,-) ββ©Cβ©F π"
and "ntcf_ua_of Ξ± π c r uβ¦NTDGDomβ¦ = πβ¦HomDomβ¦"
and "ntcf_ua_of Ξ± π c r uβ¦NTDGCodβ¦ = cat_Set Ξ±"
unfolding ntcf_ua_of_def nt_field_simps by (simp_all add: nat_omega_simps)
lemma ntcf_ua_fo_components:
shows "ntcf_ua_fo Ξ± π c r uβ¦NTMapβ¦ = (Ξ»dββ©βπβ¦HomDomβ¦β¦Objβ¦. umap_fo π c r u d)"
and "ntcf_ua_fo Ξ± π c r uβ¦NTDomβ¦ = Homβ©Oβ©.β©CβΞ±βop_cat (πβ¦HomDomβ¦)(r,-)"
and "ntcf_ua_fo Ξ± π c r uβ¦NTCodβ¦ =
Homβ©Oβ©.β©CβΞ±βop_cat (πβ¦HomCodβ¦)(c,-) ββ©Cβ©F op_cf π"
and "ntcf_ua_fo Ξ± π c r uβ¦NTDGDomβ¦ = op_cat (πβ¦HomDomβ¦)"
and "ntcf_ua_fo Ξ± π c r uβ¦NTDGCodβ¦ = cat_Set Ξ±"
unfolding ntcf_ua_fo_def ntcf_ua_of_components umap_fo_def cat_op_simps
by simp_all
context is_functor
begin
lemmas ntcf_ua_of_components' =
ntcf_ua_of_components[where Ξ±=Ξ± and π=π, unfolded cat_cs_simps]
lemmas [cat_cs_simps] = ntcf_ua_of_components'(2-5)
lemma ntcf_ua_fo_components':
assumes "c ββ©β π
β¦Objβ¦" and "r ββ©β πβ¦Objβ¦"
shows "ntcf_ua_fo Ξ± π c r uβ¦NTMapβ¦ = (Ξ»dββ©βπβ¦Objβ¦. umap_fo π c r u d)"
and [cat_cs_simps]:
"ntcf_ua_fo Ξ± π c r uβ¦NTDomβ¦ = Homβ©Oβ©.β©CβΞ±βπ(-,r)"
and [cat_cs_simps]:
"ntcf_ua_fo Ξ± π c r uβ¦NTCodβ¦ = Homβ©Oβ©.β©CβΞ±βπ
(-,c) ββ©Cβ©F op_cf π"
and [cat_cs_simps]: "ntcf_ua_fo Ξ± π c r uβ¦NTDGDomβ¦ = op_cat π"
and [cat_cs_simps]: "ntcf_ua_fo Ξ± π c r uβ¦NTDGCodβ¦ = cat_Set Ξ±"
unfolding
ntcf_ua_fo_components cat_cs_simps
HomDom.cat_op_cat_cf_Hom_snd[OF assms(2)]
HomCod.cat_op_cat_cf_Hom_snd[OF assms(1)]
by simp_all
end
lemmas [cat_cs_simps] =
is_functor.ntcf_ua_of_components'(2-5)
is_functor.ntcf_ua_fo_components'(2-5)
subsubsectionβΉNatural transformation mapβΊ
mk_VLambda (in is_functor)
ntcf_ua_of_components(1)[where Ξ±=Ξ± and π=π, unfolded cf_HomDom]
|vsv ntcf_ua_of_NTMap_vsv|
|vdomain ntcf_ua_of_NTMap_vdomain|
|app ntcf_ua_of_NTMap_app|
context is_functor
begin
context
fixes c r
assumes r: "r ββ©β πβ¦Objβ¦" and c: "c ββ©β π
β¦Objβ¦"
begin
mk_VLambda ntcf_ua_fo_components'(1)[OF c r]
|vsv ntcf_ua_fo_NTMap_vsv|
|vdomain ntcf_ua_fo_NTMap_vdomain|
|app ntcf_ua_fo_NTMap_app|
end
end
lemmas [cat_cs_intros] =
is_functor.ntcf_ua_fo_NTMap_vsv
is_functor.ntcf_ua_of_NTMap_vsv
lemmas [cat_cs_simps] =
is_functor.ntcf_ua_fo_NTMap_vdomain
is_functor.ntcf_ua_fo_NTMap_app
is_functor.ntcf_ua_of_NTMap_vdomain
is_functor.ntcf_ua_of_NTMap_app
lemma (in is_functor) ntcf_ua_of_NTMap_vrange:
assumes "category Ξ± π"
and "category Ξ± π
"
and "r ββ©β πβ¦Objβ¦"
and "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "ββ©β (ntcf_ua_of Ξ± π c r uβ¦NTMapβ¦) ββ©β cat_Set Ξ±β¦Arrβ¦"
proof(rule vsv.vsv_vrange_vsubset, unfold ntcf_ua_of_NTMap_vdomain)
show "vsv (ntcf_ua_of Ξ± π c r uβ¦NTMapβ¦)" by (rule ntcf_ua_of_NTMap_vsv)
fix d assume prems: "d ββ©β πβ¦Objβ¦"
with category_cat_Set is_functor_axioms assms show
"ntcf_ua_of Ξ± π c r uβ¦NTMapβ¦β¦dβ¦ ββ©β cat_Set Ξ±β¦Arrβ¦"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
qed
subsubsectionβΉCommutativity of the universal maps and βΉhomβΊ-functionsβΊ
lemma (in is_functor) cf_umap_of_cf_hom_commute:
assumes "category Ξ± π"
and "category Ξ± π
"
and "c ββ©β π
β¦Objβ¦"
and "r ββ©β πβ¦Objβ¦"
and "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
and "f : a β¦βπβ b"
shows
"umap_of π c r u b ββ©Aβcat_Set Ξ±β cf_hom π [πβ¦CIdβ¦β¦rβ¦, f]β©β =
cf_hom π
[π
β¦CIdβ¦β¦cβ¦, πβ¦ArrMapβ¦β¦fβ¦]β©β ββ©Aβcat_Set Ξ±β umap_of π c r u a"
(is βΉ?uof_b ββ©Aβcat_Set Ξ±β ?rf = ?cf ββ©Aβcat_Set Ξ±β ?uof_aβΊ)
proof-
from is_functor_axioms category_cat_Set assms(1,2,4-6) have b_rf:
"?uof_b ββ©Aβcat_Set Ξ±β ?rf : Hom π r a β¦βcat_Set Ξ±β Hom π
c (πβ¦ObjMapβ¦β¦bβ¦)"
by (cs_concl cs_intro: cat_cs_intros cat_op_intros cat_prod_cs_intros)
from is_functor_axioms category_cat_Set assms(1,2,4-6) have cf_a:
"?cf ββ©Aβcat_Set Ξ±β ?uof_a : Hom π r a β¦βcat_Set Ξ±β Hom π
c (πβ¦ObjMapβ¦β¦bβ¦)"
by (cs_concl cs_intro: cat_cs_intros cat_op_intros cat_prod_cs_intros)
show ?thesis
proof(rule arr_Set_eqI[of Ξ±])
from b_rf show arr_Set_b_rf: "arr_Set Ξ± (?uof_b ββ©Aβcat_Set Ξ±β ?rf)"
by (auto dest: cat_Set_is_arrD(1))
from b_rf have dom_lhs:
"πβ©β ((?uof_b ββ©Aβcat_Set Ξ±β ?rf)β¦ArrValβ¦) = Hom π r a"
by (cs_concl cs_simp: cat_cs_simps)+
from cf_a show arr_Set_cf_a: "arr_Set Ξ± (?cf ββ©Aβcat_Set Ξ±β ?uof_a)"
by (auto dest: cat_Set_is_arrD(1))
from cf_a have dom_rhs:
"πβ©β ((?cf ββ©Aβcat_Set Ξ±β ?uof_a)β¦ArrValβ¦) = Hom π r a"
by (cs_concl cs_simp: cat_cs_simps)
show "(?uof_b ββ©Aβcat_Set Ξ±β ?rf)β¦ArrValβ¦ = (?cf ββ©Aβcat_Set Ξ±β ?uof_a)β¦ArrValβ¦"
proof(rule vsv_eqI, unfold dom_lhs dom_rhs in_Hom_iff)
fix q assume "q : r β¦βπβ a"
with is_functor_axioms category_cat_Set assms show
"(?uof_b ββ©Aβcat_Set Ξ±β ?rf)β¦ArrValβ¦β¦qβ¦ =
(?cf ββ©Aβcat_Set Ξ±β ?uof_a)β¦ArrValβ¦β¦qβ¦"
by
(
cs_concl
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_op_intros cat_prod_cs_intros
)
qed (use arr_Set_b_rf arr_Set_cf_a in auto)
qed (use b_rf cf_a in βΉcs_concl cs_simp: cat_cs_simpsβΊ)+
qed
lemma cf_umap_of_cf_hom_unit_commute:
assumes "category Ξ± β"
and "category Ξ± π"
and "π : β β¦β¦β©CβΞ±β π"
and "π : π β¦β¦β©CβΞ±β β"
and "Ξ· : cf_id β β¦β©Cβ©F π ββ©Cβ©F π : β β¦β¦β©CβΞ±β β"
and "g : c' β¦βββ c"
and "f : d β¦βπβ d'"
shows
"umap_of π c' (πβ¦ObjMapβ¦β¦c'β¦) (Ξ·β¦NTMapβ¦β¦c'β¦) d' ββ©Aβcat_Set Ξ±β
cf_hom π [πβ¦ArrMapβ¦β¦gβ¦, f]β©β =
cf_hom β [g, πβ¦ArrMapβ¦β¦fβ¦]β©β ββ©Aβcat_Set Ξ±β
umap_of π c (πβ¦ObjMapβ¦β¦cβ¦) (Ξ·β¦NTMapβ¦β¦cβ¦) d"
(is βΉ?uof_c'd' ββ©Aβcat_Set Ξ±β ?πgf = ?gπf ββ©Aβcat_Set Ξ±β ?uof_cdβΊ)
proof-
interpret Ξ·: is_ntcf Ξ± β β βΉcf_id ββΊ βΉπ ββ©Cβ©F πβΊ Ξ· by (rule assms(5))
from assms have c'd'_πgf: "?uof_c'd' ββ©Aβcat_Set Ξ±β ?πgf :
Hom π (πβ¦ObjMapβ¦β¦cβ¦) d β¦βcat_Set Ξ±β Hom β c' (πβ¦ObjMapβ¦β¦d'β¦)"
by
(
cs_concl
cs_simp: cat_cs_simps
cs_intro: cat_cs_intros cat_op_intros cat_prod_cs_intros
)
then have dom_lhs:
"πβ©β ((?uof_c'd' ββ©Aβcat_Set Ξ±β ?πgf)β¦ArrValβ¦) = Hom π (πβ¦ObjMapβ¦β¦cβ¦) d"
by (cs_concl cs_simp: cat_cs_simps)
from assms have gπf_cd: "?gπf ββ©Aβcat_Set Ξ±β ?uof_cd :
Hom π (πβ¦ObjMapβ¦β¦cβ¦) d β¦βcat_Set Ξ±β Hom β c' (πβ¦ObjMapβ¦β¦d'β¦)"
by
(
cs_concl
cs_simp: cat_cs_simps
cs_intro: cat_cs_intros cat_op_intros cat_prod_cs_intros
)
then have dom_rhs:
"πβ©β ((?gπf ββ©Aβcat_Set Ξ±β ?uof_cd)β¦ArrValβ¦) = Hom π (πβ¦ObjMapβ¦β¦cβ¦) d"
by (cs_concl cs_simp: cat_cs_simps)
show ?thesis
proof(rule arr_Set_eqI[of Ξ±])
from c'd'_πgf show arr_Set_c'd'_πgf:
"arr_Set Ξ± (?uof_c'd' ββ©Aβcat_Set Ξ±β ?πgf)"
by (auto dest: cat_Set_is_arrD(1))
from gπf_cd show arr_Set_gπf_cd:
"arr_Set Ξ± (?gπf ββ©Aβcat_Set Ξ±β ?uof_cd)"
by (auto dest: cat_Set_is_arrD(1))
show
"(?uof_c'd' ββ©Aβcat_Set Ξ±β ?πgf)β¦ArrValβ¦ =
(?gπf ββ©Aβcat_Set Ξ±β ?uof_cd)β¦ArrValβ¦"
proof(rule vsv_eqI, unfold dom_lhs dom_rhs in_Hom_iff)
fix h assume prems: "h : πβ¦ObjMapβ¦β¦cβ¦ β¦βπβ d"
from Ξ·.ntcf_Comp_commute[OF assms(6)] assms have [cat_cs_simps]:
"Ξ·β¦NTMapβ¦β¦cβ¦ ββ©Aβββ g = πβ¦ArrMapβ¦β¦πβ¦ArrMapβ¦β¦gβ¦β¦ ββ©Aβββ Ξ·β¦NTMapβ¦β¦c'β¦"
by (cs_prems cs_simp: cat_cs_simps cat_op_simps cs_intro: cat_cs_intros)
from assms prems show
"(?uof_c'd' ββ©Aβcat_Set Ξ±β ?πgf)β¦ArrValβ¦β¦hβ¦ =
(?gπf ββ©Aβcat_Set Ξ±β ?uof_cd)β¦ArrValβ¦β¦hβ¦"
by
(
cs_concl
cs_intro: cat_cs_intros cat_op_intros cat_prod_cs_intros
cs_simp: cat_cs_simps
)
qed (use arr_Set_c'd'_πgf arr_Set_gπf_cd in auto)
qed (use c'd'_πgf gπf_cd in βΉcs_concl cs_simp: cat_cs_simpsβΊ)+
qed
subsubsectionβΉUniversal natural transformation is a natural transformationβΊ
lemma (in is_functor) cf_ntcf_ua_of_is_ntcf:
assumes "r ββ©β πβ¦Objβ¦"
and "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
shows "ntcf_ua_of Ξ± π c r u :
Homβ©Oβ©.β©CβΞ±βπ(r,-) β¦β©Cβ©F Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π : π β¦β¦β©CβΞ±β cat_Set Ξ±"
proof(intro is_ntcfI')
let ?ua = βΉntcf_ua_of Ξ± π c r uβΊ
show "vfsequence (ntcf_ua_of Ξ± π c r u)" unfolding ntcf_ua_of_def by simp
show "vcard ?ua = 5β©β" unfolding ntcf_ua_of_def by (simp add: nat_omega_simps)
from assms(1) show "Homβ©Oβ©.β©CβΞ±βπ(r,-) : π β¦β¦β©CβΞ±β cat_Set Ξ±"
by (cs_concl cs_intro: cat_cs_intros)
from is_functor_axioms assms(2) show
"Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π : π β¦β¦β©CβΞ±β cat_Set Ξ±"
by (cs_concl cs_intro: cat_cs_intros)
from is_functor_axioms assms show "πβ©β (?uaβ¦NTMapβ¦) = πβ¦Objβ¦"
by (cs_concl cs_simp: cat_cs_simps)
show "?uaβ¦NTMapβ¦β¦aβ¦ :
Homβ©Oβ©.β©CβΞ±βπ(r,-)β¦ObjMapβ¦β¦aβ¦ β¦βcat_Set Ξ±β (Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π)β¦ObjMapβ¦β¦aβ¦"
if "a ββ©β πβ¦Objβ¦" for a
using is_functor_axioms assms that
by (cs_concl cs_simp: cat_cs_simps cat_op_simps cs_intro: cat_cs_intros)
show "?uaβ¦NTMapβ¦β¦bβ¦ ββ©Aβcat_Set Ξ±β Homβ©Oβ©.β©CβΞ±βπ(r,-)β¦ArrMapβ¦β¦fβ¦ =
(Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π)β¦ArrMapβ¦β¦fβ¦ ββ©Aβcat_Set Ξ±β ?uaβ¦NTMapβ¦β¦aβ¦"
if "f : a β¦βπβ b" for a b f
using is_functor_axioms assms that
by
(
cs_concl
cs_simp: cf_umap_of_cf_hom_commute cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_op_intros
)
qed (auto simp: ntcf_ua_of_components cat_cs_simps)
lemma (in is_functor) cf_ntcf_ua_fo_is_ntcf:
assumes "r ββ©β πβ¦Objβ¦" and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
shows "ntcf_ua_fo Ξ± π c r u :
Homβ©Oβ©.β©CβΞ±βπ(-,r) β¦β©Cβ©F Homβ©Oβ©.β©CβΞ±βπ
(-,c) ββ©Cβ©F op_cf π :
op_cat π β¦β¦β©CβΞ±β cat_Set Ξ±"
proof-
from assms(2) have c: "c ββ©β π
β¦Objβ¦" by auto
show ?thesis
by
(
rule is_functor.cf_ntcf_ua_of_is_ntcf
[
OF is_functor_op,
unfolded cat_op_simps,
OF assms(1,2),
unfolded
HomDom.cat_op_cat_cf_Hom_snd[OF assms(1)]
HomCod.cat_op_cat_cf_Hom_snd[OF c]
ntcf_ua_fo_def[symmetric]
]
)
qed
subsubsectionβΉUniversal natural transformation and universal arrowβΊ
textβΉ
The lemmas in this subsection correspond to
variants of elements of Proposition 1 in Chapter III-2 in
\cite{mac_lane_categories_2010}.
βΊ
lemma (in is_functor) cf_ntcf_ua_of_is_iso_ntcf:
assumes "universal_arrow_of π c r u"
shows "ntcf_ua_of Ξ± π c r u :
Homβ©Oβ©.β©CβΞ±βπ(r,-) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π : π β¦β¦β©CβΞ±β cat_Set Ξ±"
proof-
have r: "r ββ©β πβ¦Objβ¦"
and u: "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
and bij: "βr' u'.
β¦
r' ββ©β πβ¦Objβ¦;
u' : c β¦βπ
β πβ¦ObjMapβ¦β¦r'β¦
β§ βΉ β!f'. f' : r β¦βπβ r' β§ u' = umap_of π c r u r'β¦ArrValβ¦β¦f'β¦"
by (auto intro!: universal_arrow_ofD[OF assms(1)])
show ?thesis
proof(intro is_iso_ntcfI)
show "ntcf_ua_of Ξ± π c r u :
Homβ©Oβ©.β©CβΞ±βπ(r,-) β¦β©Cβ©F Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π : π β¦β¦β©CβΞ±β cat_Set Ξ±"
by (rule cf_ntcf_ua_of_is_ntcf[OF r u])
fix a assume prems: "a ββ©β πβ¦Objβ¦"
from is_functor_axioms prems r u have [simp]:
"umap_of π c r u a : Hom π r a β¦βcat_Set Ξ±β Hom π
c (πβ¦ObjMapβ¦β¦aβ¦)"
by (cs_concl cs_intro: cat_cs_intros)
then have dom: "πβ©β (umap_of π c r u aβ¦ArrValβ¦) = Hom π r a"
by (cs_concl cs_simp: cat_cs_simps)
have "umap_of π c r u a : Hom π r a β¦β©iβ©sβ©oβcat_Set Ξ±β Hom π
c (πβ¦ObjMapβ¦β¦aβ¦)"
proof(intro cat_Set_is_arr_isomorphismI, unfold dom)
show umof_a: "v11 (umap_of π c r u aβ¦ArrValβ¦)"
proof(intro vsv.vsv_valeq_v11I, unfold dom in_Hom_iff)
fix g f assume prems':
"g : r β¦βπβ a"
"f : r β¦βπβ a"
"umap_of π c r u aβ¦ArrValβ¦β¦gβ¦ = umap_of π c r u aβ¦ArrValβ¦β¦fβ¦"
from is_functor_axioms r u prems'(1) have πg:
"πβ¦ArrMapβ¦β¦gβ¦ ββ©Aβπ
β u : c β¦βπ
β πβ¦ObjMapβ¦β¦aβ¦"
by (cs_concl cs_intro: cat_cs_intros)
from bij[OF prems πg] have unique:
"β¦
f' : r β¦βπβ a;
πβ¦ArrMapβ¦β¦gβ¦ ββ©Aβπ
β u = umap_of π c r u aβ¦ArrValβ¦β¦f'β¦
β§ βΉ g = f'"
for f' by (metis prems'(1) u umap_of_ArrVal_app)
from is_functor_axioms prems'(1,2) u have πg_u:
"πβ¦ArrMapβ¦β¦gβ¦ ββ©Aβπ
β u = umap_of π c r u aβ¦ArrValβ¦β¦fβ¦"
by (cs_concl cs_simp: prems'(3)[symmetric] cat_cs_simps)
show "g = f" by (rule unique[OF prems'(2) πg_u])
qed (auto simp: cat_cs_simps cat_cs_intros)
interpret umof_a: v11 βΉumap_of π c r u aβ¦ArrValβ¦βΊ by (rule umof_a)
show "ββ©β (umap_of π c r u aβ¦ArrValβ¦) = Hom π
c (πβ¦ObjMapβ¦β¦aβ¦)"
proof(intro vsubset_antisym)
from u show "ββ©β (umap_of π c r u aβ¦ArrValβ¦) ββ©β Hom π
c (πβ¦ObjMapβ¦β¦aβ¦)"
by (rule umap_of_ArrVal_vrange)
show "Hom π
c (πβ¦ObjMapβ¦β¦aβ¦) ββ©β ββ©β (umap_of π c r u aβ¦ArrValβ¦)"
proof(rule vsubsetI, unfold in_Hom_iff )
fix f assume prems': "f : c β¦βπ
β πβ¦ObjMapβ¦β¦aβ¦"
from bij[OF prems prems'] obtain f'
where f': "f' : r β¦βπβ a"
and f_def: "f = umap_of π c r u aβ¦ArrValβ¦β¦f'β¦"
by auto
from is_functor_axioms prems prems' u f' have
"f' ββ©β πβ©β (umap_of π c r u aβ¦ArrValβ¦)"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
from this show "f ββ©β ββ©β (umap_of π c r u aβ¦ArrValβ¦)"
unfolding f_def by (rule umof_a.vsv_vimageI2)
qed
qed
qed simp_all
from is_functor_axioms prems r u this show
"ntcf_ua_of Ξ± π c r uβ¦NTMapβ¦β¦aβ¦ :
Homβ©Oβ©.β©CβΞ±βπ(r,-)β¦ObjMapβ¦β¦aβ¦ β¦β©iβ©sβ©oβcat_Set Ξ±β
(Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π)β¦ObjMapβ¦β¦aβ¦"
by
(
cs_concl
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_op_intros
)
qed
qed
lemmas [cat_cs_intros] = is_functor.cf_ntcf_ua_of_is_iso_ntcf
lemma (in is_functor) cf_ntcf_ua_fo_is_iso_ntcf:
assumes "universal_arrow_fo π c r u"
shows "ntcf_ua_fo Ξ± π c r u :
Homβ©Oβ©.β©CβΞ±βπ(-,r) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ±βπ
(-,c) ββ©Cβ©F op_cf π :
op_cat π β¦β¦β©CβΞ±β cat_Set Ξ±"
proof-
from universal_arrow_foD[OF assms] have r: "r ββ©β πβ¦Objβ¦" and c: "c ββ©β π
β¦Objβ¦"
by auto
show ?thesis
by
(
rule is_functor.cf_ntcf_ua_of_is_iso_ntcf
[
OF is_functor_op,
unfolded cat_op_simps,
OF assms,
unfolded
HomDom.cat_op_cat_cf_Hom_snd[OF r]
HomCod.cat_op_cat_cf_Hom_snd[OF c]
ntcf_ua_fo_def[symmetric]
]
)
qed
lemmas [cat_cs_intros] = is_functor.cf_ntcf_ua_fo_is_iso_ntcf
lemma (in is_functor) cf_ua_of_if_ntcf_ua_of_is_iso_ntcf:
assumes "r ββ©β πβ¦Objβ¦"
and "u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
and "ntcf_ua_of Ξ± π c r u :
Homβ©Oβ©.β©CβΞ±βπ(r,-) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π : π β¦β¦β©CβΞ±β cat_Set Ξ±"
shows "universal_arrow_of π c r u"
proof(rule universal_arrow_ofI)
interpret ua_of_u: is_iso_ntcf
Ξ±
π
βΉcat_Set Ξ±βΊ
βΉHomβ©Oβ©.β©CβΞ±βπ(r,-)βΊ
βΉHomβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F πβΊ
βΉntcf_ua_of Ξ± π c r uβΊ
by (rule assms(3))
fix r' u' assume prems: "r' ββ©β πβ¦Objβ¦" "u' : c β¦βπ
β πβ¦ObjMapβ¦β¦r'β¦"
have "ntcf_ua_of Ξ± π c r uβ¦NTMapβ¦β¦r'β¦ :
Homβ©Oβ©.β©CβΞ±βπ(r,-)β¦ObjMapβ¦β¦r'β¦ β¦β©iβ©sβ©oβcat_Set Ξ±β
(Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π)β¦ObjMapβ¦β¦r'β¦"
by (rule is_iso_ntcf.iso_ntcf_is_arr_isomorphism[OF assms(3) prems(1)])
from this is_functor_axioms assms(1-2) prems have uof_r':
"umap_of π c r u r' : Hom π r r' β¦β©iβ©sβ©oβcat_Set Ξ±β Hom π
c (πβ¦ObjMapβ¦β¦r'β¦)"
by (cs_prems cs_simp: cat_cs_simps cs_intro: cat_cs_intros cat_op_intros)
note uof_r' = cat_Set_is_arr_isomorphismD[OF uof_r']
interpret uof_r': v11 βΉumap_of π c r u r'β¦ArrValβ¦βΊ by (rule uof_r'(2))
from
uof_r'.v11_vrange_ex1_eq[
THEN iffD1, unfolded uof_r'(3,4) in_Hom_iff, OF prems(2)
]
show "β!f'. f' : r β¦βπβ r' β§ u' = umap_of π c r u r'β¦ArrValβ¦β¦f'β¦"
by metis
qed (intro assms)+
lemma (in is_functor) cf_ua_fo_if_ntcf_ua_fo_is_iso_ntcf:
assumes "r ββ©β πβ¦Objβ¦"
and "u : πβ¦ObjMapβ¦β¦rβ¦ β¦βπ
β c"
and "ntcf_ua_fo Ξ± π c r u :
Homβ©Oβ©.β©CβΞ±βπ(-,r) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ±βπ
(-,c) ββ©Cβ©F op_cf π :
op_cat π β¦β¦β©CβΞ±β cat_Set Ξ±"
shows "universal_arrow_fo π c r u"
proof-
from assms(2) have c: "c ββ©β π
β¦Objβ¦" by auto
show ?thesis
by
(
rule is_functor.cf_ua_of_if_ntcf_ua_of_is_iso_ntcf
[
OF is_functor_op,
unfolded cat_op_simps,
OF assms(1,2),
unfolded
HomDom.cat_op_cat_cf_Hom_snd[OF assms(1)]
HomCod.cat_op_cat_cf_Hom_snd[OF c]
ntcf_ua_fo_def[symmetric],
OF assms(3)
]
)
qed
lemma (in is_functor) cf_universal_arrow_of_if_is_iso_ntcf:
assumes "r ββ©β πβ¦Objβ¦"
and "c ββ©β π
β¦Objβ¦"
and "Ο :
Homβ©Oβ©.β©CβΞ±βπ(r,-) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π :
π β¦β¦β©CβΞ±β cat_Set Ξ±"
shows "universal_arrow_of π c r (Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦)"
(is βΉuniversal_arrow_of π c r ?uβΊ)
proof-
interpret Ο: is_iso_ntcf
Ξ± π βΉcat_Set Ξ±βΊ βΉHomβ©Oβ©.β©CβΞ±βπ(r,-)βΊ βΉHomβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F πβΊ Ο
by (rule assms(3))
show ?thesis
proof(intro universal_arrow_ofI assms)
from assms(1,2) show u: "?u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
by (cs_concl cs_simp: cat_cs_simps cat_op_simps cs_intro: cat_cs_intros)
fix r' u' assume prems: "r' ββ©β πβ¦Objβ¦" "u' : c β¦βπ
β πβ¦ObjMapβ¦β¦r'β¦"
have Οr'_ArrVal_app[symmetric, cat_cs_simps]:
"Οβ¦NTMapβ¦β¦r'β¦β¦ArrValβ¦β¦f'β¦ =
πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπ
β Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦"
if "f' : r β¦βπβ r'" for f'
proof-
have "Οβ¦NTMapβ¦β¦r'β¦ ββ©Aβcat_Set Ξ±β Homβ©Oβ©.β©CβΞ±βπ(r,-)β¦ArrMapβ¦β¦f'β¦ =
(Homβ©Oβ©.β©CβΞ±βπ
(c,-) ββ©Cβ©F π)β¦ArrMapβ¦β¦f'β¦ ββ©Aβcat_Set Ξ±β Οβ¦NTMapβ¦β¦rβ¦"
using that by (intro Ο.ntcf_Comp_commute)
then have
"Οβ¦NTMapβ¦β¦r'β¦ ββ©Aβcat_Set Ξ±β cf_hom π [πβ¦CIdβ¦β¦rβ¦, f']β©β =
cf_hom π
[π
β¦CIdβ¦β¦cβ¦, πβ¦ArrMapβ¦β¦f'β¦]β©β ββ©Aβcat_Set Ξ±β Οβ¦NTMapβ¦β¦rβ¦"
using assms(1,2) that prems
by (cs_prems cs_simp: cat_cs_simps cat_op_simps cs_intro: cat_cs_intros)
then have
"(Οβ¦NTMapβ¦β¦r'β¦ ββ©Aβcat_Set Ξ±β
cf_hom π [πβ¦CIdβ¦β¦rβ¦, f']β©β)β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦ =
(cf_hom π
[π
β¦CIdβ¦β¦cβ¦, πβ¦ArrMapβ¦β¦f'β¦]β©β ββ©Aβcat_Set Ξ±β
Οβ¦NTMapβ¦β¦rβ¦)β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦"
by simp
from this assms(1,2) u that show ?thesis
by
(
cs_prems
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_op_intros cat_prod_cs_intros
)
qed
show "β!f'. f' : r β¦βπβ r' β§ u' = umap_of π c r ?u r'β¦ArrValβ¦β¦f'β¦"
proof(intro ex1I conjI; (elim conjE)?)
from assms prems show
"(Οβ¦NTMapβ¦β¦r'β¦)Β―β©Cβcat_Set Ξ±ββ¦ArrValβ¦β¦u'β¦ : r β¦βπβ r'"
by
(
cs_concl
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_arrow_cs_intros
)
with assms(1,2) prems show "u' =
umap_of π c r ?u r'β¦ArrValβ¦β¦(Οβ¦NTMapβ¦β¦r'β¦)Β―β©Cβcat_Set Ξ±ββ¦ArrValβ¦β¦u'β¦β¦"
by
(
cs_concl
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_arrow_cs_intros cat_cs_intros cat_op_intros
)
fix f' assume prems':
"f' : r β¦βπβ r'"
"u' = umap_of π c r (Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦) r'β¦ArrValβ¦β¦f'β¦"
from prems'(2,1) assms(1,2) have u'_def:
"u' = πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπ
β Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦"
by
(
cs_prems
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_op_intros
)
from prems' show "f' = (Οβ¦NTMapβ¦β¦r'β¦)Β―β©Cβcat_Set Ξ±ββ¦ArrValβ¦β¦u'β¦"
unfolding u'_def Οr'_ArrVal_app[OF prems'(1)]
by
(
cs_concl
cs_simp: cat_cs_simps
cs_intro: cat_arrow_cs_intros cat_cs_intros cat_op_intros
)
qed
qed
qed
lemma (in is_functor) cf_universal_arrow_fo_if_is_iso_ntcf:
assumes "r ββ©β πβ¦Objβ¦"
and "c ββ©β π
β¦Objβ¦"
and "Ο :
Homβ©Oβ©.β©CβΞ±βπ(-,r) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ±βπ
(-,c) ββ©Cβ©F op_cf π :
op_cat π β¦β¦β©CβΞ±β cat_Set Ξ±"
shows "universal_arrow_fo π c r (Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦)"
by
(
rule is_functor.cf_universal_arrow_of_if_is_iso_ntcf
[
OF is_functor_op,
unfolded cat_op_simps,
OF assms(1,2),
unfolded
HomDom.cat_op_cat_cf_Hom_snd[OF assms(1)]
HomCod.cat_op_cat_cf_Hom_snd[OF assms(2)]
ntcf_ua_fo_def[symmetric],
OF assms(3)
]
)
lemma (in is_functor) cf_universal_arrow_of_if_is_iso_ntcf_if_ge_Limit:
assumes "π΅ Ξ²"
and "Ξ± ββ©β Ξ²"
and "r ββ©β πβ¦Objβ¦"
and "c ββ©β π
β¦Objβ¦"
and "Ο :
Homβ©Oβ©.β©CβΞ²βπ(r,-) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ²βπ
(c,-) ββ©Cβ©F π :
π β¦β¦β©CβΞ²β cat_Set Ξ²"
shows "universal_arrow_of π c r (Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦)"
(is βΉuniversal_arrow_of π c r ?uβΊ)
proof-
interpret Ξ²: π΅ Ξ² by (rule assms(1))
interpret cat_Set_Ξ±Ξ²: subcategory Ξ² βΉcat_Set Ξ±βΊ βΉcat_Set Ξ²βΊ
by (rule subcategory_cat_Set_cat_Set[OF assms(1,2)])
interpret Ο: is_iso_ntcf
Ξ² π βΉcat_Set Ξ²βΊ βΉHomβ©Oβ©.β©CβΞ²βπ(r,-)βΊ βΉHomβ©Oβ©.β©CβΞ²βπ
(c,-) ββ©Cβ©F πβΊ Ο
by (rule assms(5))
interpret Ξ²π: category Ξ² π
by (rule category.cat_category_if_ge_Limit)
(use assms(2) in βΉcs_concl cs_simp: cs_intro: cat_cs_introsβΊ)+
interpret Ξ²π
: category Ξ² π
by (rule category.cat_category_if_ge_Limit)
(use assms(2) in βΉcs_concl cs_simp: cs_intro: cat_cs_introsβΊ)+
interpret Ξ²π: is_functor Ξ² π π
π
by (rule cf_is_functor_if_ge_Limit)
(use assms(2) in βΉcs_concl cs_simp: cs_intro: cat_cs_introsβΊ)+
show ?thesis
proof(intro universal_arrow_ofI assms)
from assms(3,4) show u: "?u : c β¦βπ
β πβ¦ObjMapβ¦β¦rβ¦"
by (cs_concl cs_simp: cat_cs_simps cat_op_simps cs_intro: cat_cs_intros)
fix r' u' assume prems: "r' ββ©β πβ¦Objβ¦" "u' : c β¦βπ
β πβ¦ObjMapβ¦β¦r'β¦"
have Οr'_ArrVal_app[symmetric, cat_cs_simps]:
"Οβ¦NTMapβ¦β¦r'β¦β¦ArrValβ¦β¦f'β¦ =
πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπ
β Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦"
if "f' : r β¦βπβ r'" for f'
proof-
have "Οβ¦NTMapβ¦β¦r'β¦ ββ©Aβcat_Set Ξ²β Homβ©Oβ©.β©CβΞ²βπ(r,-)β¦ArrMapβ¦β¦f'β¦ =
(Homβ©Oβ©.β©CβΞ²βπ
(c,-) ββ©Cβ©F π)β¦ArrMapβ¦β¦f'β¦ ββ©Aβcat_Set Ξ²β Οβ¦NTMapβ¦β¦rβ¦"
using that by (intro Ο.ntcf_Comp_commute)
then have
"Οβ¦NTMapβ¦β¦r'β¦ ββ©Aβcat_Set Ξ²β cf_hom π [πβ¦CIdβ¦β¦rβ¦, f']β©β =
cf_hom π
[π
β¦CIdβ¦β¦cβ¦, πβ¦ArrMapβ¦β¦f'β¦]β©β ββ©Aβcat_Set Ξ²β Οβ¦NTMapβ¦β¦rβ¦"
using assms(3,4) assms(1,2) that prems
by (cs_prems cs_simp: cat_cs_simps cat_op_simps cs_intro: cat_cs_intros)
then have
"(Οβ¦NTMapβ¦β¦r'β¦ ββ©Aβcat_Set Ξ²β
cf_hom π [πβ¦CIdβ¦β¦rβ¦, f']β©β)β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦ =
(cf_hom π
[π
β¦CIdβ¦β¦cβ¦, πβ¦ArrMapβ¦β¦f'β¦]β©β ββ©Aβcat_Set Ξ²β
Οβ¦NTMapβ¦β¦rβ¦)β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦"
by simp
from
this assms(3,4,2) u that HomDom.category_axioms HomCod.category_axioms
show ?thesis
by
(
cs_prems
cs_simp: cat_cs_simps cat_op_simps
cs_intro:
cat_cs_intros
cat_op_intros
cat_prod_cs_intros
cat_Set_Ξ±Ξ².subcat_is_arrD
)
qed
show "β!f'. f' : r β¦βπβ r' β§ u' = umap_of π c r ?u r'β¦ArrValβ¦β¦f'β¦"
proof(intro ex1I conjI; (elim conjE)?)
from assms prems HomDom.category_axioms show
"(Οβ¦NTMapβ¦β¦r'β¦)Β―β©Cβcat_Set Ξ²ββ¦ArrValβ¦β¦u'β¦ : r β¦βπβ r'"
by
(
cs_concl
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_arrow_cs_intros
)
with assms(3,4) prems show "u' =
umap_of π c r ?u r'β¦ArrValβ¦β¦(Οβ¦NTMapβ¦β¦r'β¦)Β―β©Cβcat_Set Ξ²ββ¦ArrValβ¦β¦u'β¦β¦"
by
(
cs_concl
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_arrow_cs_intros cat_cs_intros cat_op_intros
)
fix f' assume prems':
"f' : r β¦βπβ r'"
"u' = umap_of π c r (Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦) r'β¦ArrValβ¦β¦f'β¦"
from prems'(2,1) assms(3,4) have u'_def:
"u' = πβ¦ArrMapβ¦β¦f'β¦ ββ©Aβπ
β Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦"
by
(
cs_prems
cs_simp: cat_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_op_intros
)
from prems' show "f' = (Οβ¦NTMapβ¦β¦r'β¦)Β―β©Cβcat_Set Ξ²ββ¦ArrValβ¦β¦u'β¦"
unfolding u'_def Οr'_ArrVal_app[OF prems'(1)]
by
(
cs_concl
cs_simp: cat_cs_simps
cs_intro: cat_arrow_cs_intros cat_cs_intros cat_op_intros
)
qed
qed
qed
lemma (in is_functor) cf_universal_arrow_fo_if_is_iso_ntcf_if_ge_Limit:
assumes "π΅ Ξ²"
and "Ξ± ββ©β Ξ²"
and "r ββ©β πβ¦Objβ¦"
and "c ββ©β π
β¦Objβ¦"
and "Ο :
Homβ©Oβ©.β©CβΞ²βπ(-,r) β¦β©Cβ©Fβ©.β©iβ©sβ©o Homβ©Oβ©.β©CβΞ²βπ
(-,c) ββ©Cβ©F op_cf π :
op_cat π β¦β¦β©CβΞ²β cat_Set Ξ²"
shows "universal_arrow_fo π c r (Οβ¦NTMapβ¦β¦rβ¦β¦ArrValβ¦β¦πβ¦CIdβ¦β¦rβ¦β¦)"
proof-
interpret Ξ²: π΅ Ξ² by (rule assms(1))
interpret Ξ²π: is_functor Ξ² π π
π
by (rule cf_is_functor_if_ge_Limit)
(use assms(2) in βΉcs_concl cs_intro: cat_cs_introsβΊ)+
show ?thesis
by
(
rule is_functor.cf_universal_arrow_of_if_is_iso_ntcf_if_ge_Limit
[
OF is_functor_op,
OF assms(1,2),
unfolded cat_op_simps,
OF assms(3,4),
unfolded
Ξ²π.HomDom.cat_op_cat_cf_Hom_snd[OF assms(3)]
Ξ²π.HomCod.cat_op_cat_cf_Hom_snd[OF assms(4)]
ntcf_ua_fo_def[symmetric],
OF assms(5)
]
)
qed
textβΉ\newpageβΊ
end
Theory CZH_UCAT_Limit
sectionβΉLimitsβΊ
theory CZH_UCAT_Limit
imports
CZH_UCAT_Universal
CZH_Elementary_Categories.CZH_ECAT_Discrete
CZH_Elementary_Categories.CZH_ECAT_SS
CZH_Elementary_Categories.CZH_ECAT_Parallel
begin
subsectionβΉBackgroundβΊ
named_theorems cat_lim_cs_simps
named_theorems cat_lim_cs_intros
subsectionβΉCone and coconeβΊ
textβΉ
In the context of this work, the concept of a cone corresponds to that of a cone
to the base of a functor from a vertex, as defined in Chapter III-4 in
\cite{mac_lane_categories_2010}; the concept of a cocone corresponds to that
of a cone from the base of a functor to a vertex, as defined in Chapter III-3
in \cite{mac_lane_categories_2010}.
In this body of work, only limits and colimits of functors with tiny maps
are considered. The definitions of a cone and a cocone also reflect this.
However, this restriction may be removed in the future.
βΊ
locale is_cat_cone = is_tm_ntcf Ξ± π β βΉcf_const π β cβΊ π π for Ξ± c π β π π +
assumes cat_cone_obj[cat_lim_cs_intros]: "c ββ©β ββ¦Objβ¦"
syntax "_is_cat_cone" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©cβ©oβ©nβ©e _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "π : c <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β" β
"CONST is_cat_cone Ξ± c π β π π"
locale is_cat_cocone = is_tm_ntcf Ξ± π β π βΉcf_const π β cβΊ π for Ξ± c π β π π +
assumes cat_cocone_obj[cat_lim_cs_intros]: "c ββ©β ββ¦Objβ¦"
syntax "_is_cat_cocone" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "π : π >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e c : π β¦β¦β©CβΞ±β β" β
"CONST is_cat_cocone Ξ± c π β π π"
textβΉRules.βΊ
lemma (in is_cat_cone) is_cat_cone_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "c' = c" and "π' = π" and "β' = β" and "π' = π"
shows "π : c' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π' : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_cone_axioms)
mk_ide rf is_cat_cone_def[unfolded is_cat_cone_axioms_def]
|intro is_cat_coneI|
|dest is_cat_coneD[dest!]|
|elim is_cat_coneE[elim!]|
lemma (in is_cat_cone) is_cat_coneD'[cat_lim_cs_intros]:
assumes "c' = cf_const π β c"
shows "π : c' β¦β©Cβ©Fβ©.β©tβ©m π : π β¦β¦β©Cβ©.β©tβ©mβΞ±β β"
unfolding assms by (cs_concl cs_intro: cat_small_cs_intros)
lemmas [cat_lim_cs_intros] = is_cat_cone.is_cat_coneD'
lemma (in is_cat_cocone) is_cat_cocone_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "c' = c" and "π' = π" and "β' = β" and "π' = π"
shows "π : π' >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e c' : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_cocone_axioms)
mk_ide rf is_cat_cocone_def[unfolded is_cat_cocone_axioms_def]
|intro is_cat_coconeI|
|dest is_cat_coconeD[dest!]|
|elim is_cat_coconeE[elim!]|
lemma (in is_cat_cocone) is_cat_coconeD'[cat_lim_cs_intros]:
assumes "c' = cf_const π β c"
shows "π : π β¦β©Cβ©Fβ©.β©tβ©m c' : π β¦β¦β©Cβ©.β©tβ©mβΞ±β β"
unfolding assms by (cs_concl cs_intro: cat_small_cs_intros)
lemmas [cat_lim_cs_intros] = is_cat_cocone.is_cat_coconeD'
textβΉDuality.βΊ
lemma (in is_cat_cone) is_cat_cocone_op:
"op_ntcf π : op_cf π >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e c : op_cat π β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_coconeI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_lim_cs_intros cat_op_intros)+
lemma (in is_cat_cone) is_cat_cocone_op'[cat_op_intros]:
assumes "Ξ±' = Ξ±" and "π' = op_cat π" and "β' = op_cat β" and "π' = op_cf π"
shows "op_ntcf π : π' >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e c : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_cocone_op)
lemmas [cat_op_intros] = is_cat_cone.is_cat_cocone_op'
lemma (in is_cat_cocone) is_cat_cone_op:
"op_ntcf π : c <β©Cβ©Fβ©.β©cβ©oβ©nβ©e op_cf π : op_cat π β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_coneI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_lim_cs_intros cat_op_intros)
lemma (in is_cat_cocone) is_cat_cone_op'[cat_op_intros]:
assumes "Ξ±' = Ξ±" and "π' = op_cat π" and "β' = op_cat β" and "π' = op_cf π"
shows "op_ntcf π : c <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π' : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_cone_op)
lemmas [cat_op_intros] = is_cat_cocone.is_cat_cone_op'
textβΉElementary properties.βΊ
lemma (in is_cat_cone) cat_cone_LArr_app_is_arr:
assumes "j ββ©β πβ¦Objβ¦"
shows "πβ¦NTMapβ¦β¦jβ¦ : c β¦βββ πβ¦ObjMapβ¦β¦jβ¦"
proof-
from assms have [simp]: "cf_const π β cβ¦ObjMapβ¦β¦jβ¦ = c"
by (cs_concl cs_simp: cat_cs_simps)
from ntcf_NTMap_is_arr[OF assms] show ?thesis by simp
qed
lemma (in is_cat_cone) cat_cone_LArr_app_is_arr'[cat_lim_cs_intros]:
assumes "j ββ©β πβ¦Objβ¦" and "πj = πβ¦ObjMapβ¦β¦jβ¦"
shows "πβ¦NTMapβ¦β¦jβ¦ : c β¦βββ πj"
using assms(1) unfolding assms(2) by (rule cat_cone_LArr_app_is_arr)
lemmas [cat_lim_cs_intros] = is_cat_cone.cat_cone_LArr_app_is_arr'
lemma (in is_cat_cocone) cat_cocone_LArr_app_is_arr:
assumes "j ββ©β πβ¦Objβ¦"
shows "πβ¦NTMapβ¦β¦jβ¦ : πβ¦ObjMapβ¦β¦jβ¦ β¦βββ c"
proof-
from assms have [simp]: "cf_const π β cβ¦ObjMapβ¦β¦jβ¦ = c"
by (cs_concl cs_simp: cat_cs_simps)
from ntcf_NTMap_is_arr[OF assms] show ?thesis by simp
qed
lemma (in is_cat_cocone) cat_cocone_LArr_app_is_arr'[cat_lim_cs_intros]:
assumes "j ββ©β πβ¦Objβ¦" and "πj = πβ¦ObjMapβ¦β¦jβ¦"
shows "πβ¦NTMapβ¦β¦jβ¦ : πj β¦βββ c"
using assms(1) unfolding assms(2) by (rule cat_cocone_LArr_app_is_arr)
lemmas [cat_lim_cs_intros] = is_cat_cocone.cat_cocone_LArr_app_is_arr'
lemma (in is_cat_cone) cat_cone_Comp_commute[cat_lim_cs_simps]:
assumes "f : a β¦βπβ b"
shows "πβ¦ArrMapβ¦β¦fβ¦ ββ©Aβββ πβ¦NTMapβ¦β¦aβ¦ = πβ¦NTMapβ¦β¦bβ¦"
using ntcf_Comp_commute[symmetric, OF assms] assms
by (cs_prems cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
lemmas [cat_lim_cs_simps] = is_cat_cone.cat_cone_Comp_commute
lemma (in is_cat_cocone) cat_cocone_Comp_commute[cat_lim_cs_simps]:
assumes "f : a β¦βπβ b"
shows "πβ¦NTMapβ¦β¦bβ¦ ββ©Aβββ πβ¦ArrMapβ¦β¦fβ¦ = πβ¦NTMapβ¦β¦aβ¦"
using ntcf_Comp_commute[OF assms] assms
by (cs_prems cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
lemmas [cat_lim_cs_simps] = is_cat_cocone.cat_cocone_Comp_commute
textβΉUtilities/helper lemmas.βΊ
lemma (in is_cat_cone) helper_cat_cone_ntcf_vcomp_Comp:
assumes "π' : c' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β"
and "f' : c' β¦βββ c"
and "π' = π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
and "j ββ©β πβ¦Objβ¦"
shows "π'β¦NTMapβ¦β¦jβ¦ = πβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f'"
proof-
from assms(3) have "π'β¦NTMapβ¦β¦jβ¦ = (π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦β¦jβ¦"
by simp
from this assms(1,2,4) show "π'β¦NTMapβ¦β¦jβ¦ = πβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f'"
by (cs_prems cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
qed
lemma (in is_cat_cone) helper_cat_cone_Comp_ntcf_vcomp:
assumes "π' : c' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β"
and "f' : c' β¦βββ c"
and "βj. j ββ©β πβ¦Objβ¦ βΉ π'β¦NTMapβ¦β¦jβ¦ = πβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f'"
shows "π' = π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
proof-
interpret π': is_cat_cone Ξ± c' π β π π' by (rule assms(1))
show ?thesis
proof(rule ntcf_eqI[OF π'.is_ntcf_axioms])
from assms(2) show
"π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f' : cf_const π β c' β¦β©Cβ©F π : π β¦β¦β©CβΞ±β β"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
show "π'β¦NTMapβ¦ = (π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦"
proof(rule vsv_eqI, unfold cat_cs_simps)
show "vsv ((π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦)"
by (cs_concl cs_intro: cat_cs_intros)
from assms show "πβ¦Objβ¦ = πβ©β ((π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦)"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
fix j assume prems': "j ββ©β πβ¦Objβ¦"
with assms(1,2) show "π'β¦NTMapβ¦β¦jβ¦ = (π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦β¦jβ¦"
by (cs_concl cs_simp: cat_cs_simps assms(3) cs_intro: cat_cs_intros)
qed auto
qed simp_all
qed
lemma (in is_cat_cone) helper_cat_cone_Comp_ntcf_vcomp_iff:
assumes "π' : c' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β"
shows "f' : c' β¦βββ c β§ π' = π ββ©Nβ©Tβ©Cβ©F ntcf_const π β f' β·
f' : c' β¦βββ c β§ (βjββ©βπβ¦Objβ¦. π'β¦NTMapβ¦β¦jβ¦ = πβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f')"
using
helper_cat_cone_ntcf_vcomp_Comp[OF assms]
helper_cat_cone_Comp_ntcf_vcomp[OF assms]
by (intro iffI; elim conjE; intro conjI) metis+
lemma (in is_cat_cocone) helper_cat_cocone_ntcf_vcomp_Comp:
assumes "π' : π >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e c' : π β¦β¦β©CβΞ±β β"
and "f' : c β¦βββ c'"
and "π' = ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F π"
and "j ββ©β πβ¦Objβ¦"
shows "π'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ πβ¦NTMapβ¦β¦jβ¦"
proof-
interpret π': is_cat_cocone Ξ± c' π β π π' by (rule assms(1))
from assms(3) have "op_ntcf π' = op_ntcf (ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F π)" by simp
from this assms(2) have op_π':
"op_ntcf π' = op_ntcf π ββ©Nβ©Tβ©Cβ©F ntcf_const (op_cat π) (op_cat β) f'"
by (cs_prems cs_simp: cat_op_simps cs_intro: cat_cs_intros cat_op_intros)
have "π'β¦NTMapβ¦β¦jβ¦ = πβ¦NTMapβ¦β¦jβ¦ ββ©Aβop_cat ββ f'"
by
(
rule is_cat_cone.helper_cat_cone_ntcf_vcomp_Comp[
OF is_cat_cone_op π'.is_cat_cone_op,
unfolded cat_op_simps,
OF assms(2) op_π' assms(4)
]
)
from this assms(2,4) show "π'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ πβ¦NTMapβ¦β¦jβ¦"
by (cs_prems cs_simp: cat_cs_simps cat_op_simps cs_intro: cat_cs_intros)
qed
lemma (in is_cat_cocone) helper_cat_cocone_Comp_ntcf_vcomp:
assumes "π' : π >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e c' : π β¦β¦β©CβΞ±β β"
and "f' : c β¦βββ c'"
and "βj. j ββ©β πβ¦Objβ¦ βΉ π'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ πβ¦NTMapβ¦β¦jβ¦"
shows "π' = ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F π"
proof-
interpret π': is_cat_cocone Ξ± c' π β π π' by (rule assms(1))
from assms(2) have π'j: "π'β¦NTMapβ¦β¦jβ¦ = πβ¦NTMapβ¦β¦jβ¦ ββ©Aβop_cat ββ f'"
if "j ββ©β πβ¦Objβ¦" for j
using that
unfolding assms(3)[OF that]
by (cs_concl cs_simp: cat_op_simps cat_cs_simps cs_intro: cat_cs_intros)
have op_π':
"op_ntcf π' = op_ntcf π ββ©Nβ©Tβ©Cβ©F ntcf_const (op_cat π) (op_cat β) f'"
by
(
rule is_cat_cone.helper_cat_cone_Comp_ntcf_vcomp[
OF is_cat_cone_op π'.is_cat_cone_op,
unfolded cat_op_simps,
OF assms(2) π'j,
simplified
]
)
from assms(2) show "π' = (ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F π)"
by
(
cs_concl
cs_simp:
cat_op_simps op_π' eq_op_ntcf_iff[symmetric, OF π'.is_ntcf_axioms]
cs_intro: cat_cs_intros
)
qed
lemma (in is_cat_cocone) helper_cat_cocone_Comp_ntcf_vcomp_iff:
assumes "π' : π >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e c' : π β¦β¦β©CβΞ±β β"
shows "f' : c β¦βββ c' β§ π' = ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F π β·
f' : c β¦βββ c' β§ (βjββ©βπβ¦Objβ¦. π'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ πβ¦NTMapβ¦β¦jβ¦)"
using
helper_cat_cocone_ntcf_vcomp_Comp[OF assms]
helper_cat_cocone_Comp_ntcf_vcomp[OF assms]
by (intro iffI; elim conjE; intro conjI) metis+
subsectionβΉLimit and colimitβΊ
subsubsectionβΉDefinition and elementary propertiesβΊ
textβΉ
The concept of a limit is introduced in Chapter III-4 in
\cite{mac_lane_categories_2010}; the concept of a colimit is introduced in
Chapter III-3 in \cite{mac_lane_categories_2010}.
βΊ
locale is_cat_limit = is_cat_cone Ξ± r π β π u for Ξ± π β π r u +
assumes cat_lim_ua_fo:
"universal_arrow_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u)"
syntax "_is_cat_limit" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©lβ©iβ©m _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "u : r <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β" β
"CONST is_cat_limit Ξ± π β π r u"
locale is_cat_colimit = is_cat_cocone Ξ± r π β π u for Ξ± π β π r u +
assumes cat_colim_ua_fo: "universal_arrow_fo
(Ξβ©C Ξ± (op_cat π) (op_cat β)) (cf_map π) r (ntcf_arrow (op_ntcf u))"
syntax "_is_cat_colimit" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "u : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r : π β¦β¦β©CβΞ±β β" β
"CONST is_cat_colimit Ξ± π β π r u"
textβΉRules.βΊ
lemma (in is_cat_limit) is_cat_limit_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "r' = r" and "π' = π" and "β' = β" and "π' = π"
shows "u : r' <β©Cβ©Fβ©.β©lβ©iβ©m π' : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_limit_axioms)
mk_ide rf is_cat_limit_def[unfolded is_cat_limit_axioms_def]
|intro is_cat_limitI|
|dest is_cat_limitD[dest]|
|elim is_cat_limitE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_limitD(1)
lemma (in is_cat_colimit) is_cat_colimit_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "r' = r" and "π' = π" and "β' = β" and "π' = π"
shows "u : π' >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r' : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_colimit_axioms)
mk_ide rf is_cat_colimit_def[unfolded is_cat_colimit_axioms_def]
|intro is_cat_colimitI|
|dest is_cat_colimitD[dest]|
|elim is_cat_colimitE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_colimitD(1)
textβΉDualityβΊ
lemma (in is_cat_limit) is_cat_colimit_op:
"op_ntcf u : op_cf π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r : op_cat π β¦β¦β©CβΞ±β op_cat β"
using cat_lim_ua_fo
by (intro is_cat_colimitI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_cs_intros cat_op_intros)
lemma (in is_cat_limit) is_cat_colimit_op'[cat_op_intros]:
assumes "π' = op_cf π" and "π' = op_cat π" and "β' = op_cat β"
shows "op_ntcf u : π' >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r : π' β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_colimit_op)
lemmas [cat_op_intros] = is_cat_limit.is_cat_colimit_op'
lemma (in is_cat_colimit) is_cat_limit_op:
"op_ntcf u : r <β©Cβ©Fβ©.β©lβ©iβ©m op_cf π : op_cat π β¦β¦β©CβΞ±β op_cat β"
using cat_colim_ua_fo
by (intro is_cat_limitI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_cs_intros cat_op_intros)
lemma (in is_cat_colimit) is_cat_colimit_op'[cat_op_intros]:
assumes "π' = op_cf π" and "π' = op_cat π" and "β' = op_cat β"
shows "op_ntcf u : r <β©Cβ©Fβ©.β©lβ©iβ©m π' : π' β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_limit_op)
lemmas [cat_op_intros] = is_cat_colimit.is_cat_colimit_op'
textβΉElementary properties of limits and colimits.βΊ
sublocale is_cat_limit β Ξ: is_functor Ξ± β βΉcat_Funct Ξ± π ββΊ βΉΞβ©C Ξ± π ββΊ
by (cs_concl cs_intro: cat_cs_intros cat_small_cs_intros)
sublocale is_cat_colimit β Ξ: is_functor
Ξ± βΉop_cat ββΊ βΉcat_Funct Ξ± (op_cat π) (op_cat β)βΊ βΉΞβ©C Ξ± (op_cat π) (op_cat β)βΊ
by (cs_concl cs_intro: cat_small_cs_intros cat_cs_intros cat_op_intros)
subsubsectionβΉUniversal propertyβΊ
lemma is_cat_limitI':
assumes "u : r <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β"
and "βu' r'. β¦ u' : r' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β β§ βΉ
β!f'. f' : r' β¦βββ r β§ u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
shows "u : r <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β"
proof(intro is_cat_limitI is_functor.universal_arrow_foI)
interpret u: is_cat_cone Ξ± r π β π u by (rule assms(1))
show "r ββ©β ββ¦Objβ¦" by (cs_concl cs_intro: cat_lim_cs_intros)
show "Ξβ©C Ξ± π β : β β¦β¦β©CβΞ±β cat_Funct Ξ± π β"
by (cs_concl cs_intro: cat_cs_intros cat_small_cs_intros)
show "ntcf_arrow u : Ξβ©C Ξ± π ββ¦ObjMapβ¦β¦rβ¦ β¦βcat_Funct Ξ± π ββ cf_map π"
by
(
cs_concl
cs_simp: cat_cs_simps
cs_intro: cat_lim_cs_intros cat_small_cs_intros cat_FUNCT_cs_intros
)
fix r' u' assume prems:
"r' ββ©β ββ¦Objβ¦" "u' : Ξβ©C Ξ± π ββ¦ObjMapβ¦β¦r'β¦ β¦βcat_Funct Ξ± π ββ cf_map π"
note u' = cat_Funct_is_arrD[OF prems(2)]
from u'(1) prems(1) have u'_is_tm_ntcf:
"ntcf_of_ntcf_arrow π β u' : cf_const π β r' β¦β©Cβ©Fβ©.β©tβ©m π : π β¦β¦β©Cβ©.β©tβ©mβΞ±β β"
by
(
cs_prems
cs_simp: cat_cs_simps cat_small_cs_simps cat_FUNCT_cs_simps
cs_intro: cat_cs_intros
)
from this prems(1) have u'_is_cat_cone:
"ntcf_of_ntcf_arrow π β u' : r' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β"
by (intro is_cat_coneI)
interpret u': is_cat_cone Ξ± r' π β π βΉntcf_of_ntcf_arrow π β u'βΊ
by (rule u'_is_cat_cone)
from assms(2)[OF u'_is_cat_cone] obtain f' where f': "f' : r' β¦βββ r"
and u'_def: "ntcf_of_ntcf_arrow π β u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
and unique: "βf''.
β¦
f'' : r' β¦βββ r;
ntcf_of_ntcf_arrow π β u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f''
β§ βΉ f'' = f'"
by (meson prems(1))
from u'_def have u'_NTMap_app:
"ntcf_of_ntcf_arrow π β u'β¦NTMapβ¦β¦jβ¦ = (u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦β¦jβ¦"
if "j ββ©β πβ¦Objβ¦" for j
by simp
have u'_NTMap_app: "u'β¦NTMapβ¦β¦jβ¦ = uβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f'"
if "j ββ©β πβ¦Objβ¦" for j
using u'_NTMap_app[OF that] that f'
by (cs_prems cs_simp: cat_cs_simps cat_FUNCT_cs_simps cs_intro: cat_cs_intros)
show "β!f'.
f' : r' β¦βββ r β§
u' = umap_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u) r'β¦ArrValβ¦β¦f'β¦"
proof(intro ex1I conjI; (elim conjE)?)
show "f' : r' β¦βββ r" by (rule f')
have u'_def'[symmetric, cat_cs_simps]:
"ntcf_of_ntcf_arrow π β u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
proof(rule ntcf_eqI)
from u'_is_tm_ntcf show
"ntcf_of_ntcf_arrow π β u' : cf_const π β r' β¦β©Cβ©F π : π β¦β¦β©CβΞ±β β"
by (cs_concl cs_intro: cat_small_cs_intros)
from f' show
"u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f' : cf_const π β r' β¦β©Cβ©F π : π β¦β¦β©CβΞ±β β"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
show
"ntcf_of_ntcf_arrow π β u'β¦NTMapβ¦ = (u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦"
proof(rule vsv_eqI)
from f' show "πβ©β (ntcf_of_ntcf_arrow π β u'β¦NTMapβ¦) =
πβ©β ((u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦)"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
show "ntcf_of_ntcf_arrow π β u'β¦NTMapβ¦β¦aβ¦ =
(u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦β¦aβ¦"
if "a ββ©β πβ©β (ntcf_of_ntcf_arrow π β u'β¦NTMapβ¦)" for a
proof-
from that have "a ββ©β πβ¦Objβ¦" by (cs_prems cs_simp: cat_cs_simps)
with f' show
"ntcf_of_ntcf_arrow π β u'β¦NTMapβ¦β¦aβ¦ =
(u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f')β¦NTMapβ¦β¦aβ¦"
by
(
cs_concl
cs_simp: cat_cs_simps cat_FUNCT_cs_simps u'_NTMap_app
cs_intro: cat_cs_intros
)
qed
qed (auto intro: cat_cs_intros)
qed simp_all
from f' u'(1) show
"u' = umap_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u) r'β¦ArrValβ¦β¦f'β¦"
by (subst u'(2))
(
cs_concl
cs_simp: cat_cs_simps cat_FUNCT_cs_simps
cs_intro: cat_cs_intros cat_FUNCT_cs_intros cat_small_cs_intros
)
fix f'' assume prems':
"f'' : r' β¦βββ r"
"u' = umap_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u) r'β¦ArrValβ¦β¦f''β¦"
from prems'(2,1) u'(1) have
"ntcf_of_ntcf_arrow π β u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f''"
by (subst (asm) u'(2))
(
cs_prems
cs_simp: cat_cs_simps cat_FUNCT_cs_simps
cs_intro: cat_small_cs_intros cat_cs_intros cat_FUNCT_cs_intros
)
from unique[OF prems'(1) this] show "f'' = f'" .
qed
qed (intro assms)+
lemma (in is_cat_limit) cat_lim_unique_cone:
assumes "u' : r' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β"
shows "β!f'. f' : r' β¦βββ r β§ u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
proof-
interpret u': is_cat_cone Ξ± r' π β π u' by (rule assms(1))
have "ntcf_arrow u' : Ξβ©C Ξ± π ββ¦ObjMapβ¦β¦r'β¦ β¦βcat_Funct Ξ± π ββ cf_map π"
by
(
cs_concl
cs_intro: cat_lim_cs_intros cat_FUNCT_cs_intros cs_simp: cat_cs_simps
)
from Ξ.universal_arrow_foD(3)[OF cat_lim_ua_fo u'.cat_cone_obj this] obtain f'
where f': "f' : r' β¦βββ r"
and u': "ntcf_arrow u' =
umap_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u) r'β¦ArrValβ¦β¦f'β¦"
and unique:
"β¦
f'' : r' β¦βββ r;
ntcf_arrow u' =
umap_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u) r'β¦ArrValβ¦β¦f''β¦
β§ βΉ f'' = f'"
for f''
by metis
show "β!f'. f' : r' β¦βββ r β§ u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
proof(intro ex1I conjI; (elim conjE)?)
show "f' : r' β¦βββ r" by (rule f')
with u' show "u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
by
(
cs_prems
cs_simp: cat_cs_simps cat_FUNCT_cs_simps
cs_intro: cat_cs_intros cat_FUNCT_cs_intros cat_small_cs_intros
)
fix f'' assume prems: "f'' : r' β¦βββ r" "u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f''"
from prems(1) have "ntcf_arrow u' =
umap_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u) r'β¦ArrValβ¦β¦f''β¦"
by
(
cs_concl
cs_simp: cat_cs_simps cat_FUNCT_cs_simps prems(2)[symmetric]
cs_intro: cat_cs_intros cat_FUNCT_cs_intros cat_small_cs_intros
)
from prems(1) this show "f'' = f'" by (intro unique)
qed
qed
lemma (in is_cat_limit) cat_lim_unique_cone':
assumes "u' : r' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e π : π β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : r' β¦βββ r β§ (βjββ©βπβ¦Objβ¦. u'β¦NTMapβ¦β¦jβ¦ = uβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f')"
by (fold helper_cat_cone_Comp_ntcf_vcomp_iff[OF assms(1)])
(intro cat_lim_unique_cone assms)
lemma (in is_cat_limit) cat_lim_unique:
assumes "u' : r' <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β"
shows "β!f'. f' : r' β¦βββ r β§ u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f'"
by (intro cat_lim_unique_cone[OF is_cat_limitD(1)[OF assms]])
lemma (in is_cat_limit) cat_lim_unique':
assumes "u' : r' <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : r' β¦βββ r β§ (βjββ©βπβ¦Objβ¦. u'β¦NTMapβ¦β¦jβ¦ = uβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f')"
by (intro cat_lim_unique_cone'[OF is_cat_limitD(1)[OF assms]])
lemma (in is_cat_colimit) cat_colim_unique_cocone:
assumes "u' : π >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e r' : π β¦β¦β©CβΞ±β β"
shows "β!f'. f' : r β¦βββ r' β§ u' = ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F u"
proof-
interpret u': is_cat_cocone Ξ± r' π β π u' by (rule assms(1))
from u'.cat_cocone_obj have op_r': "r' ββ©β op_cat ββ¦Objβ¦"
unfolding cat_op_simps by simp
from
is_cat_limit.cat_lim_unique_cone[
OF is_cat_limit_op u'.is_cat_cone_op, folded op_ntcf_ntcf_const
]
obtain f' where f': "f' : r' β¦βop_cat ββ r"
and [cat_cs_simps]:
"op_ntcf u' = op_ntcf u ββ©Nβ©Tβ©Cβ©F op_ntcf (ntcf_const π β f')"
and unique:
"β¦
f'' : r' β¦βop_cat ββ r;
op_ntcf u' = op_ntcf u ββ©Nβ©Tβ©Cβ©F op_ntcf (ntcf_const π β f'')
β§ βΉ f'' = f'"
for f''
by metis
show ?thesis
proof(intro ex1I conjI; (elim conjE)?)
from f' show f': "f' : r β¦βββ r'" unfolding cat_op_simps by simp
show "u' = ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F u"
by (rule eq_op_ntcf_iff[THEN iffD1], insert f')
(cs_concl cs_intro: cat_cs_intros cs_simp: cat_cs_simps cat_op_simps)+
fix f'' assume prems: "f'' : r β¦βββ r'" "u' = ntcf_const π β f'' ββ©Nβ©Tβ©Cβ©F u"
from prems(1) have "f'' : r' β¦βop_cat ββ r" unfolding cat_op_simps by simp
moreover from prems(1) have
"op_ntcf u' = op_ntcf u ββ©Nβ©Tβ©Cβ©F op_ntcf (ntcf_const π β f'')"
unfolding prems(2)
by (cs_concl cs_intro: cat_cs_intros cs_simp: cat_cs_simps cat_op_simps)
ultimately show "f'' = f'" by (rule unique)
qed
qed
lemma (in is_cat_colimit) cat_colim_unique_cocone':
assumes "u' : π >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e r' : π β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : r β¦βββ r' β§ (βjββ©βπβ¦Objβ¦. u'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ uβ¦NTMapβ¦β¦jβ¦)"
by (fold helper_cat_cocone_Comp_ntcf_vcomp_iff[OF assms(1)])
(intro cat_colim_unique_cocone assms)
lemma (in is_cat_colimit) cat_colim_unique:
assumes "u' : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r' : π β¦β¦β©CβΞ±β β"
shows "β!f'. f' : r β¦βββ r' β§ u' = ntcf_const π β f' ββ©Nβ©Tβ©Cβ©F u"
by (intro cat_colim_unique_cocone[OF is_cat_colimitD(1)[OF assms]])
lemma (in is_cat_colimit) cat_colim_unique':
assumes "u' : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r' : π β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : r β¦βββ r' β§ (βjββ©βπβ¦Objβ¦. u'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ uβ¦NTMapβ¦β¦jβ¦)"
proof-
interpret u': is_cat_colimit Ξ± π β π r' u' by (rule assms(1))
show ?thesis
by (fold helper_cat_cocone_Comp_ntcf_vcomp_iff[OF u'.is_cat_cocone_axioms])
(intro cat_colim_unique assms)
qed
lemma cat_lim_ex_is_arr_isomorphism:
assumes "u : r <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β"
and "u' : r' <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β"
obtains f where "f : r' β¦β©iβ©sβ©oβββ r" and "u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f"
proof-
interpret u: is_cat_limit Ξ± π β π r u by (rule assms(1))
interpret u': is_cat_limit Ξ± π β π r' u' by (rule assms(2))
obtain f where f: "f : r' β¦β©iβ©sβ©oβββ r"
and u': "ntcf_arrow u' =
umap_fo (Ξβ©C Ξ± π β) (cf_map π) r (ntcf_arrow u) r'β¦ArrValβ¦β¦fβ¦"
by
(
elim u.Ξ.cf_universal_arrow_fo_ex_is_arr_isomorphism[
OF u.cat_lim_ua_fo u'.cat_lim_ua_fo
]
)
from f have "f : r' β¦βββ r" by auto
from u' this have "u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f"
by
(
cs_prems
cs_simp: cat_cs_simps cat_FUNCT_cs_simps cat_small_cs_simps
cs_intro: cat_cs_intros cat_FUNCT_cs_intros cat_small_cs_intros
)
with f that show ?thesis by simp
qed
lemma cat_lim_ex_is_arr_isomorphism':
assumes "u : r <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β"
and "u' : r' <β©Cβ©Fβ©.β©lβ©iβ©m π : π β¦β¦β©CβΞ±β β"
obtains f where "f : r' β¦β©iβ©sβ©oβββ r"
and "βj. j ββ©β πβ¦Objβ¦ βΉ u'β¦NTMapβ¦β¦jβ¦ = uβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f"
proof-
interpret u: is_cat_limit Ξ± π β π r u by (rule assms(1))
interpret u': is_cat_limit Ξ± π β π r' u' by (rule assms(2))
from assms obtain f
where iso_f: "f : r' β¦β©iβ©sβ©oβββ r" and u'_def: "u' = u ββ©Nβ©Tβ©Cβ©F ntcf_const π β f"
by (rule cat_lim_ex_is_arr_isomorphism)
then have f: "f : r' β¦βββ r" by auto
then have "u'β¦NTMapβ¦β¦jβ¦ = uβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f" if "j ββ©β πβ¦Objβ¦" for j
by
(
intro u.helper_cat_cone_ntcf_vcomp_Comp[
OF u'.is_cat_cone_axioms f u'_def that
]
)
with iso_f that show ?thesis by simp
qed
lemma cat_colim_ex_is_arr_isomorphism:
assumes "u : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r : π β¦β¦β©CβΞ±β β"
and "u' : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r' : π β¦β¦β©CβΞ±β β"
obtains f where "f : r β¦β©iβ©sβ©oβββ r'" and "u' = ntcf_const π β f ββ©Nβ©Tβ©Cβ©F u"
proof-
interpret u: is_cat_colimit Ξ± π β π r u by (rule assms(1))
interpret u': is_cat_colimit Ξ± π β π r' u' by (rule assms(2))
obtain f where f: "f : r' β¦β©iβ©sβ©oβop_cat ββ r"
and [cat_cs_simps]:
"op_ntcf u' = op_ntcf u ββ©Nβ©Tβ©Cβ©F ntcf_const (op_cat π) (op_cat β) f"
by
(
elim cat_lim_ex_is_arr_isomorphism[
OF u.is_cat_limit_op u'.is_cat_limit_op
]
)
from f have iso_f: "f : r β¦β©iβ©sβ©oβββ r'" unfolding cat_op_simps by simp
then have f: "f : r β¦βββ r'" by auto
have "u' = ntcf_const π β f ββ©Nβ©Tβ©Cβ©F u"
by (rule eq_op_ntcf_iff[THEN iffD1], insert f)
(cs_concl cs_intro: cat_cs_intros cs_simp: cat_cs_simps cat_op_simps)+
from iso_f this that show ?thesis by simp
qed
lemma cat_colim_ex_is_arr_isomorphism':
assumes "u : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r : π β¦β¦β©CβΞ±β β"
and "u' : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©m r' : π β¦β¦β©CβΞ±β β"
obtains f where "f : r β¦β©iβ©sβ©oβββ r'"
and "βj. j ββ©β πβ¦Objβ¦ βΉ u'β¦NTMapβ¦β¦jβ¦ = f ββ©Aβββ uβ¦NTMapβ¦β¦jβ¦"
proof-
interpret u: is_cat_colimit Ξ± π β π r u by (rule assms(1))
interpret u': is_cat_colimit Ξ± π β π r' u' by (rule assms(2))
from assms obtain f
where iso_f: "f : r β¦β©iβ©sβ©oβββ r'" and u'_def: "u' = ntcf_const π β f ββ©Nβ©Tβ©Cβ©F u"
by (rule cat_colim_ex_is_arr_isomorphism)
then have f: "f : r β¦βββ r'" by auto
then have "u'β¦NTMapβ¦β¦jβ¦ = f ββ©Aβββ uβ¦NTMapβ¦β¦jβ¦" if "j ββ©β πβ¦Objβ¦" for j
by
(
intro u.helper_cat_cocone_ntcf_vcomp_Comp[
OF u'.is_cat_cocone_axioms f u'_def that
]
)
with iso_f that show ?thesis by simp
qed
subsectionβΉFinite limit and finite colimitβΊ
locale is_cat_finite_limit = is_cat_limit Ξ± π β π r u + finite_category Ξ± π
for Ξ± π β π r u
syntax "_is_cat_finite_limit" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©lβ©iβ©mβ©.β©fβ©iβ©n _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "u : r <β©Cβ©Fβ©.β©lβ©iβ©mβ©.β©fβ©iβ©n π : π β¦β¦β©CβΞ±β β" β
"CONST is_cat_finite_limit Ξ± π β π r u"
locale is_cat_finite_colimit = is_cat_colimit Ξ± π β π r u + finite_category Ξ± π
for Ξ± π β π r u
syntax "_is_cat_finite_colimit" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©mβ©.β©fβ©iβ©n _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "u : π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©mβ©.β©fβ©iβ©n r : π β¦β¦β©CβΞ±β β" β
"CONST is_cat_finite_colimit Ξ± π β π r u"
textβΉRules.βΊ
lemma (in is_cat_finite_limit) is_cat_finite_limit_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "r' = r" and "π' = π" and "β' = β" and "π' = π"
shows "u : r' <β©Cβ©Fβ©.β©lβ©iβ©mβ©.β©fβ©iβ©n π' : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_finite_limit_axioms)
mk_ide rf is_cat_finite_limit_def
|intro is_cat_finite_limitI|
|dest is_cat_finite_limitD[dest]|
|elim is_cat_finite_limitE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_finite_limitD
lemma (in is_cat_finite_colimit)
is_cat_finite_colimit_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "r' = r" and "π' = π" and "β' = β" and "π' = π"
shows "u : π' >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©mβ©.β©fβ©iβ©n r' : π' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_finite_colimit_axioms)
mk_ide rf is_cat_finite_colimit_def[unfolded is_cat_colimit_axioms_def]
|intro is_cat_finite_colimitI|
|dest is_cat_finite_colimitD[dest]|
|elim is_cat_finite_colimitE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_finite_colimitD
textβΉDualityβΊ
lemma (in is_cat_finite_limit) is_cat_finite_colimit_op:
"op_ntcf u : op_cf π >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©mβ©.β©fβ©iβ©n r : op_cat π β¦β¦β©CβΞ±β op_cat β"
by
(
cs_concl cs_intro:
is_cat_finite_colimitI cat_op_intros cat_small_cs_intros
)
lemma (in is_cat_finite_limit) is_cat_finite_colimit_op'[cat_op_intros]:
assumes "π' = op_cf π" and "π' = op_cat π" and "β' = op_cat β"
shows "op_ntcf u : π' >β©Cβ©Fβ©.β©cβ©oβ©lβ©iβ©mβ©.β©fβ©iβ©n r : π' β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_finite_colimit_op)
lemmas [cat_op_intros] = is_cat_finite_limit.is_cat_finite_colimit_op'
lemma (in is_cat_finite_colimit) is_cat_finite_limit_op:
"op_ntcf u : r <β©Cβ©Fβ©.β©lβ©iβ©mβ©.β©fβ©iβ©n op_cf π : op_cat π β¦β¦β©CβΞ±β op_cat β"
by
(
cs_concl cs_intro:
is_cat_finite_limitI cat_op_intros cat_small_cs_intros
)
lemma (in is_cat_finite_colimit) is_cat_finite_colimit_op'[cat_op_intros]:
assumes "π' = op_cf π" and "π' = op_cat π" and "β' = op_cat β"
shows "op_ntcf u : r <β©Cβ©Fβ©.β©lβ©iβ©mβ©.β©fβ©iβ©n π' : π' β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_finite_limit_op)
lemmas [cat_op_intros] = is_cat_finite_colimit.is_cat_finite_colimit_op'
subsectionβΉProduct and coproductβΊ
subsubsectionβΉDefinition and elementary propertiesβΊ
textβΉ
The definition of the product object is a specialization of the
definition presented in Chapter III-4 in \cite{mac_lane_categories_2010}.
In the definition presented below, the discrete category that is used in the
definition presented in \cite{mac_lane_categories_2010} is parameterized by
an index set and the functor from the discrete category is
parameterized by a function from the index set to the set of
the objects of the category.
βΊ
locale is_cat_obj_prod =
is_cat_limit Ξ± βΉ:β©C IβΊ β βΉ:β: I A ββΊ P Ο + cf_discrete Ξ± I A β
for Ξ± I A β P Ο
syntax "_is_cat_obj_prod" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©β _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "Ο : P <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β" β
"CONST is_cat_obj_prod Ξ± I A β P Ο"
locale is_cat_obj_coprod =
is_cat_colimit Ξ± βΉ:β©C IβΊ β βΉ:β: I A ββΊ U Ο + cf_discrete Ξ± I A β
for Ξ± I A β U Ο
syntax "_is_cat_obj_coprod" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ >β©Cβ©Fβ©.β©β _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "Ο : A >β©Cβ©Fβ©.β©β U : I β¦β¦β©CβΞ±β β" β
"CONST is_cat_obj_coprod Ξ± I A β U Ο"
textβΉRules.βΊ
lemma (in is_cat_obj_prod) is_cat_obj_prod_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "P' = P" and "A' = A" and "I' = I" and "β' = β"
shows "Ο : P' <β©Cβ©Fβ©.β©β A' : I' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_obj_prod_axioms)
mk_ide rf is_cat_obj_prod_def
|intro is_cat_obj_prodI|
|dest is_cat_obj_prodD[dest]|
|elim is_cat_obj_prodE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_obj_prodD
lemma (in is_cat_obj_coprod) is_cat_obj_coprod_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "U' = U" and "A' = A" and "I' = I" and "β' = β"
shows "Ο : A' >β©Cβ©Fβ©.β©β U' : I' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_obj_coprod_axioms)
mk_ide rf is_cat_obj_coprod_def
|intro is_cat_obj_coprodI|
|dest is_cat_obj_coprodD[dest]|
|elim is_cat_obj_coprodE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_obj_coprodD
textβΉDuality.βΊ
lemma (in is_cat_obj_prod) is_cat_obj_coprod_op:
"op_ntcf Ο : A >β©Cβ©Fβ©.β©β P : I β¦β¦β©CβΞ±β op_cat β"
using cf_discrete_vdomain_vsubset_Vset
by (intro is_cat_obj_coprodI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_cs_intros cat_op_intros)
lemma (in is_cat_obj_prod) is_cat_obj_coprod_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ο : A >β©Cβ©Fβ©.β©β P : I β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_obj_coprod_op)
lemmas [cat_op_intros] = is_cat_obj_prod.is_cat_obj_coprod_op'
lemma (in is_cat_obj_coprod) is_cat_obj_prod_op:
"op_ntcf Ο : U <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β op_cat β"
using cf_discrete_vdomain_vsubset_Vset
by (intro is_cat_obj_prodI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_cs_intros cat_op_intros)
lemma (in is_cat_obj_coprod) is_cat_obj_prod_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ο : U <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_obj_prod_op)
lemmas [cat_op_intros] = is_cat_obj_coprod.is_cat_obj_prod_op'
subsubsectionβΉUniversal propertyβΊ
lemma (in is_cat_obj_prod) cat_obj_prod_unique_cone':
assumes "Ο' : P' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e :β: I A β : :β©C I β¦β¦β©CβΞ±β β"
shows "β!f'. f' : P' β¦βββ P β§ (βjββ©βI. Ο'β¦NTMapβ¦β¦jβ¦ = Οβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f')"
by
(
rule cat_lim_unique_cone'[
OF assms, unfolded the_cat_discrete_components(1)
]
)
lemma (in is_cat_obj_prod) cat_obj_prod_unique:
assumes "Ο' : P' <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β"
shows "β!f'. f' : P' β¦βββ P β§ Ο' = Ο ββ©Nβ©Tβ©Cβ©F ntcf_const (:β©C I) β f'"
by (intro cat_lim_unique[OF is_cat_obj_prodD(1)[OF assms]])
lemma (in is_cat_obj_prod) cat_obj_prod_unique':
assumes "Ο' : P' <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β"
shows "β!f'. f' : P' β¦βββ P β§ (βiββ©βI. Ο'β¦NTMapβ¦β¦iβ¦ = Οβ¦NTMapβ¦β¦iβ¦ ββ©Aβββ f')"
proof-
interpret Ο': is_cat_obj_prod Ξ± I A β P' Ο' by (rule assms(1))
show ?thesis
by
(
rule cat_lim_unique'[
OF Ο'.is_cat_limit_axioms, unfolded the_cat_discrete_components(1)
]
)
qed
lemma (in is_cat_obj_coprod) cat_obj_coprod_unique_cocone':
assumes "Ο' : :β: I A β >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e U' : :β©C I β¦β¦β©CβΞ±β β"
shows "β!f'. f' : U β¦βββ U' β§ (βjββ©βI. Ο'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ Οβ¦NTMapβ¦β¦jβ¦)"
by
(
rule cat_colim_unique_cocone'[
OF assms, unfolded the_cat_discrete_components(1)
]
)
lemma (in is_cat_obj_coprod) cat_obj_coprod_unique:
assumes "Ο' : A >β©Cβ©Fβ©.β©β U' : I β¦β¦β©CβΞ±β β"
shows "β!f'. f' : U β¦βββ U' β§ Ο' = ntcf_const (:β©C I) β f' ββ©Nβ©Tβ©Cβ©F Ο"
by (intro cat_colim_unique[OF is_cat_obj_coprodD(1)[OF assms]])
lemma (in is_cat_obj_coprod) cat_obj_coprod_unique':
assumes "Ο' : A >β©Cβ©Fβ©.β©β U' : I β¦β¦β©CβΞ±β β"
shows "β!f'. f' : U β¦βββ U' β§ (βjββ©βI. Ο'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ Οβ¦NTMapβ¦β¦jβ¦)"
by
(
rule cat_colim_unique'[
OF is_cat_obj_coprodD(1)[OF assms], unfolded the_cat_discrete_components
]
)
lemma cat_obj_prod_ex_is_arr_isomorphism:
assumes "Ο : P <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β" and "Ο' : P' <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β"
obtains f where "f : P' β¦β©iβ©sβ©oβββ P" and "Ο' = Ο ββ©Nβ©Tβ©Cβ©F ntcf_const (:β©C I) β f"
proof-
interpret Ο: is_cat_obj_prod Ξ± I A β P Ο by (rule assms(1))
interpret Ο': is_cat_obj_prod Ξ± I A β P' Ο' by (rule assms(2))
from that show ?thesis
by
(
elim cat_lim_ex_is_arr_isomorphism[
OF Ο.is_cat_limit_axioms Ο'.is_cat_limit_axioms
]
)
qed
lemma cat_obj_prod_ex_is_arr_isomorphism':
assumes "Ο : P <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β" and "Ο' : P' <β©Cβ©Fβ©.β©β A : I β¦β¦β©CβΞ±β β"
obtains f where "f : P' β¦β©iβ©sβ©oβββ P"
and "βj. j ββ©β I βΉ Ο'β¦NTMapβ¦β¦jβ¦ = Οβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f"
proof-
interpret Ο: is_cat_obj_prod Ξ± I A β P Ο by (rule assms(1))
interpret Ο': is_cat_obj_prod Ξ± I A β P' Ο' by (rule assms(2))
from that show ?thesis
by
(
elim cat_lim_ex_is_arr_isomorphism'[
OF Ο.is_cat_limit_axioms Ο'.is_cat_limit_axioms,
unfolded the_cat_discrete_components(1)
]
)
qed
lemma cat_obj_coprod_ex_is_arr_isomorphism:
assumes "Ο : A >β©Cβ©Fβ©.β©β U : I β¦β¦β©CβΞ±β β" and "Ο' : A >β©Cβ©Fβ©.β©β U' : I β¦β¦β©CβΞ±β β"
obtains f where "f : U β¦β©iβ©sβ©oβββ U'" and "Ο' = ntcf_const (:β©C I) β f ββ©Nβ©Tβ©Cβ©F Ο"
proof-
interpret Ο: is_cat_obj_coprod Ξ± I A β U Ο by (rule assms(1))
interpret Ο': is_cat_obj_coprod Ξ± I A β U' Ο' by (rule assms(2))
from that show ?thesis
by
(
elim cat_colim_ex_is_arr_isomorphism[
OF Ο.is_cat_colimit_axioms Ο'.is_cat_colimit_axioms
]
)
qed
lemma cat_obj_coprod_ex_is_arr_isomorphism':
assumes "Ο : A >β©Cβ©Fβ©.β©β U : I β¦β¦β©CβΞ±β β" and "Ο' : A >β©Cβ©Fβ©.β©β U' : I β¦β¦β©CβΞ±β β"
obtains f where "f : U β¦β©iβ©sβ©oβββ U'"
and "βj. j ββ©β I βΉ Ο'β¦NTMapβ¦β¦jβ¦ = f ββ©Aβββ Οβ¦NTMapβ¦β¦jβ¦"
proof-
interpret Ο: is_cat_obj_coprod Ξ± I A β U Ο by (rule assms(1))
interpret Ο': is_cat_obj_coprod Ξ± I A β U' Ο' by (rule assms(2))
from that show ?thesis
by
(
elim cat_colim_ex_is_arr_isomorphism'[
OF Ο.is_cat_colimit_axioms Ο'.is_cat_colimit_axioms,
unfolded the_cat_discrete_components(1)
]
)
qed
subsectionβΉFinite product and finite coproductβΊ
locale is_cat_finite_obj_prod = is_cat_obj_prod Ξ± I A β P Ο
for Ξ± I A β P Ο +
assumes cat_fin_obj_prod_index_in_Ο: "I ββ©β Ο"
syntax "_is_cat_finite_obj_prod" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "Ο : P <β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n A : I β¦β¦β©CβΞ±β β" β
"CONST is_cat_finite_obj_prod Ξ± I A β P Ο"
locale is_cat_finite_obj_coprod = is_cat_obj_coprod Ξ± I A β U Ο
for Ξ± I A β U Ο +
assumes cat_fin_obj_coprod_index_in_Ο: "I ββ©β Ο"
syntax "_is_cat_finite_obj_coprod" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ >β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n _ :/ _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "Ο : A >β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n U : I β¦β¦β©CβΞ±β β" β
"CONST is_cat_finite_obj_coprod Ξ± I A β U Ο"
lemma (in is_cat_finite_obj_prod) cat_fin_obj_prod_index_vfinite: "vfinite I"
using cat_fin_obj_prod_index_in_Ο by auto
sublocale is_cat_finite_obj_prod β I: finite_category Ξ± βΉ:β©C IβΊ
by (intro finite_categoryI')
(
auto
simp: NTDom.HomDom.tiny_dg_category the_cat_discrete_components
intro!: cat_fin_obj_prod_index_vfinite
)
lemma (in is_cat_finite_obj_coprod) cat_fin_obj_coprod_index_vfinite:
"vfinite I"
using cat_fin_obj_coprod_index_in_Ο by auto
sublocale is_cat_finite_obj_coprod β I: finite_category Ξ± βΉ:β©C IβΊ
by (intro finite_categoryI')
(
auto
simp: NTDom.HomDom.tiny_dg_category the_cat_discrete_components
intro!: cat_fin_obj_coprod_index_vfinite
)
textβΉRules.βΊ
lemma (in is_cat_finite_obj_prod)
is_cat_finite_obj_prod_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "P' = P" and "A' = A" and "I' = I" and "β' = β"
shows "Ο : P' <β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n A' : I' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_finite_obj_prod_axioms)
mk_ide rf
is_cat_finite_obj_prod_def[unfolded is_cat_finite_obj_prod_axioms_def]
|intro is_cat_finite_obj_prodI|
|dest is_cat_finite_obj_prodD[dest]|
|elim is_cat_finite_obj_prodE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_finite_obj_prodD
lemma (in is_cat_finite_obj_coprod)
is_cat_finite_obj_coprod_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "U' = U" and "A' = A" and "I' = I" and "β' = β"
shows "Ο : A' >β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n U' : I' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_finite_obj_coprod_axioms)
mk_ide rf
is_cat_finite_obj_coprod_def[unfolded is_cat_finite_obj_coprod_axioms_def]
|intro is_cat_finite_obj_coprodI|
|dest is_cat_finite_obj_coprodD[dest]|
|elim is_cat_finite_obj_coprodE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_finite_obj_coprodD
textβΉDuality.βΊ
lemma (in is_cat_finite_obj_prod) is_cat_finite_obj_coprod_op:
"op_ntcf Ο : A >β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n P : I β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_finite_obj_coprodI)
(
cs_concl
cs_simp: cat_op_simps
cs_intro: cat_fin_obj_prod_index_in_Ο cat_cs_intros cat_op_intros
)
lemma (in is_cat_finite_obj_prod) is_cat_finite_obj_coprod_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ο : A >β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n P : I β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_finite_obj_coprod_op)
lemmas [cat_op_intros] = is_cat_finite_obj_prod.is_cat_finite_obj_coprod_op'
lemma (in is_cat_finite_obj_coprod) is_cat_finite_obj_prod_op:
"op_ntcf Ο : U <β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n A : I β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_finite_obj_prodI)
(
cs_concl
cs_simp: cat_op_simps
cs_intro: cat_fin_obj_coprod_index_in_Ο cat_cs_intros cat_op_intros
)
lemma (in is_cat_finite_obj_coprod) is_cat_finite_obj_prod_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ο : U <β©Cβ©Fβ©.β©ββ©.β©fβ©iβ©n A : I β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_finite_obj_prod_op)
lemmas [cat_op_intros] = is_cat_finite_obj_coprod.is_cat_finite_obj_prod_op'
subsectionβΉProduct and coproduct of two objectsβΊ
subsubsectionβΉDefinition and elementary propertiesβΊ
locale is_cat_obj_prod_2 = is_cat_obj_prod Ξ± βΉ2β©ββΊ βΉif2 a bβΊ β P Ο
for Ξ± a b β P Ο
syntax "_is_cat_obj_prod_2" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©Γ {_,_} :/ 2β©C β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "Ο : P <β©Cβ©Fβ©.β©Γ {a,b} : 2β©C β¦β¦β©CβΞ±β β" β
"CONST is_cat_obj_prod_2 Ξ± a b β P Ο"
locale is_cat_obj_coprod_2 = is_cat_obj_coprod Ξ± βΉ2β©ββΊ βΉif2 a bβΊ β P Ο
for Ξ± a b β P Ο
syntax "_is_cat_obj_coprod_2" :: "V β V β V β V β V β V β bool"
(βΉ(_ :/ {_,_} >β©Cβ©Fβ©.β©β _ :/ 2β©C β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51] 51)
translations "Ο : {a,b} >β©Cβ©Fβ©.β©β U : 2β©C β¦β¦β©CβΞ±β β" β
"CONST is_cat_obj_coprod_2 Ξ± a b β U Ο"
abbreviation proj_fst where "proj_fst Ο β‘ vpfst (Οβ¦NTMapβ¦)"
abbreviation proj_snd where "proj_snd Ο β‘ vpsnd (Οβ¦NTMapβ¦)"
textβΉRules.βΊ
lemma (in is_cat_obj_prod_2) is_cat_obj_prod_2_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "P' = P" and "a' = a" and "b' = b" and "β' = β"
shows "Ο : P' <β©Cβ©Fβ©.β©Γ {a',b'} : 2β©C β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_obj_prod_2_axioms)
mk_ide rf is_cat_obj_prod_2_def
|intro is_cat_obj_prod_2I|
|dest is_cat_obj_prod_2D[dest]|
|elim is_cat_obj_prod_2E[elim]|
lemmas [cat_lim_cs_intros] = is_cat_obj_prod_2D
lemma (in is_cat_obj_coprod_2) is_cat_obj_coprod_2_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±" and "P' = P" and "a' = a" and "b' = b" and "β' = β"
shows "Ο : {a',b'} >β©Cβ©Fβ©.β©β P' : 2β©C β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_obj_coprod_2_axioms)
mk_ide rf is_cat_obj_coprod_2_def
|intro is_cat_obj_coprod_2I|
|dest is_cat_obj_coprod_2D[dest]|
|elim is_cat_obj_coprod_2E[elim]|
lemmas [cat_lim_cs_intros] = is_cat_obj_coprod_2D
textβΉDuality.βΊ
lemma (in is_cat_obj_prod_2) is_cat_obj_coprod_2_op:
"op_ntcf Ο : {a,b} >β©Cβ©Fβ©.β©β P : 2β©C β¦β¦β©CβΞ±β op_cat β"
by (rule is_cat_obj_coprod_2I[OF is_cat_obj_coprod_op])
lemma (in is_cat_obj_prod_2) is_cat_obj_coprod_2_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ο : {a,b} >β©Cβ©Fβ©.β©β P : 2β©C β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_obj_coprod_2_op)
lemmas [cat_op_intros] = is_cat_obj_prod_2.is_cat_obj_coprod_2_op'
lemma (in is_cat_obj_coprod_2) is_cat_obj_prod_2_op:
"op_ntcf Ο : P <β©Cβ©Fβ©.β©Γ {a,b} : 2β©C β¦β¦β©CβΞ±β op_cat β"
by (rule is_cat_obj_prod_2I[OF is_cat_obj_prod_op])
lemma (in is_cat_obj_coprod_2) is_cat_obj_prod_2_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ο : P <β©Cβ©Fβ©.β©Γ {a,b} : 2β©C β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_obj_prod_2_op)
lemmas [cat_op_intros] = is_cat_obj_coprod_2.is_cat_obj_prod_2_op'
textβΉProduct/coproduct of two objects is a finite product/coproduct.βΊ
sublocale is_cat_obj_prod_2 β is_cat_finite_obj_prod Ξ± βΉ2β©ββΊ βΉif2 a bβΊ β P Ο
proof(intro is_cat_finite_obj_prodI)
show "2β©β ββ©β Ο" by simp
qed (cs_concl cs_simp: two[symmetric] cs_intro: cat_lim_cs_intros)
sublocale is_cat_obj_coprod_2 β is_cat_finite_obj_coprod Ξ± βΉ2β©ββΊ βΉif2 a bβΊ β P Ο
proof(intro is_cat_finite_obj_coprodI)
show "2β©β ββ©β Ο" by simp
qed (cs_concl cs_simp: two[symmetric] cs_intro: cat_lim_cs_intros)
textβΉElementary properties.βΊ
lemma (in is_cat_obj_prod_2) cat_obj_prod_2_lr_in_Obj:
shows cat_obj_prod_2_left_in_Obj[cat_lim_cs_intros]: "a ββ©β ββ¦Objβ¦"
and cat_obj_prod_2_right_in_Obj[cat_lim_cs_intros]: "b ββ©β ββ¦Objβ¦"
proof-
have 0: "0 ββ©β 2β©β" and 1: "1β©β ββ©β 2β©β" by simp_all
show "a ββ©β ββ¦Objβ¦" and "b ββ©β ββ¦Objβ¦"
by
(
intro
cf_discrete_selector_vrange[OF 0, simplified]
cf_discrete_selector_vrange[OF 1, simplified]
)+
qed
lemmas [cat_lim_cs_intros] = is_cat_obj_prod_2.cat_obj_prod_2_lr_in_Obj
lemma (in is_cat_obj_coprod_2) cat_obj_coprod_2_lr_in_Obj:
shows cat_obj_coprod_2_left_in_Obj[cat_lim_cs_intros]: "a ββ©β ββ¦Objβ¦"
and cat_obj_coprod_2_right_in_Obj[cat_lim_cs_intros]: "b ββ©β ββ¦Objβ¦"
by
(
intro is_cat_obj_prod_2.cat_obj_prod_2_lr_in_Obj[
OF is_cat_obj_prod_2_op, unfolded cat_op_simps
]
)+
lemmas [cat_lim_cs_intros] = is_cat_obj_coprod_2.cat_obj_coprod_2_lr_in_Obj
textβΉUtilities/help lemmas.βΊ
lemma helper_I2_proj_fst_proj_snd_iff:
"(βjββ©β2β©β. Ο'β¦NTMapβ¦β¦jβ¦ = Οβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f') β·
(proj_fst Ο' = proj_fst Ο ββ©Aβββ f' β§ proj_snd Ο' = proj_snd Ο ββ©Aβββ f')"
unfolding two by auto
lemma helper_I2_proj_fst_proj_snd_iff':
"(βjββ©β2β©β. Ο'β¦NTMapβ¦β¦jβ¦ = f' ββ©Aβββ Οβ¦NTMapβ¦β¦jβ¦) β·
(proj_fst Ο' = f' ββ©Aβββ proj_fst Ο β§ proj_snd Ο' = f' ββ©Aβββ proj_snd Ο)"
unfolding two by auto
subsubsectionβΉUniversal propertyβΊ
lemma (in is_cat_obj_prod_2) cat_obj_prod_2_unique_cone':
assumes "Ο' : P' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e :β: (2β©β) (if2 a b) β : :β©C (2β©β) β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : P' β¦βββ P β§
proj_fst Ο' = proj_fst Ο ββ©Aβββ f' β§
proj_snd Ο' = proj_snd Ο ββ©Aβββ f'"
by
(
rule cat_obj_prod_unique_cone'[
OF assms, unfolded helper_I2_proj_fst_proj_snd_iff
]
)
lemma (in is_cat_obj_prod_2) cat_obj_prod_2_unique:
assumes "Ο' : P' <β©Cβ©Fβ©.β©Γ {a,b} : 2β©C β¦β¦β©CβΞ±β β"
shows "β!f'. f' : P' β¦βββ P β§ Ο' = Ο ββ©Nβ©Tβ©Cβ©F ntcf_const (:β©C (2β©β)) β f'"
by (rule cat_obj_prod_unique[OF is_cat_obj_prod_2D[OF assms]])
lemma (in is_cat_obj_prod_2) cat_obj_prod_2_unique':
assumes "Ο' : P' <β©Cβ©Fβ©.β©Γ {a,b} : 2β©C β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : P' β¦βββ P β§
proj_fst Ο' = proj_fst Ο ββ©Aβββ f' β§
proj_snd Ο' = proj_snd Ο ββ©Aβββ f'"
by
(
rule cat_obj_prod_unique'[
OF is_cat_obj_prod_2D[OF assms],
unfolded helper_I2_proj_fst_proj_snd_iff
]
)
lemma (in is_cat_obj_coprod_2) cat_obj_coprod_2_unique_cocone':
assumes "Ο' : :β: (2β©β) (if2 a b) β >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e P' : :β©C (2β©β) β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : P β¦βββ P' β§
proj_fst Ο' = f' ββ©Aβββ proj_fst Ο β§
proj_snd Ο' = f' ββ©Aβββ proj_snd Ο"
by
(
rule cat_obj_coprod_unique_cocone'[
OF assms, unfolded helper_I2_proj_fst_proj_snd_iff'
]
)
lemma (in is_cat_obj_coprod_2) cat_obj_coprod_2_unique:
assumes "Ο' : {a,b} >β©Cβ©Fβ©.β©β P' : 2β©C β¦β¦β©CβΞ±β β"
shows "β!f'. f' : P β¦βββ P' β§ Ο' = ntcf_const (:β©C (2β©β)) β f' ββ©Nβ©Tβ©Cβ©F Ο"
by (rule cat_obj_coprod_unique[OF is_cat_obj_coprod_2D[OF assms]])
lemma (in is_cat_obj_coprod_2) cat_obj_coprod_2_unique':
assumes "Ο' : {a,b} >β©Cβ©Fβ©.β©β P' : 2β©C β¦β¦β©CβΞ±β β"
shows
"β!f'. f' : P β¦βββ P' β§
proj_fst Ο' = f' ββ©Aβββ proj_fst Ο β§
proj_snd Ο' = f' ββ©Aβββ proj_snd Ο"
by
(
rule cat_obj_coprod_unique'[
OF is_cat_obj_coprod_2D[OF assms],
unfolded helper_I2_proj_fst_proj_snd_iff'
]
)
lemma cat_obj_prod_2_ex_is_arr_isomorphism:
assumes "Ο : P <β©Cβ©Fβ©.β©Γ {a,b} : 2β©C β¦β¦β©CβΞ±β β"
and "Ο' : P' <β©Cβ©Fβ©.β©Γ {a,b} : 2β©C β¦β¦β©CβΞ±β β"
obtains f where "f : P' β¦β©iβ©sβ©oβββ P" and "Ο' = Ο ββ©Nβ©Tβ©Cβ©F ntcf_const (:β©C (2β©β)) β f"
proof-
interpret Ο: is_cat_obj_prod_2 Ξ± a b β P Ο by (rule assms(1))
interpret Ο': is_cat_obj_prod_2 Ξ± a b β P' Ο' by (rule assms(2))
from that show ?thesis
by
(
elim cat_obj_prod_ex_is_arr_isomorphism[
OF Ο.is_cat_obj_prod_axioms Ο'.is_cat_obj_prod_axioms
]
)
qed
lemma cat_obj_coprod_2_ex_is_arr_isomorphism:
assumes "Ο : {a,b} >β©Cβ©Fβ©.β©β U : 2β©C β¦β¦β©CβΞ±β β"
and "Ο' : {a,b} >β©Cβ©Fβ©.β©β U' : 2β©C β¦β¦β©CβΞ±β β"
obtains f where "f : U β¦β©iβ©sβ©oβββ U'" and "Ο' = ntcf_const (:β©C (2β©β)) β f ββ©Nβ©Tβ©Cβ©F Ο"
proof-
interpret Ο: is_cat_obj_coprod_2 Ξ± a b β U Ο by (rule assms(1))
interpret Ο': is_cat_obj_coprod_2 Ξ± a b β U' Ο' by (rule assms(2))
from that show ?thesis
by
(
elim cat_obj_coprod_ex_is_arr_isomorphism[
OF Ο.is_cat_obj_coprod_axioms Ο'.is_cat_obj_coprod_axioms
]
)
qed
subsectionβΉPullbacks and pushoutsβΊ
subsubsectionβΉDefinition and elementary propertiesβΊ
textβΉ
The definitions and the elementary properties of the pullbacks and the
pushouts can be found, for example, in Chapter III-3 and Chapter III-4 in
\cite{mac_lane_categories_2010}.
βΊ
locale is_cat_pullback =
is_cat_limit Ξ± βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ X x +
cf_scospan Ξ± π π€ π¬ π£ π β
for Ξ± π π€ π¬ π£ π β X x
syntax "_is_cat_pullback" :: "V β V β V β V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©pβ©b _β_β_β_β_ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51, 51, 51, 51] 51)
translations "x : X <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β" β
"CONST is_cat_pullback Ξ± π π€ π¬ π£ π β X x"
locale is_cat_pushout =
is_cat_colimit Ξ± βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ X x +
cf_sspan Ξ± π π€ π¬ π£ π β
for Ξ± π π€ π¬ π£ π β X x
syntax "_is_cat_pushout" :: "V β V β V β V β V β V β V β V β V β bool"
(βΉ(_ :/ _β_β_β_β_ >β©Cβ©Fβ©.β©pβ©o _ β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51, 51, 51, 51] 51)
translations "x : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X β¦β¦β©CβΞ±β β" β
"CONST is_cat_pushout Ξ± π π€ π¬ π£ π β X x"
textβΉRules.βΊ
lemma (in is_cat_pullback) is_cat_pullback_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±"
and "π' = π"
and "π€' = π€"
and "π¬' = π¬"
and "π£' = π£"
and "π' = π"
and "β' = β"
and "X' = X"
shows "x : X' <β©Cβ©Fβ©.β©pβ©b π'βπ€'βπ¬'βπ£'βπ' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_pullback_axioms)
mk_ide rf is_cat_pullback_def
|intro is_cat_pullbackI|
|dest is_cat_pullbackD[dest]|
|elim is_cat_pullbackE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_pullbackD
lemma (in is_cat_pushout) is_cat_pushout_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±"
and "π' = π"
and "π€' = π€"
and "π¬' = π¬"
and "π£' = π£"
and "π' = π"
and "β' = β"
and "X' = X"
shows "x : π'βπ€'βπ¬'βπ£'βπ' >β©Cβ©Fβ©.β©pβ©o X' β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_pushout_axioms)
mk_ide rf is_cat_pushout_def
|intro is_cat_pushoutI|
|dest is_cat_pushoutD[dest]|
|elim is_cat_pushoutE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_pushoutD
textβΉDuality.βΊ
lemma (in is_cat_pullback) is_cat_pushout_op:
"op_ntcf x : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_pushoutI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_op_intros)+
lemma (in is_cat_pullback) is_cat_pushout_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf x : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_pushout_op)
lemmas [cat_op_intros] = is_cat_pullback.is_cat_pushout_op'
lemma (in is_cat_pushout) is_cat_pullback_op:
"op_ntcf x : X <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_pullbackI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_op_intros)+
lemma (in is_cat_pushout) is_cat_pullback_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf x : X <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_pullback_op)
lemmas [cat_op_intros] = is_cat_pushout.is_cat_pullback_op'
textβΉElementary properties.βΊ
lemma cat_cone_cospan:
assumes "x : X <β©Cβ©Fβ©.β©cβ©oβ©nβ©e β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β"
and "cf_scospan Ξ± π π€ π¬ π£ π β"
shows "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = π€ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
and "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = π£ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
and "π€ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = π£ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
proof-
interpret x: is_cat_cone Ξ± X βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ x
by (rule assms(1))
interpret cospan: cf_scospan Ξ± π π€ π¬ π£ π β by (rule assms(2))
have π€β©Sβ©S: "π€β©Sβ©S : πβ©Sβ©S β¦βββββ©Cβ π¬β©Sβ©S" and π£β©Sβ©S: "π£β©Sβ©S : πβ©Sβ©S β¦βββββ©Cβ π¬β©Sβ©S"
by (cs_concl cs_simp: cs_intro: cat_ss_cs_intros)+
from x.ntcf_Comp_commute[OF π€β©Sβ©S] π€β©Sβ©S π£β©Sβ©S show
"xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = π€ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
by (cs_prems cs_simp: cat_ss_cs_simps cat_cs_simps cs_intro: cat_cs_intros)
moreover from x.ntcf_Comp_commute[OF π£β©Sβ©S] π€β©Sβ©S π£β©Sβ©S show
"xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = π£ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
by (cs_prems cs_simp: cat_ss_cs_simps cat_cs_simps cs_intro: cat_cs_intros)
ultimately show "π€ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = π£ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦" by simp
qed
lemma (in is_cat_pullback) cat_pb_cone_cospan:
shows "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = π€ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
and "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = π£ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
and "π€ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = π£ ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
by (allβΉrule cat_cone_cospan[OF is_cat_cone_axioms cf_scospan_axioms]βΊ)
lemma cat_cocone_span:
assumes "x : β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e X : ββββ©C β¦β¦β©CβΞ±β β"
and "cf_sspan Ξ± π π€ π¬ π£ π β"
shows "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π€"
and "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π£"
and "xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π€ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π£"
proof-
interpret x: is_cat_cocone Ξ± X βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ x
by (rule assms(1))
interpret span: cf_sspan Ξ± π π€ π¬ π£ π β by (rule assms(2))
note op =
cat_cone_cospan
[
OF
x.is_cat_cone_op[unfolded cat_op_simps]
span.cf_scospan_op,
unfolded cat_op_simps
]
from op(1) show "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π€"
by
(
cs_prems
cs_simp: cat_ss_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_ss_cs_intros
)
moreover from op(2) show "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π£"
by
(
cs_prems
cs_simp: cat_ss_cs_simps cat_op_simps
cs_intro: cat_cs_intros cat_ss_cs_intros
)
ultimately show "xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π€ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π£" by auto
qed
lemma (in is_cat_pushout) cat_po_cocone_span:
shows "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π€"
and "xβ¦NTMapβ¦β¦π¬β©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π£"
and "xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π€ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ π£"
by (allβΉrule cat_cocone_span[OF is_cat_cocone_axioms cf_sspan_axioms]βΊ)
subsubsectionβΉUniversal propertyβΊ
lemma is_cat_pullbackI':
assumes "x : X <β©Cβ©Fβ©.β©cβ©oβ©nβ©e β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β"
and "cf_scospan Ξ± π π€ π¬ π£ π β"
and "βx' X'.
x' : X' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β βΉ
β!f'.
f' : X' β¦βββ X β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'"
shows "x : X <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β"
proof(intro is_cat_pullbackI is_cat_limitI')
show "x : X <β©Cβ©Fβ©.β©cβ©oβ©nβ©e β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β"
by (rule assms(1))
interpret x: is_cat_cone Ξ± X βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ x
by (rule assms(1))
show "cf_scospan Ξ± π π€ π¬ π£ π β" by (rule assms(2))
interpret cospan: cf_scospan Ξ± π π€ π¬ π£ π β by (rule assms(2))
fix u' r' assume prems:
"u' : r' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β"
interpret u': is_cat_cone Ξ± r' βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ u'
by (rule prems)
from assms(3)[OF prems] obtain f'
where f': "f' : r' β¦βββ X"
and u'_πβ©Sβ©S: "u'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'"
and u'_πβ©Sβ©S: "u'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'"
and unique_f': "βf''.
β¦
f'' : r' β¦βββ X;
u'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'';
u'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f''
β§ βΉ f'' = f'"
by metis
show "β!f'. f' : r' β¦βββ X β§ u' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'"
proof(intro ex1I conjI; (elim conjE)?)
show "u' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'"
proof(rule ntcf_eqI)
show "u' : cf_const ββββ©C β r' β¦β©Cβ©F β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β"
by (rule u'.is_ntcf_axioms)
from f' show
"x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f' :
cf_const ββββ©C β r' β¦β©Cβ©F β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ :
ββββ©C β¦β¦β©CβΞ±β β"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
from f' have dom_rhs:
"πβ©β ((x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f')β¦NTMapβ¦) = ββββ©Cβ¦Objβ¦"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
show "u'β¦NTMapβ¦ = (x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f')β¦NTMapβ¦"
proof(rule vsv_eqI, unfold cat_cs_simps dom_rhs)
fix a assume prems': "a ββ©β ββββ©Cβ¦Objβ¦"
from this f' x.is_ntcf_axioms show
"u'β¦NTMapβ¦β¦aβ¦ = (x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f')β¦NTMapβ¦β¦aβ¦"
by (elim the_cat_scospan_ObjE; simp only:)
(
cs_concl
cs_simp:
cat_cs_simps cat_ss_cs_simps
u'_πβ©Sβ©S u'_πβ©Sβ©S
cat_cone_cospan(1)[OF assms(1,2)]
cat_cone_cospan(1)[OF prems assms(2)]
cs_intro: cat_cs_intros cat_ss_cs_intros
)+
qed (cs_concl cs_intro: cat_cs_intros | auto)+
qed simp_all
fix f'' assume prems:
"f'' : r' β¦βββ X" "u' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f''"
have πβ©Sβ©S: "πβ©Sβ©S ββ©β ββββ©Cβ¦Objβ¦" and πβ©Sβ©S: "πβ©Sβ©S ββ©β ββββ©Cβ¦Objβ¦"
by (cs_concl cs_simp: cs_intro: cat_ss_cs_intros)+
have "u'β¦NTMapβ¦β¦aβ¦ = xβ¦NTMapβ¦β¦aβ¦ ββ©Aβββ f''" if "a ββ©β ββββ©Cβ¦Objβ¦" for a
proof-
from prems(2) have
"u'β¦NTMapβ¦β¦aβ¦ = (x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'')β¦NTMapβ¦β¦aβ¦"
by simp
from this that prems(1) show "u'β¦NTMapβ¦β¦aβ¦ = xβ¦NTMapβ¦β¦aβ¦ ββ©Aβββ f''"
by (cs_prems cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
qed
from unique_f'[OF prems(1) this[OF πβ©Sβ©S] this[OF πβ©Sβ©S]] show "f'' = f'".
qed (intro f')
qed
lemma is_cat_pushoutI':
assumes "x : β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e X : ββββ©C β¦β¦β©CβΞ±β β"
and "cf_sspan Ξ± π π€ π¬ π£ π β"
and "βx' X'. x' : β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e X' : ββββ©C β¦β¦β©CβΞ±β β βΉ
β!f'.
f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
shows "x : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X β¦β¦β©CβΞ±β β"
proof-
interpret x: is_cat_cocone Ξ± X βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ x
by (rule assms(1))
interpret span: cf_sspan Ξ± π π€ π¬ π£ π β by (rule assms(2))
have assms_3':
"β!f'.
f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβop_cat ββ f' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβop_cat ββ f'"
if "x' : X' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβop_cat ββ : ββββ©C β¦β¦β©CβΞ±β op_cat β"
for x' X'
proof-
from that(1) have [cat_op_simps]:
"f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβop_cat ββ f' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβop_cat ββ f' β·
f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
for f'
by (intro iffI conjI; (elim conjE)?)
(
cs_concl
cs_simp: category.op_cat_Comp[symmetric] cat_op_simps cat_cs_simps
cs_intro: cat_cs_intros cat_ss_cs_intros
)+
interpret x':
is_cat_cone Ξ± X' βΉββββ©CβΊ βΉop_cat ββΊ βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβop_cat βββΊ x'
by (rule that)
show ?thesis
unfolding cat_op_simps
by
(
rule assms(3)[
OF x'.is_cat_cocone_op[unfolded cat_op_simps],
unfolded cat_op_simps
]
)
qed
interpret op_x: is_cat_pullback Ξ± π π€ π¬ π£ π βΉop_cat ββΊ X βΉop_ntcf xβΊ
using
is_cat_pullbackI'
[
OF x.is_cat_cone_op[unfolded cat_op_simps]
span.cf_scospan_op,
unfolded cat_op_simps,
OF assms_3'
]
by simp
show "x : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X β¦β¦β©CβΞ±β β"
by (rule op_x.is_cat_pushout_op[unfolded cat_op_simps])
qed
lemma (in is_cat_pullback) cat_pb_unique_cone:
assumes "x' : X' <β©Cβ©Fβ©.β©cβ©oβ©nβ©e β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β"
shows "β!f'.
f' : X' β¦βββ X β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'"
proof-
interpret x': is_cat_cone Ξ± X' βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ x'
by (rule assms)
from cat_lim_unique_cone[OF assms] obtain f'
where f': "f' : X' β¦βββ X"
and x'_def: "x' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'"
and unique_f': "βf''.
β¦ f'' : X' β¦βββ X; x' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'' β§ βΉ
f'' = f'"
by auto
have πβ©Sβ©S: "πβ©Sβ©S ββ©β ββββ©Cβ¦Objβ¦" and πβ©Sβ©S: "πβ©Sβ©S ββ©β ββββ©Cβ¦Objβ¦"
by (cs_concl cs_intro: cat_ss_cs_intros)+
show ?thesis
proof(intro ex1I conjI; (elim conjE)?)
show "f' : X' β¦βββ X" by (rule f')
have "x'β¦NTMapβ¦β¦aβ¦ = xβ¦NTMapβ¦β¦aβ¦ ββ©Aβββ f'" if "a ββ©β ββββ©Cβ¦Objβ¦" for a
proof-
from x'_def have
"x'β¦NTMapβ¦β¦aβ¦ = (x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f')β¦NTMapβ¦β¦aβ¦"
by simp
from this that f' show "x'β¦NTMapβ¦β¦aβ¦ = xβ¦NTMapβ¦β¦aβ¦ ββ©Aβββ f'"
by (cs_prems cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
qed
from this[OF πβ©Sβ©S] this[OF πβ©Sβ©S] show
"x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'"
"x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'"
by auto
fix f'' assume prems':
"f'' : X' β¦βββ X"
"x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f''"
"x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f''"
have "x' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f''"
proof(rule ntcf_eqI)
show "x' : cf_const ββββ©C β X' β¦β©Cβ©F β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ : ββββ©C β¦β¦β©CβΞ±β β"
by (rule x'.is_ntcf_axioms)
from prems'(1) show
"x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'' :
cf_const ββββ©C β X' β¦β©Cβ©F β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ :
ββββ©C β¦β¦β©CβΞ±β β"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
have dom_lhs: "πβ©β (x'β¦NTMapβ¦) = ββββ©Cβ¦Objβ¦"
by (cs_concl cs_simp: cat_cs_simps)
from prems'(1) have dom_rhs:
"πβ©β ((x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'')β¦NTMapβ¦) = ββββ©Cβ¦Objβ¦"
by (cs_concl cs_simp: cat_cs_simps cs_intro: cat_cs_intros)
show "x'β¦NTMapβ¦ = (x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'')β¦NTMapβ¦"
proof(rule vsv_eqI, unfold dom_lhs dom_rhs)
fix a assume prems'': "a ββ©β ββββ©Cβ¦Objβ¦"
from this prems'(1) show
"x'β¦NTMapβ¦β¦aβ¦ = (x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'')β¦NTMapβ¦β¦aβ¦"
by (elim the_cat_scospan_ObjE; simp only:)
(
cs_concl
cs_simp:
prems'(2,3)
cat_cone_cospan(1,2)[OF assms cf_scospan_axioms]
cat_pb_cone_cospan
cat_ss_cs_simps cat_cs_simps
cs_intro: cat_ss_cs_intros cat_cs_intros
)+
qed (auto simp: cat_cs_intros)
qed simp_all
from unique_f'[OF prems'(1) this] show "f'' = f'".
qed
qed
lemma (in is_cat_pullback) cat_pb_unique:
assumes "x' : X' <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β"
shows "β!f'. f' : X' β¦βββ X β§ x' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f'"
by (rule cat_lim_unique[OF is_cat_pullbackD(1)[OF assms]])
lemma (in is_cat_pullback) cat_pb_unique':
assumes "x' : X' <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β"
shows "β!f'.
f' : X' β¦βββ X β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f'"
proof-
interpret x': is_cat_pullback Ξ± π π€ π¬ π£ π β X' x' by (rule assms(1))
show ?thesis by (rule cat_pb_unique_cone[OF x'.is_cat_cone_axioms])
qed
lemma (in is_cat_pushout) cat_po_unique_cocone:
assumes "x' : β¨πβπ€βπ¬βπ£βπβ©β©Cβ©Fβββ >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e X' : ββββ©C β¦β¦β©CβΞ±β β"
shows "β!f'.
f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
proof-
interpret x': is_cat_cocone Ξ± X' βΉββββ©CβΊ β βΉβ¨πβπ€βπ¬βπ£βπβ©β©Cβ©FββββΊ x'
by (rule assms(1))
have [cat_op_simps]:
"f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβop_cat ββ f' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβop_cat ββ f' β·
f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
for f'
by (intro iffI conjI; (elim conjE)?)
(
cs_concl
cs_simp: category.op_cat_Comp[symmetric] cat_op_simps cat_cs_simps
cs_intro: cat_cs_intros cat_ss_cs_intros
)+
show ?thesis
by
(
rule is_cat_pullback.cat_pb_unique_cone[
OF is_cat_pullback_op x'.is_cat_cone_op[unfolded cat_op_simps],
unfolded cat_op_simps
]
)
qed
lemma (in is_cat_pushout) cat_po_unique:
assumes "x' : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X' β¦β¦β©CβΞ±β β"
shows "β!f'. f' : X β¦βββ X' β§ x' = ntcf_const ββββ©C β f' ββ©Nβ©Tβ©Cβ©F x"
by (rule cat_colim_unique[OF is_cat_pushoutD(1)[OF assms]])
lemma (in is_cat_pushout) cat_po_unique':
assumes "x' : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X' β¦β¦β©CβΞ±β β"
shows "β!f'.
f' : X β¦βββ X' β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ β§
x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f' ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
proof-
interpret x': is_cat_pushout Ξ± π π€ π¬ π£ π β X' x' by (rule assms(1))
show ?thesis by (rule cat_po_unique_cocone[OF x'.is_cat_cocone_axioms])
qed
lemma cat_pullback_ex_is_arr_isomorphism:
assumes "x : X <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β"
and "x' : X' <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β"
obtains f where "f : X' β¦β©iβ©sβ©oβββ X"
and "x' = x ββ©Nβ©Tβ©Cβ©F ntcf_const ββββ©C β f"
proof-
interpret x: is_cat_pullback Ξ± π π€ π¬ π£ π β X x by (rule assms(1))
interpret x': is_cat_pullback Ξ± π π€ π¬ π£ π β X' x' by (rule assms(2))
from that show ?thesis
by
(
elim cat_lim_ex_is_arr_isomorphism[
OF x.is_cat_limit_axioms x'.is_cat_limit_axioms
]
)
qed
lemma cat_pullback_ex_is_arr_isomorphism':
assumes "x : X <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β"
and "x' : X' <β©Cβ©Fβ©.β©pβ©b πβπ€βπ¬βπ£βπ β¦β¦β©CβΞ±β β"
obtains f where "f : X' β¦β©iβ©sβ©oβββ X"
and "x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f"
and "x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f"
proof-
interpret x: is_cat_pullback Ξ± π π€ π¬ π£ π β X x by (rule assms(1))
interpret x': is_cat_pullback Ξ± π π€ π¬ π£ π β X' x' by (rule assms(2))
obtain f where f: "f : X' β¦β©iβ©sβ©oβββ X"
and "j ββ©β ββββ©Cβ¦Objβ¦ βΉ x'β¦NTMapβ¦β¦jβ¦ = xβ¦NTMapβ¦β¦jβ¦ ββ©Aβββ f" for j
by
(
elim cat_lim_ex_is_arr_isomorphism'[
OF x.is_cat_limit_axioms x'.is_cat_limit_axioms
]
)
then have
"x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f"
"x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦ ββ©Aβββ f"
by (auto simp: cat_ss_cs_intros)
with f show ?thesis using that by simp
qed
lemma cat_pushout_ex_is_arr_isomorphism:
assumes "x : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X β¦β¦β©CβΞ±β β"
and "x' : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X' β¦β¦β©CβΞ±β β"
obtains f where "f : X β¦β©iβ©sβ©oβββ X'"
and "x' = ntcf_const ββββ©C β f ββ©Nβ©Tβ©Cβ©F x"
proof-
interpret x: is_cat_pushout Ξ± π π€ π¬ π£ π β X x by (rule assms(1))
interpret x': is_cat_pushout Ξ± π π€ π¬ π£ π β X' x' by (rule assms(2))
from that show ?thesis
by
(
elim cat_colim_ex_is_arr_isomorphism[
OF x.is_cat_colimit_axioms x'.is_cat_colimit_axioms
]
)
qed
lemma cat_pushout_ex_is_arr_isomorphism':
assumes "x : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X β¦β¦β©CβΞ±β β"
and "x' : πβπ€βπ¬βπ£βπ >β©Cβ©Fβ©.β©pβ©o X' β¦β¦β©CβΞ±β β"
obtains f where "f : X β¦β©iβ©sβ©oβββ X'"
and "x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
and "x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
proof-
interpret x: is_cat_pushout Ξ± π π€ π¬ π£ π β X x by (rule assms(1))
interpret x': is_cat_pushout Ξ± π π€ π¬ π£ π β X' x' by (rule assms(2))
obtain f where f: "f : X β¦β©iβ©sβ©oβββ X'"
and "j ββ©β ββββ©Cβ¦Objβ¦ βΉ x'β¦NTMapβ¦β¦jβ¦ = f ββ©Aβββ xβ¦NTMapβ¦β¦jβ¦" for j
by
(
elim cat_colim_ex_is_arr_isomorphism'[
OF x.is_cat_colimit_axioms x'.is_cat_colimit_axioms,
unfolded the_cat_parallel_components(1)
]
)
then have "x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
and "x'β¦NTMapβ¦β¦πβ©Sβ©Sβ¦ = f ββ©Aβββ xβ¦NTMapβ¦β¦πβ©Sβ©Sβ¦"
by (auto simp: cat_ss_cs_intros)
with f show ?thesis using that by simp
qed
subsectionβΉEqualizers and coequalizersβΊ
subsubsectionβΉDefinition and elementary propertiesβΊ
textβΉ
See \cite{noauthor_wikipedia_2001}\footnote{
\url{https://en.wikipedia.org/wiki/Equaliser_(mathematics)}
}.
βΊ
locale is_cat_equalizer =
is_cat_limit Ξ± βΉβββ©C πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©LβΊ β βΉβββββ β πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£βΊ E Ξ΅
for Ξ± π π π€ π£ β E Ξ΅ +
assumes cat_eq_π€[cat_lim_cs_intros]: "π€ : π β¦βββ π"
and cat_eq_π£[cat_lim_cs_intros]: "π£ : π β¦βββ π"
syntax "_is_cat_equalizer" :: "V β V β V β V β V β V β V β V β bool"
(βΉ(_ :/ _ <β©Cβ©Fβ©.β©eβ©q '(_,_,_,_') :/ βββ§2β©C β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51, 51] 51)
translations "Ξ΅ : E <β©Cβ©Fβ©.β©eβ©q (π,π,π€,π£) : βββ§2β©C β¦β¦β©CβΞ±β β" β
"CONST is_cat_equalizer Ξ± π π π€ π£ β E Ξ΅"
locale is_cat_coequalizer =
is_cat_colimit Ξ± βΉβββ©C πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©LβΊ β βΉβββββ β πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€βΊ E Ξ΅
for Ξ± π π π€ π£ β E Ξ΅ +
assumes cat_coeq_π€[cat_lim_cs_intros]: "π€ : π β¦βββ π"
and cat_coeq_π£[cat_lim_cs_intros]: "π£ : π β¦βββ π"
syntax "_is_cat_coequalizer" :: "V β V β V β V β V β V β V β V β bool"
(βΉ(_ :/ '(_,_,_,_') >β©Cβ©Fβ©.β©cβ©oβ©eβ©q _ :/ βββ§2β©C β¦β¦β©CΔ± _)βΊ [51, 51, 51, 51, 51, 51] 51)
translations "Ξ΅ : (π,π,π€,π£) >β©Cβ©Fβ©.β©cβ©oβ©eβ©q E : βββ§2β©C β¦β¦β©CβΞ±β β" β
"CONST is_cat_coequalizer Ξ± π π π€ π£ β E Ξ΅"
textβΉRules.βΊ
lemma (in is_cat_equalizer) is_cat_equalizer_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±"
and "E' = E"
and "π' = π"
and "π' = π"
and "π€' = π€"
and "π£' = π£"
and "β' = β"
shows "Ξ΅ : E' <β©Cβ©Fβ©.β©eβ©q (π',π',π€',π£') : βββ§2β©C β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_equalizer_axioms)
mk_ide rf is_cat_equalizer_def[unfolded is_cat_equalizer_axioms_def]
|intro is_cat_equalizerI|
|dest is_cat_equalizerD[dest]|
|elim is_cat_equalizerE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_equalizerD(1)
lemma (in is_cat_coequalizer) is_cat_coequalizer_axioms'[cat_lim_cs_intros]:
assumes "Ξ±' = Ξ±"
and "E' = E"
and "π' = π"
and "π' = π"
and "π€' = π€"
and "π£' = π£"
and "β' = β"
shows "Ξ΅ : (π',π',π€',π£') >β©Cβ©Fβ©.β©cβ©oβ©eβ©q E' : βββ§2β©C β¦β¦β©CβΞ±'β β'"
unfolding assms by (rule is_cat_coequalizer_axioms)
mk_ide rf is_cat_coequalizer_def[unfolded is_cat_coequalizer_axioms_def]
|intro is_cat_coequalizerI|
|dest is_cat_coequalizerD[dest]|
|elim is_cat_coequalizerE[elim]|
lemmas [cat_lim_cs_intros] = is_cat_coequalizerD(1)
textβΉElementary properties.βΊ
sublocale is_cat_equalizer β cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£ β
by (intro cf_parallelI cat_parallelI)
(simp_all add: cat_parallel_cs_intros cat_lim_cs_intros cat_cs_intros)
sublocale is_cat_coequalizer β cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€ β
by (intro cf_parallelI cat_parallelI)
(
simp_all add:
cat_parallel_cs_intros cat_lim_cs_intros cat_cs_intros
cat_PL_ineq[symmetric]
)
textβΉDuality.βΊ
lemma (in is_cat_equalizer) is_cat_coequalizer_op:
"op_ntcf Ξ΅ : (π,π,π€,π£) >β©Cβ©Fβ©.β©cβ©oβ©eβ©q E : βββ§2β©C β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_coequalizerI)
(cs_concl cs_simp: cat_op_simps cs_intro: cat_op_intros cat_lim_cs_intros)+
lemma (in is_cat_equalizer) is_cat_coequalizer_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ξ΅ : (π,π,π€,π£) >β©Cβ©Fβ©.β©cβ©oβ©eβ©q E : βββ§2β©C β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_coequalizer_op)
lemmas [cat_op_intros] = is_cat_equalizer.is_cat_coequalizer_op'
lemma (in is_cat_coequalizer) is_cat_equalizer_op:
"op_ntcf Ξ΅ : E <β©Cβ©Fβ©.β©eβ©q (π,π,π€,π£) : βββ§2β©C β¦β¦β©CβΞ±β op_cat β"
by (intro is_cat_equalizerI)
(
cs_concl
cs_simp: cat_op_simps
cs_intro: cat_cs_intros cat_op_intros cat_lim_cs_intros
)+
lemma (in is_cat_coequalizer) is_cat_equalizer_op'[cat_op_intros]:
assumes "β' = op_cat β"
shows "op_ntcf Ξ΅ : E <β©Cβ©Fβ©.β©eβ©q (π,π,π€,π£) : βββ§2β©C β¦β¦β©CβΞ±β β'"
unfolding assms by (rule is_cat_equalizer_op)
lemmas [cat_op_intros] = is_cat_coequalizer.is_cat_equalizer_op'
textβΉElementary properties.βΊ
lemma cf_parallel_if_is_cat_cone:
assumes "Ξ΅ :
E <β©Cβ©Fβ©.β©cβ©oβ©nβ©e βββββ β πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£ : βββ©C πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L β¦β¦β©CβΞ±β β"
and "π€ : π β¦βββ π"
and "π£ : π β¦βββ π"
shows "cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£ β"
proof-
let ?II = βΉβββ©C πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©LβΊ and ?II_II = βΉβββββ β πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£βΊ
interpret is_cat_cone Ξ± E ?II β ?II_II Ξ΅ by (rule assms(1))
show ?thesis
by (intro cf_parallelI cat_parallelI)
(
simp_all add:
assms cat_parallel_cs_intros cat_lim_cs_intros cat_cs_intros
)
qed
lemma cf_parallel_if_is_cat_cocone:
assumes "Ξ΅' :
βββββ β πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€ >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e E' : βββ©C πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L β¦β¦β©CβΞ±β β"
and "π€ : π β¦βββ π"
and "π£ : π β¦βββ π"
shows "cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€ β"
proof-
let ?II = βΉβββ©C πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©LβΊ and ?II_II = βΉβββββ β πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€βΊ
interpret is_cat_cocone Ξ± E' ?II β ?II_II Ξ΅' by (rule assms(1))
show ?thesis
by (intro cf_parallelI cat_parallelI)
(
simp_all add:
assms
cat_parallel_cs_intros
cat_lim_cs_intros
cat_cs_intros
cat_PL_ineq[symmetric]
)
qed
lemma (in category) cat_cf_parallel_cat_equalizer:
assumes "π€ : π β¦βββ π" and "π£ : π β¦βββ π"
shows "cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£ β"
using assms
by (intro cf_parallelI cat_parallelI)
(auto simp: cat_parallel_cs_intros cat_cs_intros)
lemma (in category) cat_cf_parallel_cat_coequalizer:
assumes "π€ : π β¦βββ π" and "π£ : π β¦βββ π"
shows "cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€ β"
using assms
by (intro cf_parallelI cat_parallelI)
(simp_all add: cat_parallel_cs_intros cat_cs_intros cat_PL_ineq[symmetric])
lemma cat_cone_cf_par_eps_NTMap_app:
assumes "Ξ΅ :
E <β©Cβ©Fβ©.β©cβ©oβ©nβ©e βββββ β πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£ : βββ©C πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L β¦β¦β©CβΞ±β β"
and "π€ : π β¦βββ π"
and "π£ : π β¦βββ π"
shows
"Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = π€ ββ©Aβββ Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦"
"Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = π£ ββ©Aβββ Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦"
proof-
let ?II = βΉβββ©C πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©LβΊ and ?II_II = βΉβββββ β πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£βΊ
interpret Ξ΅: is_cat_cone Ξ± E ?II β ?II_II Ξ΅ by (rule assms(1))
from assms(2,3) have π: "π ββ©β ββ¦Objβ¦" and π: "π ββ©β ββ¦Objβ¦" by auto
interpret par: cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©L π π π€ π£ β
by (intro cf_parallel_if_is_cat_cone, rule assms) (auto intro: assms π π)
have π€β©Pβ©L: "π€β©Pβ©L : πβ©Pβ©L β¦ββββ©C πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©Lβ πβ©Pβ©L"
and π£β©Pβ©L: "π£β©Pβ©L : πβ©Pβ©L β¦ββββ©C πβ©Pβ©L πβ©Pβ©L π€β©Pβ©L π£β©Pβ©Lβ πβ©Pβ©L"
by
(
simp_all add:
par.the_cat_parallel_is_arr_πππ€ par.the_cat_parallel_is_arr_πππ£
)
from Ξ΅.ntcf_Comp_commute[OF π€β©Pβ©L] show "Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = π€ ββ©Aβββ Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦"
by
(
cs_prems
cs_simp: cat_parallel_cs_simps cat_cs_simps
cs_intro: cat_cs_intros cat_parallel_cs_intros
)
from Ξ΅.ntcf_Comp_commute[OF π£β©Pβ©L] show "Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = π£ ββ©Aβββ Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦"
by
(
cs_prems
cs_simp: cat_parallel_cs_simps cat_cs_simps
cs_intro: cat_cs_intros cat_parallel_cs_intros
)
qed
lemma cat_cocone_cf_par_eps_NTMap_app:
assumes "Ξ΅ :
βββββ β πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€ >β©Cβ©Fβ©.β©cβ©oβ©cβ©oβ©nβ©e E : βββ©C πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L β¦β¦β©CβΞ±β β"
and "π€ : π β¦βββ π"
and "π£ : π β¦βββ π"
shows
"Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ ββ©Aβββ π€"
"Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ ββ©Aβββ π£"
proof-
let ?II = βΉβββ©C πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©LβΊ and ?II_II = βΉβββββ β πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€βΊ
interpret Ξ΅: is_cat_cocone Ξ± E ?II β ?II_II Ξ΅ by (rule assms(1))
from assms(2,3) have π: "π ββ©β ββ¦Objβ¦" and π: "π ββ©β ββ¦Objβ¦" by auto
interpret par: cf_parallel Ξ± πβ©Pβ©L πβ©Pβ©L π£β©Pβ©L π€β©Pβ©L π π π£ π€ β
by (intro cf_parallel_if_is_cat_cocone, rule assms) (auto intro: assms π π)
note Ξ΅_NTMap_app =
cat_cone_cf_par_eps_NTMap_app[
OF Ξ΅.is_cat_cone_op[unfolded cat_op_simps],
unfolded cat_op_simps,
OF assms(2,3)
]
from Ξ΅_NTMap_app show Ξ΅_NTMap_app:
"Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ ββ©Aβββ π€"
"Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ = Ξ΅β¦NTMapβ¦β¦πβ©Pβ©Lβ¦ ββ©Aβββ π£"
by
(
cs_concl