Last active
March 23, 2023 11:55
-
-
Save myuon/d75edfbb5ef11fbd1075 to your computer and use it in GitHub Desktop.
Yoneda Lemma
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
definition (in Category) Iso where | |
"Iso f g β‘ (f β g β id (dom g)) & (g β f β id (dom f))" | |
definition Iso_on_objects ("_ [ _ β _ ]" 40) where | |
"π [ A β B ] β‘ (βfβArr π. βgβArr π. f β Hom[π][A,B] & g β Hom[π][B,A] & Category.Iso π f g)" | |
record 'c setmap = | |
setdom :: "'c set" | |
setcod :: "'c set" | |
setfunction :: "'c β 'c" | |
definition setmap where | |
"setmap f β‘ (βx. xβsetdom f βΆ setfunction f x β setcod f)" | |
definition setmap_eq where | |
"setmap_eq f g β‘ setmap f & setmap g & setdom f = setdom g & setcod f = setcod g & (β x β setdom f. setfunction f x = setfunction g x)" | |
definition Set where | |
"Set β‘ β¦ | |
Obj = UNIV, | |
Arr = {f. setmap f}, | |
Dom = setdom, | |
Cod = setcod, | |
Id = (Ξ»X. β¦ setdom = X, setcod = X, setfunction = Ξ»x. x β¦), | |
comp = (Ξ»g f. β¦ setdom = setdom f, setcod = setcod g, setfunction = Ξ»x. setfunction g (setfunction f x) β¦), | |
eq = setmap_eq | |
β¦" | |
lemma Set_category: "Category Set" | |
proof (auto simp add: Category_def Set_def) | |
fix X :: "'a set" | |
show "setmap β¦setdom = X, setcod = X, setfunction = Ξ»x. xβ¦" by (simp add: setmap_def) | |
next | |
fix f g :: "'a setmap" | |
assume a: "setmap f" "setmap g" "setcod f = setdom g" | |
show "setmap β¦setdom = setdom f, setcod = setcod g, setfunction = Ξ»x. setfunction g (setfunction f x)β¦" | |
apply (simp add: setmap_def) | |
using a(1) a(3) a(2) apply (auto simp add: setmap_def) | |
done | |
next | |
show "equiv (Collect setmap) {(x, y). setmap_eq x y}" | |
apply (rule equivI) | |
apply (rule refl_onI, auto simp add: setmap_eq_def) | |
apply (rule symI, auto) | |
apply (simp add: transp_trans [symmetric], rule transpI, auto) | |
done | |
next | |
fix f :: "'a setmap" | |
assume a: "setmap f" | |
thus "setmap_eq β¦setdom = setdom f, setcod = setcod f, setfunction = setfunction fβ¦ f" | |
by (simp add: setmap_eq_def setmap_def) | |
next | |
fix f g h :: "'a setmap" | |
assume a: "setmap f" "setmap g" "setmap h" "setcod f = setdom g" "setcod g = setdom h" | |
show "setmap_eq | |
β¦setdom = setdom f, setcod = setcod h, setfunction = Ξ»x. setfunction h (setfunction g (setfunction f x))β¦ | |
β¦setdom = setdom f, setcod = setcod h, setfunction = Ξ»x. setfunction h (setfunction g (setfunction f x))β¦" | |
apply (simp add: setmap_eq_def setmap_def) | |
using a apply (simp add: setmap_def) | |
done | |
next | |
fix f g h i :: "'a setmap" | |
assume a: "setmap f" "setmap g" "setmap h" "setmap i" "setmap_eq f g" "setmap_eq h i" "setcod h = setdom f" | |
show "setmap_eq | |
β¦setdom = setdom h, setcod = setcod f, setfunction = Ξ»x. setfunction f (setfunction h x)β¦ | |
β¦setdom = setdom i, setcod = setcod g, setfunction = Ξ»x. setfunction g (setfunction i x)β¦" | |
proof (auto simp add: setmap_eq_def setmap_def) | |
fix x | |
{ | |
assume "x β setdom h" | |
hence "setfunction h x β setcod h" | |
using a(3) by (simp add: setmap_def) | |
thus "setfunction f (setfunction h x) β setcod f" | |
using a(1) by (simp add: a(7) setmap_def) | |
} | |
{ | |
assume "x β setdom i" | |
hence "setfunction i x β setdom g" | |
using a by (simp add: setmap_def setmap_eq_def) | |
thus "setfunction g (setfunction i x) β setcod g" | |
using a by (simp add: setmap_def setmap_eq_def) | |
} | |
{ | |
assume "x β setdom h" thus "x β setdom i" | |
using a by (simp add: setmap_def setmap_eq_def) | |
} | |
{ | |
assume "x β setdom i" thus "x β setdom h" | |
using a by (simp add: setmap_def setmap_eq_def) | |
} | |
{ | |
assume "x β setcod f" thus "x β setcod g" | |
using a by (simp add: setmap_def setmap_eq_def) | |
} | |
{ | |
assume "x β setcod g" thus "x β setcod f" | |
using a by (simp add: setmap_def setmap_eq_def) | |
} | |
{ | |
assume "x β setdom h" thus "setfunction f (setfunction h x) = setfunction g (setfunction i x)" | |
using a by (simp add: setmap_def setmap_eq_def) | |
} | |
qed | |
qed | |
record ('o,'a,'c,'o2,'a2,'d) Functor = | |
domCat :: "('o,'a,'c) Category_scheme" | |
codCat :: "('o2,'a2,'d) Category_scheme" | |
fobj :: "'o β 'o2" | |
fmap :: "'a β 'a2" | |
locale Functor = | |
fixes F :: "('o,'a,'c,'o2,'a2,'d,'f) Functor_scheme" (structure) | |
assumes dom_category: "Category (domCat F)" | |
and cod_category: "Category (codCat F)" | |
and obj_mapping: "X β Obj (domCat F) βΉ fobj F X β Obj (codCat F)" | |
and arr_mapping: "f β Hom[domCat F][A,B] βΉ fmap F f β Hom[codCat F][fobj F A,fobj F B]" | |
and preserve_id: "X β Obj (domCat F) βΉ fmap F (Id (domCat F) X) β[codCat F] Id (codCat F) (fobj F X)" | |
and preserve_comp: | |
"β¦ f β Arr (domCat F); g β Arr (domCat F); Cod (domCat F) f = Dom (domCat F) g β§ | |
βΉ fmap F (g β[domCat F] f) β[codCat F] fmap F g β[codCat F] fmap F f" | |
abbreviation Functor_type ("Functor' _ : _ βΆ _" [81] 90) where | |
"Functor' F : π βΆ π β‘ Functor F & domCat F = π & codCat F = π" | |
lemma FunctorE: "Functor' F : π βΆ π βΉ | |
(Category π βΉ | |
Category π βΉ | |
(X β Obj π βΉ fobj F X β Obj π) βΉ | |
(f β Hom[π][A,B] βΉ fmap F f β Hom[π][fobj F A,fobj F B]) βΉ thesis) βΉ thesis" | |
by (auto simp add: Functor_def) | |
record ('o,'a,'c,'o2,'a2,'d,'f,'f2) Nat = | |
domFunctor :: "('o,'a,'c,'o2,'a2,'d) Functor" | |
codFunctor :: "('o,'a,'c,'o2,'a2,'d) Functor" | |
component :: "'o β 'a2" | |
locale Nat = | |
fixes Ξ· :: "('o,'a,'c,'o2,'a2,'d,'f,'f2,'n) Nat_scheme" | |
assumes same_dom: "domCat (domFunctor Ξ·) = domCat (codFunctor Ξ·)" | |
and same_cod: "codCat (domFunctor Ξ·) = codCat (codFunctor Ξ·)" | |
and dom_functor: "Functor' (domFunctor Ξ·) : domCat (domFunctor Ξ·) βΆ codCat (domFunctor Ξ·)" | |
and cod_functor: "Functor' (codFunctor Ξ·) : domCat (codFunctor Ξ·) βΆ codCat (codFunctor Ξ·)" | |
and component_mapping: "X β Obj (domCat (domFunctor Ξ·)) | |
βΉ component Ξ· X β Hom[codCat (domFunctor Ξ·)][fobj (domFunctor Ξ·) X, fobj (codFunctor Ξ·) X]" | |
and naturality: "β¦ f β Hom[domCat (domFunctor Ξ·)][A,B]; A β Obj (domCat (domFunctor Ξ·)); B β Obj (domCat (domFunctor Ξ·)) β§ | |
βΉ (component Ξ· B β[codCat (domFunctor Ξ·)] fmap (domFunctor Ξ·) f) β[codCat (domFunctor Ξ·)] | |
(fmap (codFunctor Ξ·) f β[codCat (domFunctor Ξ·)] component Ξ· A)" | |
abbreviation Nat_type ("Nat' _ : _ βΆ _" [81] 90) where | |
"Nat' Ξ· : F βΆ G β‘ Nat Ξ· & Nat.domFunctor Ξ· = F & Nat.codFunctor Ξ· = G" | |
lemma NatE: "Nat' Ξ· : F βΆ G βΉ | |
(Functor' F : domCat F βΆ codCat F βΉ | |
Functor' G : domCat G βΆ codCat G βΉ | |
domCat F = domCat G βΉ codCat F = codCat G βΉ | |
(X β Obj (domCat F) βΉ component Ξ· X β Hom[codCat F][fobj F X,fobj G X]) βΉ | |
(f β Hom[domCat F][A,B] βΉ A β Obj (domCat F) βΉ B β Obj (domCat F) βΉ (component Ξ· B β[codCat F] fmap F f) β[codCat F] (fmap G f β[codCat F] component Ξ· A)) βΉ | |
thesis) βΉ thesis" | |
by (auto simp add: Nat_def) | |
lemma NatE_naturality: | |
"β¦ Nat' Ξ· : F βΆ G; f β Hom[domCat F][A,B]; A β Obj (domCat F); B β Obj (domCat F) β§ βΉ (component Ξ· B β[codCat F] fmap F f) β[codCat F] (fmap G f β[codCat F] component Ξ· A)" | |
by (rule NatE, auto) | |
lemma NatI: | |
assumes "Functor' F : π βΆ π" "Functor' G : π βΆ π" "domFunctor Ξ· = F" "codFunctor Ξ· = G" | |
and "βX. X β Obj π βΉ component Ξ· X β Hom[π][fobj F X,fobj G X]" | |
and "βf A B. β¦ f β Hom[π][A,B]; A β Obj π; B β Obj π β§ | |
βΉ ((component Ξ· B β[π] fmap F f) β[π] fmap G f β[π] component Ξ· A)" | |
shows "Nat' Ξ· : F βΆ G" | |
by (rule, auto simp add: Nat_def assms) | |
definition idNat where | |
"idNat F β‘ β¦ domFunctor = F, codFunctor = F, component = Ξ»X. Id (codCat F) (fobj F X) β¦" | |
lemma idNat_is_Nat: | |
assumes "Functor' F : π βΆ π" | |
shows "Nat' (idNat F) : F βΆ F" | |
proof (simp add: Nat_def idNat_def, auto simp add: assms) | |
have D_cat: "Category π" by (rule FunctorE [OF assms], simp) | |
{ | |
fix X | |
assume "X β Obj π" | |
then have FX_in: "fobj F X β Obj π" | |
by (metis assms Functor.obj_mapping) | |
show "idβπβ fobj F X β Hom[π][fobj F X,fobj F X]" | |
apply (rule CategoryE [OF D_cat]) | |
using FX_in by auto | |
} | |
{ | |
fix f A B | |
assume "f β Hom[π][A,B]" | |
then have Ff_in: "fmap F f β Hom[π][fobj F A, fobj F B]" | |
by (metis assms Functor.arr_mapping) | |
show "((idβπβ fobj F B) β[π] fmap F f) β[π] (fmap F f β[π] (idβπβ fobj F A))" (is "?L β[_] ?R") | |
proof- | |
have "?L β[π] fmap F f" | |
by (rule CategoryE_left_id, rule D_cat, rule Ff_in) | |
moreover have "fmap F f β[π] ?R" | |
using CategoryE_right_id [OF D_cat Ff_in] | |
by (rule Category.eq_sym [OF D_cat]) | |
ultimately | |
show ?thesis by (rule Category.eq_trans [OF D_cat]) | |
qed | |
} | |
qed | |
definition compNat ("_ β[Nat] _") where | |
"compNat Ξ· Ξ΅ β‘ β¦ | |
domFunctor = Nat.domFunctor Ξ΅, codFunctor = Nat.codFunctor Ξ·, | |
component = Ξ»X. component Ξ· X β[codCat (Nat.domFunctor Ξ·)] component Ξ΅ X | |
β¦" | |
lemma compNat_nat: | |
assumes Ξ·_nat: "Nat' Ξ· : G βΆ H" | |
and Ξ΅_nat: "Nat' Ξ΅ : F βΆ G" | |
shows "Nat' (Ξ· β[Nat] Ξ΅) : F βΆ H" | |
apply (rule NatI) | |
apply (rule NatE [OF Ξ΅_nat], simp) | |
apply (rule NatE [OF Ξ·_nat], simp) | |
apply (simp add: compNat_def, simp add: Ξ΅_nat) | |
apply (simp add: compNat_def, simp add: Ξ·_nat) | |
apply (simp add: compNat_def, simp add: assms) | |
proof- | |
have codG_cat: "Category (codCat G)" | |
apply (rule NatE [OF Ξ·_nat]) | |
apply (metis FunctorE) | |
done | |
have codH_cat: "Category (codCat H)" | |
apply (rule NatE [OF Ξ·_nat]) | |
apply (metis FunctorE) | |
done | |
have F_functor: "Functor' F : domCat F βΆ codCat F" | |
by (rule NatE [OF Ξ΅_nat], simp) | |
have G_functor: "Functor' G : domCat F βΆ codCat F" | |
by (rule NatE [OF Ξ΅_nat], simp) | |
have H_functor: "Functor' H : domCat G βΆ codCat G" | |
by (rule NatE [OF Ξ·_nat], simp) | |
have codGH: "codCat G = codCat H" | |
by (rule NatE [OF Ξ·_nat], auto) | |
{ | |
fix X | |
assume X_in: "X β Obj (domCat G)" | |
have 1: "component Ξ· X β Hom[codCat H][fobj G X,fobj H X]" | |
apply (rule NatE [OF Ξ·_nat]) | |
using X_in by auto | |
have 2: "component Ξ΅ X β Hom[codCat G][fobj F X,fobj G X]" | |
apply (rule NatE [OF Ξ΅_nat]) | |
using X_in by auto | |
show "(component Ξ· X β[codCat G] component Ξ΅ X) β Hom[codCat G][fobj F X,fobj H X]" | |
apply (rule NatE [OF Ξ·_nat], simp) | |
by (metis CategoryE codG_cat 1 2) | |
} | |
{ | |
fix f A B | |
assume f_in: "f β Hom[domCat G][A,B]" | |
and A_in: "A β Obj (domCat G)" | |
and B_in: "B β Obj (domCat G)" | |
show "(component (Ξ· β[Nat] Ξ΅) B β[codCat G] fmap F f) β[codCat G] (fmap H f β[codCat G] component (Ξ· β[Nat] Ξ΅) A)" (is "?L β[_] ?R") | |
proof- | |
have 1: "component Ξ· B β Hom[codCat G][fobj G B, fobj H B]" | |
apply (rule NatE [OF Ξ·_nat]) using B_in by auto | |
have 11: "component Ξ· A β Hom[codCat G][fobj G A, fobj H A]" | |
apply (rule NatE [OF Ξ·_nat]) using A_in by auto | |
have 2: "component Ξ΅ B β Hom[codCat G][fobj F B, fobj G B]" | |
apply (rule NatE [OF Ξ΅_nat]) using B_in by auto | |
have 21: "component Ξ΅ A β Hom[codCat G][fobj F A, fobj G A]" | |
apply (rule NatE [OF Ξ΅_nat]) using A_in by auto | |
have 3: "fmap F f β Hom[codCat G][fobj F A, fobj F B]" | |
apply (rule NatE [OF Ξ΅_nat], simp) | |
apply (rule FunctorE [OF F_functor]) | |
using f_in by auto | |
have 4: "fmap G f β Hom[codCat G][fobj G A, fobj G B]" | |
apply (rule NatE [OF Ξ΅_nat], simp) | |
apply (rule FunctorE [OF G_functor]) | |
using f_in by auto | |
have 41: "fmap G f β Hom[codCat H][fobj G A, fobj G B]" | |
apply (rule NatE [OF Ξ·_nat]) | |
using 4 by auto | |
have 5: "fmap H f β Hom[codCat H][fobj H A, fobj H B]" | |
apply (rule NatE [OF Ξ·_nat], simp) | |
apply (rule FunctorE [OF H_functor]) | |
using f_in by auto | |
have "?L β[codCat G] (component Ξ· B β[codCat G] component Ξ΅ B) β[codCat G] fmap F f" | |
apply (simp add: compNat_def Ξ·_nat) | |
apply (rule CategoryE_refl [OF codG_cat CategoryE_comp_exist [OF codG_cat 3 CategoryE_comp_exist [OF codG_cat 2 1]]]) | |
done | |
moreover have "β¦ β[codCat G] component Ξ· B β[codCat G] (component Ξ΅ B β[codCat G] fmap F f)" | |
apply (rule CategoryE [OF codG_cat]) | |
using 1 2 3 by auto | |
ultimately | |
have a: "?L β[codCat G] component Ξ· B β[codCat G] (component Ξ΅ B β[codCat G] fmap F f)" | |
by (rule Category.eq_trans [OF codG_cat]) | |
have "β¦ β[codCat G] component Ξ· B β[codCat G] (fmap G f β[codCat G] component Ξ΅ A)" | |
apply (rule CategoryE_eq_comp [OF codG_cat 1 1]) | |
apply (rule CategoryE_comp_exist [OF codG_cat 3 2]) | |
apply (rule CategoryE_comp_exist [OF codG_cat 21 4]) | |
apply (rule CategoryE_refl [OF codG_cat 1]) | |
defer | |
using CategoryE_comp_exist [OF codG_cat 3 2] 1 apply (simp add: hom_def) | |
proof- | |
have 1: "codCat F = codCat G" by (rule NatE [OF Ξ΅_nat], auto) | |
have 2: "domCat F = domCat G" by (rule NatE [OF Ξ΅_nat], auto) | |
show "(component Ξ΅ B β[codCat G] fmap F f) β[codCat G] (fmap G f β[codCat G] component Ξ΅ A)" | |
apply (simp add: 1 [symmetric]) | |
apply (rule NatE_naturality [OF Ξ΅_nat]) | |
using f_in A_in B_in by (auto simp add: 2) | |
qed | |
moreover have "β¦ β[codCat G] (component Ξ· B β[codCat G] fmap G f) β[codCat G] component Ξ΅ A" | |
by (metis "1" "21" "4" Category.eq_sym CategoryE_assoc codG_cat) | |
ultimately | |
have b: "(component Ξ· B β[codCat G] (component Ξ΅ B β[codCat G] fmap F f)) β[codCat G] (component Ξ· B β[codCat G] fmap G f) β[codCat G] component Ξ΅ A" | |
by (rule Category.eq_trans [OF codG_cat]) | |
have "β¦ β[codCat G] (fmap H f β[codCat G] component Ξ· A) β[codCat G] component Ξ΅ A" | |
apply (rule CategoryE_eq_comp [OF codG_cat]) | |
apply (rule CategoryE_comp_exist [OF codG_cat 4 1]) | |
apply (rule CategoryE_comp_exist [OF codG_cat 11]) using 5 apply (simp add: codGH) | |
apply (rule 21, rule 21) | |
apply (rule NatE_naturality [OF Ξ·_nat f_in A_in B_in]) | |
apply (rule CategoryE_refl [OF codG_cat 21]) | |
using CategoryE_comp_exist [OF codG_cat 4 1] 21 apply (simp add: hom_def) | |
done | |
moreover have "β¦ β[codCat G] fmap H f β[codCat G] (component Ξ· A β[codCat G] component Ξ΅ A)" | |
using CategoryE_assoc codG_cat by (metis "11" "21" "5" H_functor) | |
ultimately | |
have c: "((component Ξ· B β[codCat G] fmap G f) β[codCat G] component Ξ΅ A) β[codCat G] fmap H f β[codCat G] (component Ξ· A β[codCat G] component Ξ΅ A)" | |
by (rule Category.eq_trans [OF codG_cat]) | |
have d: "β¦ β[codCat G] ?R" | |
apply (simp add: compNat_def Ξ·_nat) | |
apply (rule CategoryE_refl [OF codG_cat CategoryE_comp_exist [OF codG_cat CategoryE_comp_exist [OF codG_cat 21 11]]]) | |
using 5 by (simp add: codGH) | |
show ?thesis | |
proof- | |
have 1: "?L β[codCat G] (component Ξ· B β[codCat G] fmap G f) β[codCat G] component Ξ΅ A" by (rule Category.eq_trans [OF codG_cat a b]) | |
have 2: "((component Ξ· B β[codCat G] fmap G f) β[codCat G] component Ξ΅ A) β[codCat G] ?R" by (rule Category.eq_trans [OF codG_cat c d]) | |
show ?thesis by (rule Category.eq_trans [OF codG_cat 1 2]) | |
qed | |
qed | |
} | |
qed | |
definition nat_eq where | |
"nat_eq Ξ· Ξ΅ β‘ (βX β Obj (domCat (domFunctor Ξ·)). component Ξ· X = component Ξ΅ X)" | |
definition FunCat where | |
"FunCat π π = β¦ | |
Obj = {F. Functor' F : π βΆ π}, | |
Arr = {Ξ·. βFβ{F. Functor' F : π βΆ π}. βGβ{F. Functor' F : π βΆ π}. Nat' Ξ· : F βΆ G}, | |
Dom = domFunctor, | |
Cod = codFunctor, | |
Id = idNat, | |
comp = compNat, | |
eq = nat_eq | |
β¦" | |
lemma | |
assumes "Category π" "Category π" | |
shows "Category (FunCat π π)" | |
apply (unfold Category_def) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
theory Category | |
imports Main | |
begin | |
no_notation Fun.comp (infixl "β" 55) | |
record ('o,'a) Category = | |
Obj :: "'o set" | |
Arr :: "'a set" | |
Dom :: "'a β 'o" ("domΔ± _" [80] 90) | |
Cod :: "'a β 'o" ("codΔ± _" [80] 90) | |
Id :: "'o β 'a" ("idΔ± _" [80] 90) | |
comp :: "'a β 'a β 'a" (infixr "βΔ±" 60) | |
locale Category = | |
fixes π :: "('o,'a,'c) Category_scheme" (structure) | |
assumes dom_obj [intro]: "f β Arr π βΉ dom f β Obj π" | |
and cod_obj [intro]: "f β Arr π βΉ cod f β Obj π" | |
and id_exist [intro]: "X β Obj π βΉ id X β Arr π & dom (id X) = X & cod (id X) = X" | |
and comp_exist [intro]: "β¦ f β Arr π; g β Arr π; cod f = dom g β§ | |
βΉ g β f β Arr π & dom (g β f) = dom f & cod (g β f) = cod g" | |
and left_id [simp]: "f β Arr π βΉ id (cod f) β f = f" | |
and right_id [simp]: "f β Arr π βΉ f β id (dom f) = f" | |
and assoc [iff]: "β¦ f β Arr π; g β Arr π; h β Arr π; cod f = dom g; cod g = dom h β§ | |
βΉ (h β g) β f = h β (g β f)" | |
begin | |
abbreviation Hom ("_ β _" [70] 100) where | |
"Hom A B β‘ {f β Arr π. dom f = A & cod f = B}" | |
lemma arr_type [simp]: | |
assumes "f β Arr π" shows "f : (dom f) β (cod f)" | |
by (metis (mono_tags, lifting) assms mem_Collect_eq) | |
lemma id_type [simp]: | |
assumes "X β Obj π" shows "id X : X β X" | |
using assms id_exist by auto | |
lemma comp_hom [simp]: | |
assumes "f : A β B" and "g : B β C" | |
shows "g β f : A β C" | |
using assms comp_exist by auto | |
lemma assoc_hom [simp]: | |
assumes "f : A β B" and "g : B β C" and "h : C β D" | |
shows "(h β g) β f = h β (g β f)" | |
by (metis (mono_tags, lifting) assms assoc mem_Collect_eq) | |
end | |
abbreviation comp_category ("_ β[_] _" [60] 100) where | |
"f β[π] g β‘ comp π f g" | |
abbreviation hom_category ("_ -[_]β _" [70] 100) where | |
"a -[π]β b β‘ Category.Hom π a b" | |
definition opposite ("_ {^op}" 100) where | |
"opposite π β‘ β¦ | |
Obj = Obj π, | |
Arr = Arr π, | |
Dom = Cod π, | |
Cod = Dom π, | |
Id = Id π, | |
comp = (Ξ»f g. comp π g f) | |
β¦" | |
lemma opposite_category: | |
assumes "Category π" | |
shows "Category (π {^op})" | |
unfolding opposite_def Category_def | |
by (auto simp add: assms Category.cod_obj Category.dom_obj | |
Category.id_exist Category.comp_exist | |
Category.right_id Category.left_id Category.assoc) | |
definition (in Category) Iso where | |
"Iso f g β‘ f β g = id (dom g) & g β f = id (dom f)" | |
definition (in Category) Iso_on_objects ("IsoObj _ _") where | |
"IsoObj A B β‘ βfβArr π. βgβArr π. (f : A β B) & (g : B β A) & Iso f g" | |
definition Iso_on_objects ("_ [ _ β _ ]" 40) where | |
"π [ A β B ] β‘ (βfβArr π. βgβArr π. (f : A -[π]β B) & (g : B -[π]β A) & Category.Iso π f g)" | |
record 'c setmap = | |
setdom :: "'c set" | |
setcod :: "'c set" | |
setfunction :: "'c β 'c" | |
definition setmap where | |
"setmap f β‘ (βx. xβsetdom f βΆ setfunction f x β setcod f)" | |
axiomatization where | |
setmap_eq : "β¦ setmap f; setmap g; setdom f = setdom g; setcod f = setcod g; βxβsetdom f. setfunction f x = setfunction g x β§ | |
βΉ f = g" | |
definition Set where | |
"Set β‘ β¦ | |
Obj = UNIV, | |
Arr = {f. setmap f}, | |
Dom = setdom, | |
Cod = setcod, | |
Id = (Ξ»X. β¦ setdom = X, setcod = X, setfunction = Ξ»x. x β¦), | |
comp = (Ξ»g f. β¦ setdom = setdom f, setcod = setcod g, setfunction = Ξ»x. setfunction g (setfunction f x) β¦) | |
β¦" | |
lemma Set_category: "Category Set" | |
unfolding Set_def Category_def | |
apply (simp add: setmap_eq) | |
by (auto simp add: setmap_def) | |
record ('o,'a,'c,'o2,'a2,'d) Functor = | |
domCat :: "('o,'a,'c) Category_scheme" | |
codCat :: "('o2,'a2,'d) Category_scheme" | |
fobj :: "'o β 'o2" | |
fmap :: "'a β 'a2" | |
locale Functor = | |
fixes F :: "('o,'a,'c,'o2,'a2,'d,'f) Functor_scheme" (structure) | |
assumes fdom_category [intro]: "Category (domCat F)" | |
and fcod_category [intro]: "Category (codCat F)" | |
and fobj_mapping [intro]: "X β Obj (domCat F) βΉ fobj F X β Obj (codCat F)" | |
and fmap_mapping [intro]: "f β Arr (domCat F) βΉ fmap F f β Arr (codCat F) | |
& Dom (codCat F) (fmap F f) = fobj F (Dom (domCat F) f) | |
& Cod (codCat F) (fmap F f) = fobj F (Cod (domCat F) f)" | |
and preserve_id [simp]: "X β Obj (domCat F) βΉ fmap F (Id (domCat F) X) = Id (codCat F) (fobj F X)" | |
and covariant [simp]: | |
"β¦ f β Arr (domCat F); g β Arr (domCat F); Cod (domCat F) f = Dom (domCat F) g β§ | |
βΉ fmap F (g β[domCat F] f) = fmap F g β[codCat F] fmap F f" | |
begin | |
lemma fmap_mapping_hom: | |
assumes "f : a -[domCat F]β b" | |
shows "fmap F f : fobj F a -[codCat F]β fobj F b" | |
using fmap_mapping [of f] assms by auto | |
lemma fmap_type: | |
assumes "f β Arr (domCat F)" | |
shows "fmap F f : fobj F (Dom (domCat F) f) -[codCat F]β fobj F (Cod (domCat F) f)" | |
using Category.arr_type assms fmap_mapping by auto | |
end | |
abbreviation Functor_type ("Functor' _ : _ βΆ _" [81] 90) where | |
"Functor' F : π βΆ π β‘ Functor F & domCat F = π & codCat F = π" | |
record ('o,'a,'c,'o2,'a2,'d,'f,'f2) Nat = | |
domFunctor :: "('o,'a,'c,'o2,'a2,'d) Functor" | |
codFunctor :: "('o,'a,'c,'o2,'a2,'d) Functor" | |
component :: "'o β 'a2" | |
locale Nat = | |
fixes Ξ· :: "('o,'a,'c,'o2,'a2,'d,'f,'f2,'n) Nat_scheme" | |
assumes dom_functor [intro]: "Functor' (domFunctor Ξ·) : domCat (domFunctor Ξ·) βΆ codCat (domFunctor Ξ·)" | |
and cod_functor [intro]: "Functor' (codFunctor Ξ·) : domCat (codFunctor Ξ·) βΆ codCat (codFunctor Ξ·)" | |
and same_dom [intro]: "domCat (domFunctor Ξ·) = domCat (codFunctor Ξ·)" | |
and same_cod [intro]: "codCat (domFunctor Ξ·) = codCat (codFunctor Ξ·)" | |
and component_mapping [intro]: "X β Obj (domCat (domFunctor Ξ·)) | |
βΉ component Ξ· X : fobj (domFunctor Ξ·) X -[codCat (domFunctor Ξ·)]β fobj (codFunctor Ξ·) X" | |
and naturality [simp]: | |
"f β Arr (domCat (domFunctor Ξ·)) | |
βΉ (component Ξ· (Cod (domCat (domFunctor Ξ·)) f) β[codCat (domFunctor Ξ·)] fmap (domFunctor Ξ·) f) | |
= (fmap (codFunctor Ξ·) f β[codCat (domFunctor Ξ·)] component Ξ· (Dom (domCat (domFunctor Ξ·)) f))" | |
begin | |
lemma domFunctor_category [intro]: | |
assumes "Nat Ξ·" | |
shows "Category (domCat (domFunctor Ξ·)) & Category (codCat (domFunctor Ξ·))" | |
by (metis assms Nat.dom_functor Functor.fdom_category Functor.fcod_category) | |
lemma codFunctor_category [intro]: | |
assumes "Nat Ξ·" | |
shows "Category (domCat (codFunctor Ξ·)) & Category (codCat (codFunctor Ξ·))" | |
by (metis assms Nat.cod_functor Functor.fdom_category Functor.fcod_category) | |
lemma naturality_hom [intro]: | |
assumes "f β Arr (domCat (domFunctor Ξ·))" | |
shows "β¦ a β Obj (domCat (domFunctor Ξ·)); b β Obj (domCat (domFunctor Ξ·)); f : a -[domCat (domFunctor Ξ·)]β b β§ | |
βΉ (component Ξ· b β[codCat (domFunctor Ξ·)] fmap (domFunctor Ξ·) f) | |
= (fmap (codFunctor Ξ·) f β[codCat (domFunctor Ξ·)] component Ξ· a)" | |
by auto | |
end | |
abbreviation Nat_type ("Nat' _ : _ βΆ _" [81] 90) where | |
"Nat' Ξ· : F βΆ G β‘ Nat Ξ· & Nat.domFunctor Ξ· = F & Nat.codFunctor Ξ· = G" | |
axiomatization where | |
nat_eq [iff]: "β¦ Functor' F: π βΆ π; Functor' G: π βΆ π; Nat' Ξ·: F βΆ G; Nat' Ξ΅: F βΆ G; (βXβObj π. component Ξ· X = component Ξ΅ X) β§ | |
βΉ Ξ· = Ξ΅" | |
definition idNat where | |
"idNat F β‘ β¦ domFunctor = F, codFunctor = F, component = Ξ»X. Id (codCat F) (fobj F X) β¦" | |
lemma idNat_nat: | |
assumes "Functor F" | |
shows "Nat' (idNat F) : F βΆ F" | |
unfolding idNat_def Nat_def apply (auto simp add: assms) | |
apply (metis Category.id_exist Functor.fcod_category Functor.fobj_mapping assms) | |
apply (metis Category.id_exist Functor.fcod_category Functor.fobj_mapping assms) | |
apply (metis Category.id_exist Functor.fcod_category Functor.fobj_mapping assms) | |
proof- | |
fix f | |
assume f_in: "f β Arr (domCat F)" | |
have codF_cat: "Category (codCat F)" using assms Functor.fcod_category by auto | |
have Ff_type: "fmap F f : fobj F (domβdomCat Fβ f) -[codCat F]β fobj F (codβdomCat Fβ f)" | |
using Functor.fmap_type [of F f] assms f_in by auto | |
show "((idβcodCat Fβ fobj F (codβdomCat Fβ f)) β[codCat F] fmap F f) = fmap F f β[codCat F] idβcodCat Fβ fobj F (domβdomCat Fβ f)" | |
proof- | |
have "((idβcodCat Fβ fobj F (codβdomCat Fβ f)) β[codCat F] fmap F f) = fmap F f" | |
using Category.left_id codF_cat Ff_type by (metis (mono_tags, lifting) mem_Collect_eq) | |
also have "β¦ = fmap F f β[codCat F] idβcodCat Fβ fobj F (domβdomCat Fβ f)" | |
using Category.right_id codF_cat Ff_type by (metis (mono_tags, lifting) mem_Collect_eq) | |
finally show ?thesis by auto | |
qed | |
qed | |
definition compNat ("Nat'[_ β _]") where | |
"compNat Ξ· Ξ΅ β‘ β¦ | |
domFunctor = Nat.domFunctor Ξ΅, codFunctor = Nat.codFunctor Ξ·, | |
component = Ξ»X. Category.comp (codCat (Nat.domFunctor Ξ·)) (component Ξ· X) (component Ξ΅ X) | |
β¦" | |
lemma compNat_nat: | |
assumes Ξ·_nat: "Nat' Ξ· : G βΆ H" | |
and Ξ΅_nat: "Nat' Ξ΅ : F βΆ G" | |
shows "Nat' (compNat Ξ· Ξ΅) : F βΆ H" | |
unfolding compNat_def | |
apply (auto simp add: Nat_def Ξ·_nat Ξ΅_nat) | |
using Nat.dom_functor Ξ΅_nat apply fastforce | |
using Nat.cod_functor Ξ·_nat apply fastforce | |
using Nat.same_dom [of Ξ·] Ξ·_nat Nat.same_dom [of Ξ΅] Ξ΅_nat apply fastforce | |
using Nat.same_cod [of Ξ·] Ξ·_nat Nat.same_cod [of Ξ΅] Ξ΅_nat apply fastforce | |
proof - | |
def π β‘ "domCat F" | |
def π β‘ "codCat F" | |
have F_functor: "Functor' F : π βΆ π" using Nat.dom_functor [of Ξ΅] by (auto simp add: Ξ΅_nat π_def π_def) | |
have G_functor: "Functor' G : π βΆ π" using Nat.same_dom [of Ξ΅] Nat.same_cod [of Ξ΅] Ξ΅_nat by (metis Nat.dom_functor π_def π_def Ξ·_nat) | |
have H_functor: "Functor' H : π βΆ π" using Nat.dom_functor [of Ξ·] by (metis G_functor Nat.cod_functor Nat.same_cod Nat.same_dom Ξ·_nat) | |
have C_cat: "Category π" by (metis Functor.fdom_category F_functor) | |
have D_cat: "Category π" by (metis Functor.fcod_category F_functor) | |
{ | |
fix X | |
assume X_in: "X β Obj (domCat F)" | |
have Ξ·Ξ΅X_type: "(component Ξ· X β[codCat G] component Ξ΅ X) : fobj F X -[codCat F]β fobj H X" | |
using X_in Nat.component_mapping [of Ξ·] Nat.component_mapping [of Ξ΅] | |
apply (auto simp add: Ξ·_nat Ξ΅_nat) | |
apply (auto simp add: G_functor F_functor) | |
by (auto simp add: D_cat Category.comp_exist) | |
show "(component Ξ· X β[codCat G] component Ξ΅ X) β Arr (codCat F)" using Ξ·Ξ΅X_type by auto | |
show "domβcodCat Fβ (component Ξ· X β[codCat G] component Ξ΅ X) = fobj F X" using Ξ·Ξ΅X_type by auto | |
show "codβcodCat Fβ (component Ξ· X β[codCat G] component Ξ΅ X) = fobj H X" using Ξ·Ξ΅X_type by auto | |
} | |
{ | |
fix f | |
assume f_in: "f β Arr (domCat F)" | |
show "((component Ξ· (codβdomCat Fβ f) β[codCat G] component Ξ΅ (codβdomCat Fβ f)) β[codCat F] fmap F f) = | |
(fmap H f β[codCat F] (component Ξ· (domβdomCat Fβ f) β[codCat G] component Ξ΅ (domβdomCat Fβ f)))" | |
proof (auto simp add: F_functor G_functor) | |
have 1: "component Ξ· (codβπβ f) : fobj G (codβπβ f) -[π]β fobj H (codβπβ f)" | |
using Nat.component_mapping [of Ξ·] Ξ·_nat f_in apply (simp add: F_functor G_functor) | |
using C_cat Category.cod_obj by fastforce | |
have 2: "component Ξ΅ (codβπβ f) : fobj F (codβπβ f) -[π]β fobj G (codβπβ f)" | |
using Nat.component_mapping [of Ξ΅] Ξ΅_nat f_in apply (simp add: F_functor G_functor) | |
using C_cat Category.cod_obj by fastforce | |
have 3: "fmap F f : fobj F (domβπβ f) -[π]β fobj F (codβπβ f)" | |
using Functor.fmap_type [of F f] f_in by (simp add: F_functor) | |
have 4: "component Ξ΅ (domβπβ f) : fobj F (domβπβ f) -[π]β fobj G (domβπβ f)" | |
using Nat.component_mapping [of Ξ΅] Ξ΅_nat f_in apply (simp add: F_functor G_functor) | |
using C_cat Category.dom_obj by fastforce | |
have 5: "fmap G f : fobj G (domβπβ f) -[π]β fobj G (codβπβ f)" | |
using Functor.fmap_type [of G f] f_in by (simp add: F_functor G_functor) | |
have 6: "component Ξ· (domβπβ f) : fobj G (domβπβ f) -[π]β fobj H (domβπβ f)" | |
using Nat.component_mapping [of Ξ·] Ξ·_nat f_in apply (simp add: F_functor G_functor) | |
using C_cat Category.dom_obj by fastforce | |
have 7: "fmap H f : fobj H (domβπβ f) -[π]β fobj H (codβπβ f)" | |
using Functor.fmap_type [of H f] f_in by (simp add: F_functor H_functor) | |
have "((component Ξ· (codβπβ f) β[π] component Ξ΅ (codβπβ f)) β[π] fmap F f) | |
= component Ξ· (codβπβ f) β[π] (component Ξ΅ (codβπβ f) β[π] fmap F f)" | |
using Category.assoc [OF D_cat] 1 2 3 by auto | |
also have "β¦ = component Ξ· (codβπβ f) β[π] (fmap G f β[π] component Ξ΅ (domβπβ f))" | |
using Nat.naturality [of Ξ΅ f] f_in by (simp add: Ξ΅_nat F_functor) | |
also have "β¦ = (component Ξ· (codβπβ f) β[π] fmap G f) β[π] component Ξ΅ (domβπβ f)" | |
using Category.assoc [OF D_cat] 1 4 5 by auto | |
also have "β¦ = (fmap H f β[π] component Ξ· (domβπβ f)) β[π] component Ξ΅ (domβπβ f)" | |
using Nat.naturality [of Ξ· f] f_in by (simp add: Ξ·_nat F_functor G_functor) | |
also have "β¦ = fmap H f β[π] (component Ξ· (domβπβ f) β[π] component Ξ΅ (domβπβ f))" | |
using Category.assoc [OF D_cat] 4 6 7 by auto | |
finally | |
show "((component Ξ· (codβπβ f) β[π] component Ξ΅ (codβπβ f)) β[π] fmap F f) = | |
fmap H f β[π] (component Ξ· (domβπβ f) β[π] component Ξ΅ (domβπβ f))" | |
by auto | |
qed | |
} | |
qed | |
definition FunCat where | |
"FunCat π π = β¦ | |
Obj = {F. Functor' F : π βΆ π}, | |
Arr = {Ξ·. βFβ{F. Functor' F : π βΆ π}. βGβ{F. Functor' F : π βΆ π}. Nat' Ξ· : F βΆ G}, | |
Dom = domFunctor, | |
Cod = codFunctor, | |
Id = idNat, | |
comp = compNat | |
β¦" | |
lemma FunCat_category: | |
assumes C_cat: "Category π" and D_cat: "Category π" | |
shows "Category (FunCat π π)" (is "Category ?FC") | |
proof | |
fix f | |
assume f_in: "f β Arr ?FC" | |
show "domβFunCat π πβ f β Obj (FunCat π π)" using f_in unfolding FunCat_def by auto | |
show "codβFunCat π πβ f β Obj (FunCat π π)" using f_in unfolding FunCat_def by auto | |
next | |
fix F | |
assume F_in: "F β Obj ?FC" | |
show "idβFunCat π πβ F β Arr (FunCat π π) β§ domβFunCat π πβ idβFunCat π πβ F = F β§ codβFunCat π πβ idβFunCat π πβ F = F" | |
using F_in unfolding FunCat_def by (auto simp add: idNat_nat [of F]) | |
next | |
fix f g | |
assume 0: "f β Arr ?FC" "g β Arr ?FC" "codβFunCat π πβ f = domβFunCat π πβ g" | |
then obtain F G H where | |
F_functor: "(Functor' F : π βΆ π)" and G_functor: "(Functor' G : π βΆ π)" and H_functor: "(Functor' H : π βΆ π)" and | |
f_nat: "(Nat' f : F βΆ G)" and g_nat: "(Nat' g : G βΆ H)" | |
unfolding FunCat_def by auto | |
show "((g β[?FC] f) β Arr ?FC) β§ (domβ?FCβ (g β[?FC] f) = domβ?FCβ f) β§ (codβ?FCβ (g β[?FC] f) = codβ?FCβ g)" | |
using compNat_nat [OF g_nat f_nat] unfolding compNat_def apply simp | |
unfolding FunCat_def apply simp | |
by (auto simp add: compNat_def f_nat g_nat F_functor G_functor H_functor) | |
next | |
fix f | |
assume f_in: "f β Arr ?FC" | |
hence f_nat: "βFβObj ?FC. βGβObj ?FC. Nat' f : F βΆ G" unfolding FunCat_def by auto | |
then obtain F G where | |
FG: "Functor' F : π βΆ π" "Functor' G : π βΆ π" "Nat' f : F βΆ G" | |
unfolding FunCat_def by auto | |
show "((idβ?FCβ (codβ?FCβ f)) β[?FC] f) = f" | |
unfolding FunCat_def apply auto | |
proof (rule_tac nat_eq [of F π π G] , auto simp add: FG) | |
show "Category.Nat Nat[idNat G β f]" using compNat_nat [of _ G G f F] FG idNat_nat [of G] by auto | |
show "domFunctor Nat[idNat G β f] = F" unfolding compNat_def by (auto simp add: FG) | |
show "codFunctor Nat[idNat G β f] = G" unfolding compNat_def idNat_def by auto | |
{ | |
fix X | |
assume X_in: "X β Obj π" | |
show "component Nat[idNat G β f] X = component f X" | |
unfolding compNat_def idNat_def | |
proof (auto simp add: FG) | |
have "component f X : fobj F X -[π]β fobj G X" using Nat.component_mapping [of f X] FG X_in by fastforce | |
thus "((idβπβ fobj G X) β[π] component f X) = component f X" using Category.left_id [OF D_cat] by fastforce | |
qed | |
} | |
qed | |
show "(f β[?FC] idβ?FCβ domβ?FCβ f) = f" | |
unfolding FunCat_def apply simp | |
proof (rule_tac nat_eq , auto simp add: FG) | |
show "Category.Nat Nat[f β idNat F]" using compNat_nat [of f F G _ F] idNat_nat FG by auto | |
show "domFunctor Nat[f β idNat F] = F" unfolding compNat_def idNat_def by auto | |
show "codFunctor Nat[f β idNat F] = G" unfolding compNat_def by (auto simp add: FG) | |
{ | |
fix X | |
assume X_in: "X β Obj π" | |
show "component Nat[f β idNat F] X = component f X" | |
unfolding compNat_def idNat_def | |
proof (auto simp add: FG) | |
have "component f X : fobj F X -[π]β fobj G X" using Nat.component_mapping [of f X] FG X_in by fastforce | |
thus "(component f X β[π] (idβπβ fobj F X)) = component f X" using Category.right_id [OF D_cat] by fastforce | |
qed | |
} | |
qed | |
next | |
fix f g h | |
assume "f β Arr ?FC" "g β Arr ?FC" "h β Arr ?FC" "codβFunCat π πβ f = domβFunCat π πβ g" "codβFunCat π πβ g = domβFunCat π πβ h" | |
then obtain F G H I where | |
FGHI: "Functor' F: π βΆ π" "Functor' G: π βΆ π" "Functor' H: π βΆ π" "Functor' I: π βΆ π" and | |
fgh_nat: "Nat' f : F βΆ G" "Nat' g : G βΆ H" "Nat' h : H βΆ I" | |
unfolding FunCat_def by auto | |
have 1: "Nat' ((h β[FunCat π π] g) β[FunCat π π] f) : F βΆ I" | |
unfolding FunCat_def by (auto simp add: compNat_nat fgh_nat) | |
have 2: "Nat' (h β[FunCat π π] (g β[FunCat π π] f)) : F βΆ I" | |
unfolding FunCat_def by (auto simp add: compNat_nat fgh_nat) | |
show "((h β[FunCat π π] g) β[FunCat π π] f) = h β[FunCat π π] (g β[FunCat π π] f)" | |
apply (rule_tac nat_eq [of F π π I]) | |
apply (auto simp add: FGHI(1) FGHI(4)) | |
apply (auto simp add: 1 2) | |
proof- | |
fix X | |
assume X_in: "X β Obj π" | |
show "component ((h β[FunCat π π] g) β[FunCat π π] f) X = component (h β[FunCat π π] (g β[FunCat π π] f)) X" | |
unfolding FunCat_def apply simp | |
unfolding compNat_def apply simp | |
proof (simp add: fgh_nat FGHI) | |
have 1: "component h X : fobj H X -[π]β fobj I X" using fgh_nat(3) Nat.component_mapping [of h X] X_in FGHI by auto | |
have 2: "component g X : fobj G X -[π]β fobj H X" using fgh_nat(2) Nat.component_mapping [of g X] X_in FGHI by auto | |
have 3: "component f X : fobj F X -[π]β fobj G X" using fgh_nat(1) Nat.component_mapping [of f X] X_in FGHI by auto | |
show "((component h X β[π] component g X) β[π] component f X) = component h X β[π] (component g X β[π] component f X)" | |
using Category.assoc [OF D_cat] 1 2 3 by auto | |
qed | |
qed | |
qed | |
definition Presheaf ("PSh(_)") where | |
"PSh(π) β‘ FunCat (π {^op}) Set" | |
definition contraHom ("Hom{_}[-,_]") where | |
"Hom{π}[-,r] β‘ β¦ | |
domCat = π {^op}, | |
codCat = Set, | |
fobj = Ξ»x. Category.Hom π x r, | |
fmap = Ξ»f. β¦ setdom = Category.Hom π (Cod π f) r, setcod = Category.Hom π (Dom π f) r, setfunction = Ξ»u. u β[π] f β¦ | |
β¦" | |
lemma contraHom_functor: | |
assumes C_cat: "Category π" and r_in: "r β Obj π" | |
shows "Functor' Hom{π}[-,r] : π {^op} βΆ Set" | |
unfolding Functor_def contraHom_def apply simp | |
apply (auto simp add: C_cat opposite_category) | |
apply (auto simp add: Set_category) | |
proof - | |
fix X assume "X β Obj (π {^op})" show "Category.Hom π X r β Obj Set" unfolding Set_def by auto | |
next | |
fix f assume "f β Arr (π {^op})" | |
thus "β¦setdom = Category.Hom π (codβπβ f) r, setcod = Category.Hom π (domβπβ f) r, setfunction = Ξ»u. u β[π] fβ¦ β Arr Set" | |
unfolding Set_def setmap_def opposite_def by (auto simp add: Category.comp_exist C_cat) | |
next | |
fix f x | |
assume assm: "f β Arr (π {^op})" "x β domβSetβ β¦setdom = (codβπβ f) -[π]β r, setcod = (domβπβ f) -[π]β r, setfunction = Ξ»u. u β[π] fβ¦" | |
show "x β Arr π" using assm unfolding Set_def by auto | |
show "domβπβ x = domβπ {^op}β f" using assm unfolding opposite_def Set_def by auto | |
show "codβπβ x = r" using assm unfolding Set_def by auto | |
next | |
fix f x | |
assume "f β Arr (π {^op})" "x β Arr π" "domβπβ x = domβπ {^op}β f" "r = codβπβ x" | |
thus "x β domβSetβ β¦setdom = (codβπβ f) -[π]β codβπβ x, setcod = (domβπβ f) -[π]β codβπβ x, setfunction = Ξ»u. u β[π] fβ¦" | |
unfolding Set_def opposite_def by auto | |
next | |
fix f x | |
assume assm: "f β Arr (π {^op})" "x β codβSetβ β¦setdom = (codβπβ f) -[π]β r, setcod = (domβπβ f) -[π]β r, setfunction = Ξ»u. u β[π] fβ¦" | |
show "x β Arr π" using assm unfolding Set_def by auto | |
show "domβπβ x = codβπ {^op}β f" using assm unfolding Set_def opposite_def by auto | |
show "codβπβ x = r" using assm unfolding Set_def opposite_def by auto | |
next | |
fix f x | |
assume assm: "f β Arr (π {^op})" "x β Arr π" "domβπβ x = codβπ {^op}β f" "r = codβπβ x" | |
show "x β codβSetβ β¦setdom = (codβπβ f) -[π]β codβπβ x, setcod = (domβπβ f) -[π]β codβπβ x, setfunction = Ξ»u. u β[π] fβ¦" | |
using assm unfolding Set_def opposite_def by auto | |
next | |
fix X | |
assume "X β Obj (π {^op})" | |
thus "β¦setdom = (codβπβ (idβπ {^op}β X)) -[π]β r, setcod = (domβπβ (idβπ {^op}β X)) -[π]β r, setfunction = Ξ»u. u β[π] (idβπ {^op}β X)β¦ = idβSetβ (X -[π]β r)" | |
apply (rule_tac setmap_eq) | |
apply (auto simp add: opposite_def setmap_def) | |
apply (auto simp add: C_cat Category.id_exist Category.right_id Category.left_id) | |
by (auto simp add: Set_def) | |
next | |
fix f g | |
assume "f β Arr (π {^op})" "g β Arr (π {^op})" "codβπ {^op}β f = domβπ {^op}β g" | |
thus "β¦setdom = (codβπβ (g β[π {^op}] f)) -[π]β r, setcod = (domβπβ (g β[π {^op}] f)) -[π]β r, setfunction = Ξ»u. u β[π] (g β[π {^op}] f)β¦ = | |
β¦setdom = (codβπβ g) -[π]β r, setcod = (domβπβ g) -[π]β r, | |
setfunction = Ξ»u. u β[π] gβ¦ β[Set] β¦setdom = (codβπβ f) -[π]β r, setcod = (domβπβ f) -[π]β r, setfunction = Ξ»u. u β[π] fβ¦" | |
unfolding Set_def opposite_def | |
apply (rule_tac setmap_eq) | |
apply (auto simp add: setmap_def) | |
by (auto simp add: C_cat Category.assoc Category.comp_exist) | |
qed | |
definition contraHomNat ("HomNat{_}[-,_]") where | |
"HomNat{π}[-,f] β‘ β¦ | |
domFunctor = Hom{π}[-,Dom π f], | |
codFunctor = Hom{π}[-,Cod π f], | |
component = Ξ»x. β¦ setdom = Category.Hom π x (Dom π f), setcod = Category.Hom π x (Cod π f), setfunction = Ξ»u. f β[π] u β¦ | |
β¦" | |
lemma contraHomNat_nat: | |
assumes C_cat: "Category π" "f β Arr π" | |
shows "Nat' HomNat{π}[-,f] : Hom{π}[-,Dom π f] βΆ Hom{π}[-,Cod π f]" | |
unfolding Nat_def contraHomNat_def | |
apply (auto simp add: contraHom_functor assms Category.dom_obj Category.cod_obj) | |
proof - | |
fix X | |
assume "X β Obj (π {^op})" thus "β¦setdom = X -[π]β domβπβ f, setcod = X -[π]β codβπβ f, setfunction = comp_category f πβ¦ β Arr Set" | |
unfolding Set_def setmap_def by (auto simp add: assms Category.comp_exist) | |
next | |
fix X x | |
assume "X β Obj (π {^op})" "x β domβSetβ β¦setdom = X -[π]β domβπβ f, setcod = X -[π]β codβπβ f, setfunction = comp_category f πβ¦" | |
thus "x β fobj Hom{π}[-,domβπβ f] X" unfolding opposite_def Set_def contraHom_def by auto | |
next | |
fix X x | |
assume "X β Obj (π {^op})" "x β fobj Hom{π}[-,domβπβ f] X" | |
thus "x β domβSetβ β¦setdom = X -[π]β domβπβ f, setcod = X -[π]β codβπβ f, setfunction = comp_category f πβ¦" | |
unfolding opposite_def contraHom_def Set_def by auto | |
next | |
fix X x | |
assume "X β Obj (π {^op})" "x β codβSetβ β¦setdom = X -[π]β domβπβ f, setcod = X -[π]β codβπβ f, setfunction = comp_category f πβ¦" | |
thus "x β fobj Hom{π}[-,codβπβ f] X" | |
unfolding opposite_def contraHom_def Set_def by auto | |
next | |
fix X x | |
assume "X β Obj (π {^op})" "x β fobj Hom{π}[-,codβπβ f] X" | |
thus "x β codβSetβ β¦setdom = X -[π]β domβπβ f, setcod = X -[π]β codβπβ f, setfunction = comp_category f πβ¦" | |
unfolding opposite_def contraHom_def Set_def by auto | |
next | |
fix fa | |
assume "fa β Arr (π {^op})" | |
thus "(β¦setdom = (codβπ {^op}β fa) -[π]β domβπβ f, setcod = (codβπ {^op}β fa) -[π]β codβπβ f, setfunction = comp_category f πβ¦ | |
β[Set] (fmap Hom{π}[-,domβπβ f] fa)) = | |
fmap Hom{π}[-,codβπβ f] fa | |
β[Set] β¦setdom = (domβπ {^op}β fa) -[π]β domβπβ f, setcod = (domβπ {^op}β fa) -[π]β codβπβ f, setfunction = comp_category f πβ¦" | |
apply (rule_tac setmap_eq) | |
unfolding setmap_def opposite_def Set_def contraHom_def | |
apply (auto simp add: assms Category.comp_exist) | |
apply (auto simp add: assms Category.assoc) | |
done | |
qed | |
lemma setmap_functor_fmap: | |
assumes "Functor' F : π βΆ Set" "f β Arr π" | |
shows "setmap (fmap F f)" | |
using assms Functor.fmap_type unfolding Set_def by fastforce | |
lemma setmap_nat_component: | |
assumes "Nat Ξ·" "Functor' (domFunctor Ξ·) : π βΆ Set" "X β Obj π" | |
shows "setmap (component Ξ· X)" | |
using assms Nat.component_mapping unfolding Set_def by fastforce | |
definition yoneda where | |
"yoneda π β‘ β¦ | |
domCat = π, | |
codCat = PSh(π), | |
fobj = contraHom π, | |
fmap = contraHomNat π | |
β¦" | |
lemma yoneda_functor: | |
assumes "Category π" | |
shows "Functor' (yoneda π) : π βΆ PSh(π)" | |
unfolding Functor_def apply auto | |
unfolding yoneda_def Presheaf_def | |
apply (auto simp add: assms FunCat_category opposite_category Set_category) | |
apply (auto simp add: assms FunCat_def contraHom_functor contraHomNat_nat) | |
apply (auto simp add: assms Category.dom_obj Category.cod_obj FunCat_def contraHom_functor) | |
proof- | |
fix X | |
assume "X β Obj π" thus "HomNat{π}[-,idβπβ X] = idNat Hom{π}[-,X]" | |
apply (rule_tac nat_eq) | |
apply (auto simp add: assms Category.id_exist Nat.dom_functor contraHomNat_nat) | |
apply (auto simp add: assms contraHom_functor idNat_nat) | |
proof - | |
fix Xa | |
assume "X β Obj π" "Xa β Obj (π {^op})" | |
thus "component HomNat{π}[-,idβπβ X] Xa = component (idNat Hom{π}[-,X]) Xa" | |
unfolding contraHomNat_def apply auto | |
unfolding idNat_def apply auto | |
unfolding contraHom_def apply auto | |
apply (auto simp add: assms Category.id_exist) | |
apply (rule setmap_eq) | |
by (auto simp add: setmap_def Set_def assms Category.left_id Category.right_id) | |
qed | |
next | |
fix f g | |
assume fg: "f β Arr π" "g β Arr π" "codβπβ f = domβπβ g" | |
hence gf:"(g β[π] f) β Arr π" by (auto simp add: assms Category.comp_exist) | |
let ?Cop = "π {^op}" | |
show "HomNat{π}[-,g β[π] f] = Nat[HomNat{π}[-,g] β HomNat{π}[-,f]]" (is "?L = ?R") | |
apply (rule_tac nat_eq [of _ ?Cop Set _ ?L ?R] , auto) | |
apply (auto simp add: contraHomNat_nat fg assms Category.comp_exist) | |
apply (auto simp add: contraHom_functor Category.dom_obj Category.cod_obj fg assms) | |
apply (auto simp add: compNat_nat contraHomNat_nat fg assms) | |
proof - | |
fix X | |
assume X_in: "X β Obj (π {^op})" | |
show "component HomNat{π}[-,g β[π] f] X = component Nat[HomNat{π}[-,g] β HomNat{π}[-,f]] X" (is "?L = ?R") | |
proof - | |
have "setmap ?L" | |
using setmap_nat_component [OF _ _ X_in] contraHom_functor [OF assms] contraHomNat_nat [OF assms gf] | |
using Category.cod_obj [OF assms gf] Nat.dom_functor Nat.same_cod Nat.same_dom by metis | |
moreover have "setmap ?R" | |
using setmap_nat_component [OF _ _ X_in] contraHom_functor [OF assms] contraHomNat_nat [OF assms] fg | |
using Category.dom_obj [OF assms fg(1)] compNat_nat by metis | |
moreover have "setdom ?L = setdom ?R" | |
proof- | |
have 0: "setdom ?L = X -[π]β (domβπβ (g β[π] f))" | |
unfolding contraHomNat_def by auto | |
have "setdom ?R = setdom (component HomNat{π}[-,g] X β[codCat (domFunctor HomNat{π}[-,g])] component HomNat{π}[-,f] X)" | |
unfolding compNat_def by auto | |
also have "β¦ = setdom (component HomNat{π}[-,g] X β[Set] component HomNat{π}[-,f] X)" | |
unfolding contraHomNat_def contraHom_functor fg X_in by (simp add: contraHom_def) | |
also have "β¦ = setdom (component HomNat{π}[-,f] X)" | |
unfolding Set_def by auto | |
also have "β¦ = X -[π]β (domβπβ f)" | |
unfolding contraHomNat_def by auto | |
finally | |
show ?thesis using 0 assms Category.comp_exist fg by fastforce | |
qed | |
moreover have "setcod ?L = setcod ?R" | |
proof- | |
have 0: "setcod ?L = X -[π]β (codβπβ (g β[π] f))" | |
unfolding contraHomNat_def by auto | |
have "setcod ?R = setcod (component HomNat{π}[-,g] X β[codCat (domFunctor HomNat{π}[-,g])] component HomNat{π}[-,f] X)" | |
unfolding compNat_def by auto | |
also have "β¦ = setcod (component HomNat{π}[-,g] X β[Set] component HomNat{π}[-,f] X)" | |
unfolding contraHomNat_def contraHom_functor fg X_in by (simp add: contraHom_def) | |
also have "β¦ = setcod (component HomNat{π}[-,g] X)" | |
unfolding Set_def by auto | |
also have "β¦ = X -[π]β (codβπβ g)" | |
unfolding contraHomNat_def by auto | |
finally | |
show ?thesis using 0 assms Category.comp_exist fg by fastforce | |
qed | |
moreover have "βfβsetdom ?L. setfunction ?L f = setfunction ?R f" | |
proof | |
fix fa | |
assume "fa β setdom (component HomNat{π}[-,g β[π] f] X)" | |
hence "fa : X -[π]β (Dom π f)" | |
unfolding contraHomNat_def by (auto simp add: assms fg Category.comp_exist) | |
thus "setfunction (component HomNat{π}[-,g β[π] f] X) fa = setfunction (component Nat[HomNat{π}[-,g] β HomNat{π}[-,f]] X) fa" | |
unfolding compNat_def contraHomNat_def contraHom_def Set_def | |
by (auto simp add: assms Category.assoc fg) | |
qed | |
ultimately | |
show ?thesis using setmap_eq [of ?L ?R] by auto | |
qed | |
qed | |
qed | |
abbreviation arrow (infixr "β" 80) where | |
"A β B β‘ {f. βxβA. f x β B}" | |
definition Bijective ("_ β _") where | |
"A β B β‘ βf β A β B. βg β B β A. (βx β A. g (f x) = x) & (βy β B. f (g y) = y)" | |
definition nat_to_obj where | |
"nat_to_obj π F r ①λα. setfunction (component Ξ± r) (Id π r)" | |
lemma nat_to_obj_arrow: | |
assumes "Category π" "F β Obj PSh(π)" "r β Obj π" | |
shows "nat_to_obj π F r : Category.Hom (PSh(π)) (fobj (yoneda π) r) F β fobj F r" | |
proof | |
show "βΞ±β(fobj (yoneda π) r -[PSh(π)]β F). nat_to_obj π F r Ξ± β fobj F r" | |
proof | |
fix Ξ± | |
assume "Ξ± β fobj (yoneda π) r -[PSh(π)]β F" | |
hence "Nat' Ξ± : fobj (yoneda π) r βΆ F" | |
unfolding Presheaf_def FunCat_def by auto | |
hence "component Ξ± r : Category.Hom π r r -[Set]β fobj F r" | |
proof - | |
have r_in: "r β Obj (π {^op})" | |
unfolding opposite_def by (auto simp add: assms(3)) | |
assume Ξ±_nat: "Nat' Ξ± : fobj (yoneda π) r βΆ F" | |
hence "Functor' (domFunctor Ξ±) : π {^op} βΆ Set" | |
unfolding yoneda_def | |
using contraHom_functor [of π r] assms by auto | |
hence "component Ξ± r : fobj (domFunctor Ξ±) r -[Set]β fobj (codFunctor Ξ±) r" | |
using Nat.component_mapping [of Ξ± r] Ξ±_nat r_in by auto | |
thus ?thesis | |
using Ξ±_nat yoneda_def [of π] contraHom_def [of π r] by auto | |
qed | |
thus "nat_to_obj π F r Ξ± β fobj F r" | |
unfolding nat_to_obj_def Set_def setmap_def | |
using assms(1) assms (3) Category.id_exist [of π r] | |
by auto | |
qed | |
qed | |
definition obj_to_nat where | |
"obj_to_nat π F r β‘ Ξ»x. β¦ | |
domFunctor = (fobj (yoneda π) r), | |
codFunctor = F, | |
component = Ξ»d. β¦ setdom = fobj (fobj (yoneda π) r) d, setcod = fobj F d | |
, setfunction = Ξ»u. setfunction (fmap F u) x β¦ | |
β¦" | |
lemma obj_to_nat_arrow: | |
assumes "Category π" "F β Obj PSh(π)" "r β Obj π" | |
shows "obj_to_nat π F r : fobj F r β Category.Hom (PSh(π)) (fobj (yoneda π) r) F" | |
proof auto | |
fix x | |
assume x_in: "x β fobj F r" | |
have nat: "Nat' (obj_to_nat π F r x) : (fobj (yoneda π) r) βΆ F" | |
proof | |
show "Category.Nat (obj_to_nat π F r x)" (is "Category.Nat ?f") | |
proof | |
have 1: "Functor' (fobj (yoneda π) r) : π {^op} βΆ Set" | |
unfolding yoneda_def using contraHom_functor [of π r] assms by auto | |
have 2: "Functor' F : π {^op} βΆ Set" using assms(2) unfolding Presheaf_def FunCat_def by auto | |
thus "Functor' (domFunctor ?f) : domCat (domFunctor ?f) βΆ codCat (domFunctor ?f)" | |
unfolding obj_to_nat_def apply auto | |
using assms(2) unfolding Presheaf_def FunCat_def yoneda_def | |
using contraHom_functor [of π r] assms by auto | |
show "Functor' (codFunctor ?f) : domCat (codFunctor ?f) βΆ codCat (codFunctor ?f)" | |
unfolding obj_to_nat_def using assms(2) unfolding Presheaf_def FunCat_def by auto | |
show "domCat (domFunctor ?f) = domCat (codFunctor ?f)" | |
unfolding obj_to_nat_def using 1 2 by auto | |
show "codCat (domFunctor ?f) = codCat (codFunctor ?f)" | |
unfolding obj_to_nat_def using 1 2 by auto | |
fix xa | |
assume xa_in: "xa β Obj (domCat (domFunctor ?f))" | |
show "component ?f xa β fobj (domFunctor ?f) xa -[codCat (domFunctor ?f)]β fobj (codFunctor ?f) xa" | |
apply (auto simp add: obj_to_nat_def 1) | |
unfolding Set_def apply auto | |
unfolding yoneda_def apply auto | |
unfolding contraHom_def apply auto | |
proof (unfold setmap_def , auto) | |
fix xb | |
assume xb_assm: "xb β Arr π" "xa = domβπβ xb" "r = codβπβ xb" | |
hence "xb : r -[π {^op}]β xa" | |
unfolding opposite_def by auto | |
hence Fxb_type: "fmap F xb : fobj F r -[Set]β fobj F xa" | |
using Functor.fmap_mapping [of F xb] 2 by auto | |
hence "setmap (fmap F xb)" | |
unfolding Set_def by auto | |
thus "setfunction (fmap F xb) x β fobj F (domβπβ xb)" | |
unfolding setmap_def using x_in xb_assm Fxb_type | |
unfolding Set_def by auto | |
qed | |
next | |
have 1: "Functor' (fobj (yoneda π) r) : π {^op} βΆ Set" | |
unfolding yoneda_def using contraHom_functor [of π r] assms by auto | |
have 2: "Functor' F : π {^op} βΆ Set" using assms(2) unfolding Presheaf_def FunCat_def by auto | |
fix f | |
assume "f β Arr (domCat (domFunctor ?f))" | |
hence f_in: "f : (codβπβ f) -[π {^op}]β (domβπβ f)" | |
using contraHom_functor [of π r] assms | |
unfolding opposite_def obj_to_nat_def yoneda_def | |
by auto | |
show "(component ?f (codβdomCat (domFunctor ?f)β f) β[codCat (domFunctor ?f)] fmap (domFunctor ?f) f) = | |
(fmap (codFunctor ?f) f β[codCat (domFunctor ?f)] component ?f (domβdomCat (domFunctor ?f)β f))" | |
apply (auto simp add: obj_to_nat_def 1 opposite_def) | |
unfolding yoneda_def apply auto | |
unfolding contraHom_def apply auto | |
proof (rule setmap_eq , auto simp add: Set_def) | |
show "setmap β¦setdom = (codβπβ f) -[π]β r, setcod = fobj F (domβπβ f), | |
setfunction = Ξ»xa. setfunction (fmap F (xa β[π] f)) xβ¦" | |
unfolding setmap_def | |
proof auto | |
fix xa | |
assume "xa β Arr π" "domβπβ xa = codβπβ f" "r = codβπβ xa" | |
hence "(f β[π {^op}] xa) : r -[π {^op}]β (domβπβ f)" | |
using f_in unfolding opposite_def by (auto simp add: Category.comp_exist assms(1)) | |
hence "fmap F (f β[π {^op}] xa) : fobj F r -[Set]β fobj F (domβπβ f)" | |
using Functor.fmap_mapping 2 by fastforce | |
thus "setfunction (fmap F (xa β[π] f)) x β fobj F (domβπβ f)" | |
unfolding opposite_def Set_def setmap_def using x_in by auto | |
qed | |
show "setmap β¦setdom = (codβπβ f) -[π]β r, setcod = setcod (fmap F f), | |
setfunction = Ξ»xa. setfunction (fmap F f) (setfunction (fmap F xa) x)β¦" | |
unfolding setmap_def | |
proof auto | |
fix xa | |
assume xa_assms: "xa β Arr π" "domβπβ xa = codβπβ f" "r = codβπβ xa" | |
hence "fmap F f : fobj F (codβπβ f) -[Set]β fobj F (domβπβ f)" "fmap F xa : fobj F r -[Set]β fobj F (domβπβ xa)" | |
using Functor.fmap_mapping 2 f_in apply fastforce | |
using Functor.fmap_mapping [of F xa] 2 xa_assms unfolding opposite_def by auto | |
thus "setfunction (fmap F f) (setfunction (fmap F xa) x) β setcod (fmap F f)" | |
unfolding Set_def setmap_def using x_in xa_assms by auto | |
qed | |
next | |
have Ff_type: "fmap F f : fobj F (codβπβ f) -[Set]β fobj F (domβπβ f)" | |
using f_in Functor.fmap_type 2 unfolding opposite_def by fastforce | |
fix x | |
assume "x β fobj F (domβπβ f)" thus "x β setcod (fmap F f)" | |
using Ff_type unfolding Set_def by auto | |
next | |
have Ff_type: "fmap F f : fobj F (codβπβ f) -[Set]β fobj F (domβπβ f)" | |
using f_in Functor.fmap_type 2 unfolding opposite_def by fastforce | |
fix x | |
assume "x β setcod (fmap F f)" thus "x β fobj F (domβπβ f)" | |
using Ff_type unfolding Set_def by auto | |
next | |
fix xa | |
assume xa_assms: "xa β Arr π" "domβπβ xa = codβπβ f" "r = codβπβ xa" | |
have "setfunction (fmap F (f β[π {^op}] xa)) x = setfunction (fmap F f) (setfunction (fmap F xa) x)" (is "?L = ?R") | |
proof- | |
have "?L = setfunction (fmap F f β[Set] fmap F xa) x" | |
using Functor.covariant [of F xa f] 2 f_in xa_assms | |
by (metis (no_types, lifting) Category.Category.select_convs(2) Category.Category.select_convs(3) Category.Category.select_convs(4) mem_Collect_eq opposite_def) | |
also have "β¦ = ?R" | |
unfolding Set_def by auto | |
finally show ?thesis by simp | |
qed | |
thus "setfunction (fmap F (xa β[π] f)) x = setfunction (fmap F f) (setfunction (fmap F xa) x)" | |
unfolding opposite_def by auto | |
qed | |
qed | |
show "domFunctor (obj_to_nat π F r x) = fobj (yoneda π) r β§ codFunctor (obj_to_nat π F r x) = F" | |
unfolding obj_to_nat_def by auto | |
qed | |
show "obj_to_nat π F r x β Arr PSh(π)" | |
unfolding Presheaf_def FunCat_def apply auto | |
using nat apply auto | |
unfolding yoneda_def apply auto | |
using contraHom_functor [OF assms(1) assms(3)] apply auto | |
using assms(2) unfolding Presheaf_def FunCat_def apply auto | |
done | |
show "domβPSh πβ obj_to_nat π F r x = fobj (yoneda π) r" | |
unfolding obj_to_nat_def Presheaf_def FunCat_def by auto | |
show "codβPSh πβ obj_to_nat π F r x = F" | |
unfolding obj_to_nat_def Presheaf_def FunCat_def by auto | |
qed | |
lemma YonedaLemma: | |
assumes "Category π" "F β Obj PSh(π)" "r β Obj π" | |
shows "(Category.Hom (PSh(π)) (fobj (yoneda π) r) F) β (fobj F r)" | |
unfolding Bijective_def | |
proof - | |
let ?f = "nat_to_obj π F r" | |
let ?g = "obj_to_nat π F r" | |
let ?Cop = "π {^op}" | |
have "?f β (fobj (yoneda π) r -[PSh π]β F) β fobj F r" | |
using nat_to_obj_arrow assms by fastforce | |
moreover have "?g β fobj F r β (fobj (yoneda π) r -[PSh π]β F)" | |
using obj_to_nat_arrow assms by fastforce | |
moreover have "βxβfobj (yoneda π) r -[PSh π]β F. ?g (?f x) = x" (is "βxβ?yoneda -[_]β _. _") | |
apply auto | |
proof (rule nat_eq [of ?yoneda ?Cop Set F]) | |
fix x | |
assume 1: "x β Arr PSh π" "domβPSh πβ x = fobj (yoneda π) r" "F = codβPSh πβ x" | |
hence x_arrow: "x : fobj (yoneda π) r -[PSh π]β F" by auto | |
hence x_nat: "Nat' x : fobj (yoneda π) r βΆ F" | |
unfolding Presheaf_def FunCat_def by auto | |
show "Functor' fobj (yoneda π) r : π {^op} βΆ Set" | |
unfolding yoneda_def by (auto simp add: contraHom_functor assms) | |
show "Functor' F : π {^op} βΆ Set" | |
using assms(2) unfolding Presheaf_def FunCat_def by auto | |
show "Nat' obj_to_nat π (codβPSh πβ x) r (nat_to_obj π (codβPSh πβ x) r x) : fobj (yoneda π) r βΆ F" | |
using nat_to_obj_arrow [OF assms] obj_to_nat_arrow [OF assms] x_arrow | |
unfolding Presheaf_def FunCat_def by auto | |
show "Nat' x : fobj (yoneda π) r βΆ F" by fact | |
show "βXβObj (π {^op}). component (obj_to_nat π (codβPSh πβ x) r (nat_to_obj π (codβPSh πβ x) r x)) X = component x X" | |
apply (auto simp add: `F = codβPSh πβ x` [symmetric]) | |
proof (rule_tac setmap_eq) | |
fix X assume X_in: "X β Obj (π {^op})" | |
have 2: "nat_to_obj π F r x β fobj F r" | |
using nat_to_obj_arrow [OF assms] | |
using x_arrow by auto | |
have "Nat (obj_to_nat π F r (nat_to_obj π F r x))" | |
using obj_to_nat_arrow [OF assms] 2 unfolding Presheaf_def FunCat_def by auto | |
moreover have "Functor' (domFunctor (obj_to_nat π F r (nat_to_obj π F r x))) : π {^op} βΆ Set" | |
unfolding obj_to_nat_def yoneda_def using contraHom_functor [OF assms(1) assms(3)] by auto | |
ultimately | |
show "setmap (component (obj_to_nat π F r (nat_to_obj π F r x)) X)" | |
using setmap_nat_component [OF _ _ X_in] by auto | |
show "setmap (component x X)" | |
using setmap_nat_component [OF _ _ X_in] x_nat unfolding yoneda_def | |
by (metis `Functor' fobj (yoneda π) r : π {^op} βΆ Set` yoneda_def) | |
show "setdom (component (obj_to_nat π F r (nat_to_obj π F r x)) X) = setdom (component x X)" | |
unfolding obj_to_nat_def nat_to_obj_def apply simp | |
using Nat.component_mapping [of x X] apply (simp add: x_nat) | |
by (simp add: `Functor' fobj (yoneda π) r : π {^op} βΆ Set` Set_def X_in) | |
show "setcod (component (obj_to_nat π F r (nat_to_obj π F r x)) X) = setcod (component x X)" | |
unfolding obj_to_nat_def nat_to_obj_def apply simp | |
using Nat.component_mapping [of x X] apply (simp add: x_nat) | |
by (simp add: `Functor' fobj (yoneda π) r : π {^op} βΆ Set` Set_def X_in) | |
show "βxaβsetdom (component (obj_to_nat π F r (nat_to_obj π F r x)) X). | |
setfunction (component (obj_to_nat π F r (nat_to_obj π F r x)) X) xa = | |
setfunction (component x X) xa" | |
unfolding obj_to_nat_def nat_to_obj_def yoneda_def apply simp | |
unfolding contraHom_def | |
proof auto | |
fix xa assume xa_assms: "xa β Arr π" "X = domβπβ xa" "r = codβπβ xa" | |
have "(fmap F xa β[Set] component x r) = component x X β[Set] fmap (fobj (yoneda π) r) xa" | |
using Nat.naturality [of x xa] x_nat apply auto | |
unfolding yoneda_def apply simp unfolding contraHom_def apply simp | |
unfolding opposite_def by (auto simp add: xa_assms) | |
hence 2: "setfunction (fmap F xa) (setfunction (component x r) (idβπβ r)) | |
= setfunction (component x X) (setfunction (fmap (fobj (yoneda π) r) xa) (idβπβ r))" | |
unfolding Set_def apply auto by metis | |
show "setfunction (fmap F xa) (setfunction (component x (codβπβ xa)) (idβπβ codβπβ xa)) = | |
setfunction (component x (domβπβ xa)) xa" | |
apply (auto simp add: xa_assms(2) [symmetric] xa_assms(3) [symmetric]) | |
apply (auto simp add: 2) | |
unfolding yoneda_def apply simp | |
unfolding contraHom_def apply simp | |
using Category.left_id [OF assms(1) xa_assms(1)] xa_assms(3) by auto | |
qed | |
qed | |
qed | |
moreover have "βyβfobj F r. ?f (?g y) = y" | |
apply auto | |
unfolding nat_to_obj_def obj_to_nat_def apply simp | |
using Functor.preserve_id [of F r] assms | |
unfolding Presheaf_def FunCat_def opposite_def apply auto | |
unfolding Set_def by simp | |
ultimately | |
show "βfβ(fobj (yoneda π) r -[PSh π]β F) β fobj F r. βgβfobj F r β (fobj (yoneda π) r -[PSh π]β F). | |
(βxβfobj (yoneda π) r -[PSh π]β F. g (f x) = x) β§ (βyβfobj F r. f (g y) = y)" | |
by auto | |
qed | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment