Skip to content

Instantly share code, notes, and snippets.

@myuon
Last active March 23, 2023 11:55
Show Gist options
  • Save myuon/d75edfbb5ef11fbd1075 to your computer and use it in GitHub Desktop.
Save myuon/d75edfbb5ef11fbd1075 to your computer and use it in GitHub Desktop.
Yoneda Lemma
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)
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