Skip to content

Instantly share code, notes, and snippets.

@myuon
Last active August 29, 2015 14:25
Show Gist options
  • Save myuon/506c3277b6dbd18cd800 to your computer and use it in GitHub Desktop.
Save myuon/506c3277b6dbd18cd800 to your computer and use it in GitHub Desktop.
setoid construction
theory Category
imports Main
begin
no_notation Fun.comp (infixl "∘" 55)
lemma equiv_refl: "equiv A R ⟹ x ∈ A ⟹ (x,x) ∈ R"
by (rule equivE, simp, rule refl_onD, simp)
lemma equiv_sym: "equiv A R ⟹ (x,y) ∈ R ⟹ (y,x) ∈ R"
by (rule equivE, simp, rule symD, simp)
lemma equiv_trans: "equiv A R ⟹ (x,y) ∈ R ⟹ (y,z) ∈ R ⟹ (x,z) ∈ R"
by (rule equivE, simp, rule transD, simp)
lemma equiv_reflp: "equiv A {(x,y). eq x y} ⟹ x ∈ A ⟹ eq x x"
using equiv_refl by fastforce
lemma equiv_symp: "equiv A {(x,y). eq x y} ⟹ eq x y ⟹ eq y x"
using equiv_sym by fastforce
lemma equiv_transp: "equiv A {(x,y). eq x y} ⟹ eq x y ⟹ eq y z ⟹ eq x z"
by (meson equivE transpE transp_trans)
record 'a setoid =
carrier :: "'a set"
equal :: "'a β‡’ 'a β‡’ bool"
locale setoid =
fixes A :: "('a,'b) setoid_scheme"
assumes equal_equiv: "equiv (carrier A) {(x,y). equal A x y}"
declare [[coercion_enabled]]
declare [[coercion carrier]]
definition setoid_set where
"setoid_set A = ⦇ carrier = A, equal = Ξ»x y. x = y ∧ x ∈ A ∧ y ∈ A ⦈"
lemma setoid_set_setoid: "setoid (setoid_set A)"
apply (unfold setoid_def setoid_set_def, auto, rule equivI)
apply (rule refl_onI, auto, rule symI, auto, rule transI, auto)
done
record ('o,'a) Category =
Obj :: "'o set"
Arr :: "'a setoid"
Dom :: "'a β‡’ 'o"
Cod :: "'a β‡’ 'o"
Id :: "'o β‡’ 'a" ("idΔ± _" [80] 90)
comp :: "'a β‡’ 'a β‡’ 'a" (infixl "∘ı" 60)
locale Category =
fixes π’ž :: "('o,'a,'c) Category_scheme" (structure)
assumes arr_setoid: "setoid (Arr π’ž)"
and dom_obj: "f ∈ Arr π’ž ⟹ Dom π’ž f ∈ Obj π’ž"
and cod_obj: "f ∈ Arr π’ž ⟹ Cod π’ž f ∈ Obj π’ž"
and id_exist: "A ∈ Obj π’ž ⟹ id A ∈ Arr π’ž ∧ Dom π’ž (id A) = A ∧ Cod π’ž (id A) = A"
and comp_exist: "⟦ f ∈ Arr π’ž; g ∈ Arr π’ž; Cod π’ž f = Dom π’ž g ⟧
⟹ g ∘ f ∈ Arr π’ž ∧ Dom π’ž (g ∘ f) = Dom π’ž f ∧ Cod π’ž (g ∘ f) = Cod π’ž g"
and comp_equal: "⟦ f ∈ Arr π’ž; g ∈ Arr π’ž; h ∈ Arr π’ž; i ∈ Arr π’ž; equal (Arr π’ž) f g; equal (Arr π’ž) h i;
Dom π’ž f = Dom π’ž g; Cod π’ž f = Cod π’ž g; Dom π’ž h = Dom π’ž i; Cod π’ž h = Cod π’ž i; Cod π’ž h = Dom π’ž f ⟧
⟹ equal (Arr π’ž) (f ∘ h) (g ∘ i)"
and left_id: "f ∈ Arr π’ž ⟹ equal (Arr π’ž) (id (Cod π’ž f) ∘ f) f"
and right_id: "f ∈ Arr π’ž ⟹ equal (Arr π’ž) f (f ∘ id (Dom π’ž f))"
and assoc: "⟦ f ∈ Arr π’ž; g ∈ Arr π’ž; h ∈ Arr π’ž; Cod π’ž f = Dom π’ž g; Cod π’ž g = Dom π’ž h ⟧ ⟹ equal (Arr π’ž) ((h ∘ g) ∘ f) (h ∘ (g ∘ f))"
abbreviation arr_equal (infixl "β‰ˆΔ±" 40) where
"arr_equal π’ž f g ≑ (equal (Arr π’ž) f g)"
lemma (in Category) arr_equiv: "equiv (Arr π’ž) {(f,g). f β‰ˆ g}"
using arr_setoid by (simp add: setoid_def)
lemma (in Category) arr_refl: "f ∈ Arr π’ž ⟹ f β‰ˆ f"
by (rule equiv_reflp, rule arr_equiv, simp)
lemma (in Category) arr_sym: "f β‰ˆ g ⟹ g β‰ˆ f"
by (rule equiv_symp, rule arr_equiv, simp)
lemma (in Category) arr_trans: "⟦ f β‰ˆ g; g β‰ˆ h ⟧ ⟹ f β‰ˆ h"
by (rule equiv_transp, rule arr_equiv, simp)
definition hom ("Hom[_][_,_]" 80) where
"Hom[π’ž][A,B] ≑ ⦇ carrier = {f ∈ Arr π’ž. Dom π’ž f = A ∧ Cod π’ž f = B}
, equal = Ξ»f g. equal (Arr π’ž) f g ∧ f ∈ Arr π’ž ∧ g ∈ Arr π’ž ∧ Dom π’ž f = A ∧ Cod π’ž f = B ∧ Dom π’ž g = A ∧ Cod π’ž g = B ⦈"
lemma hom_setoid: "Category π’ž ⟹ A ∈ Obj π’ž ⟹ B ∈ Obj π’ž ⟹ setoid (Hom[π’ž][A,B])"
apply (unfold setoid_def hom_def, simp, rule equivI)
apply (rule refl_onI, auto simp add: Category.arr_refl)
apply (rule symI, auto simp add: Category.arr_sym)
apply (rule transI, simp, rule Category.arr_trans, auto)
done
lemma CategoryI:
fixes π’ž :: "('o,'a,'c) Category_scheme"
assumes "setoid (Arr π’ž)"
and "β‹€f. f ∈ Arr π’ž ⟹ Dom π’ž f ∈ Obj π’ž" "β‹€f. f ∈ Arr π’ž ⟹ Cod π’ž f ∈ Obj π’ž"
and "β‹€A. A ∈ Obj π’ž ⟹ Id π’ž A ∈ Hom[π’ž][A,A]"
and "β‹€A B C f g. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; f ∈ Hom[π’ž][A,B]; g ∈ Hom[π’ž][B,C] ⟧ ⟹ g βˆ˜β‡˜π’žβ‡™ f ∈ Hom[π’ž][A,C]"
and "β‹€A B C f g h i. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; f ∈ Hom[π’ž][B,C]; g ∈ Hom[π’ž][B,C]; h ∈ Hom[π’ž][A,B]; i ∈ Hom[π’ž][A,B]; f β‰ˆβ‡˜π’žβ‡™ g; h β‰ˆβ‡˜π’žβ‡™ i ⟧ ⟹ f βˆ˜β‡˜π’žβ‡™ h β‰ˆβ‡˜π’žβ‡™ g βˆ˜β‡˜π’žβ‡™ i"
and "β‹€A B f. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; f ∈ Hom[π’ž][A,B] ⟧ ⟹ Id π’ž B βˆ˜β‡˜π’žβ‡™ f β‰ˆβ‡˜π’žβ‡™ f"
and "β‹€A B f. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; f ∈ Hom[π’ž][A,B] ⟧ ⟹ f β‰ˆβ‡˜π’žβ‡™ f βˆ˜β‡˜π’žβ‡™ Id π’ž A"
and "β‹€A B C D f g h. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; D ∈ Obj π’ž; f ∈ Hom[π’ž][A,B]; g ∈ Hom[π’ž][B,C]; h ∈ Hom[π’ž][C,D] ⟧ ⟹ ((h βˆ˜β‡˜π’žβ‡™ g) βˆ˜β‡˜π’žβ‡™ f) β‰ˆβ‡˜π’žβ‡™ (h βˆ˜β‡˜π’žβ‡™ (g βˆ˜β‡˜π’žβ‡™ f))"
shows "Category π’ž"
proof (unfold Category_def, auto simp add: assms)
{ fix A assume "A ∈ Obj π’ž" thus "idβ‡˜π’žβ‡™ A ∈ carrier (Arr π’ž)" using assms(4) by (simp add: hom_def) }
{ fix A assume "A ∈ Obj π’ž" thus "Dom π’ž (idβ‡˜π’žβ‡™ A) = A" using assms(4) by (simp add: hom_def) }
{ fix A assume "A ∈ Obj π’ž" thus "Cod π’ž (idβ‡˜π’žβ‡™ A) = A" using assms(4) by (simp add: hom_def) }
next
fix f g
{
assume 1: "f ∈ carrier (Arr π’ž)" "g ∈ carrier (Arr π’ž)" "Cod π’ž f = Dom π’ž g"
have 2: "Dom π’ž f ∈ Obj π’ž" "Cod π’ž f ∈ Obj π’ž" "Dom π’ž g ∈ Obj π’ž" "Cod π’ž g ∈ Obj π’ž"
using 1 assms(2) assms(3) by auto
show "g βˆ˜β‡˜π’žβ‡™ f ∈ carrier (Arr π’ž)"
using assms(5) [of "Dom π’ž f" "Cod π’ž f" "Cod π’ž g" f g] by (simp add: hom_def 2 1)
}
{
assume 1: "f ∈ carrier (Arr π’ž)" "g ∈ carrier (Arr π’ž)" "Cod π’ž f = Dom π’ž g"
have 2: "Dom π’ž f ∈ Obj π’ž" "Cod π’ž f ∈ Obj π’ž" "Dom π’ž g ∈ Obj π’ž" "Cod π’ž g ∈ Obj π’ž"
using 1 assms(2) assms(3) by auto
show "Dom π’ž (g βˆ˜β‡˜π’žβ‡™ f) = Dom π’ž f"
using assms(5) [of "Dom π’ž f" "Cod π’ž f" "Cod π’ž g" f g] by (simp add: hom_def 2 1)
}
{
assume 1: "f ∈ carrier (Arr π’ž)" "g ∈ carrier (Arr π’ž)" "Cod π’ž f = Dom π’ž g"
have 2: "Dom π’ž f ∈ Obj π’ž" "Cod π’ž f ∈ Obj π’ž" "Dom π’ž g ∈ Obj π’ž" "Cod π’ž g ∈ Obj π’ž"
using 1 assms(2) assms(3) by auto
show "Cod π’ž (g βˆ˜β‡˜π’žβ‡™ f) = Cod π’ž g"
using assms(5) [of "Dom π’ž f" "Cod π’ž f" "Cod π’ž g" f g] by (simp add: hom_def 2 1)
}
next
fix f g h i
assume 1: "f ∈ carrier (Arr π’ž)" "g ∈ carrier (Arr π’ž)" "h ∈ carrier (Arr π’ž)" "i ∈ carrier (Arr π’ž)" "f β‰ˆβ‡˜π’žβ‡™ g" "h β‰ˆβ‡˜π’žβ‡™ i"
"Dom π’ž f = Dom π’ž g" "Cod π’ž f = Cod π’ž g" "Dom π’ž h = Dom π’ž i" "Cod π’ž h = Dom π’ž g" "Cod π’ž i = Dom π’ž g"
have 2: "Dom π’ž f ∈ Obj π’ž" "Cod π’ž f ∈ Obj π’ž" "Dom π’ž g ∈ Obj π’ž" "Cod π’ž g ∈ Obj π’ž" "Dom π’ž h ∈ Obj π’ž" "Cod π’ž h ∈ Obj π’ž" "Dom π’ž i ∈ Obj π’ž" "Cod π’ž i ∈ Obj π’ž"
using 1 assms(2) assms(3) by auto
show "f βˆ˜β‡˜π’žβ‡™ h β‰ˆβ‡˜π’žβ‡™ g βˆ˜β‡˜π’žβ‡™ i"
by (rule assms(6) [of "Dom π’ž h" "Dom π’ž f" "Cod π’ž f" f g h i], auto simp add: 2 hom_def 1)
next
fix f
{
assume 1: "f ∈ carrier (Arr π’ž)"
hence 2: "Dom π’ž f ∈ Obj π’ž" "Cod π’ž f ∈ Obj π’ž" using assms(2) assms(3) by auto
show "idβ‡˜π’žβ‡™ Cod π’ž f βˆ˜β‡˜π’žβ‡™ f β‰ˆβ‡˜π’žβ‡™ f" by (rule assms(7), auto simp add: hom_def 2 1)
}
{
assume 1: "f ∈ carrier (Arr π’ž)"
hence 2: "Dom π’ž f ∈ Obj π’ž" "Cod π’ž f ∈ Obj π’ž" using assms(2) assms(3) by auto
show "f β‰ˆβ‡˜π’žβ‡™ f βˆ˜β‡˜π’žβ‡™ idβ‡˜π’žβ‡™ Dom π’ž f" by (rule assms(8), auto simp add: hom_def 2 1)
}
next
fix f g h
assume 1: "f ∈ carrier (Arr π’ž)" "g ∈ carrier (Arr π’ž)" "h ∈ carrier (Arr π’ž)" "Cod π’ž f = Dom π’ž g" "Cod π’ž g = Dom π’ž h"
hence 2: "Dom π’ž f ∈ Obj π’ž" "Cod π’ž f ∈ Obj π’ž" "Dom π’ž g ∈ Obj π’ž" "Cod π’ž g ∈ Obj π’ž" "Dom π’ž h ∈ Obj π’ž" "Cod π’ž h ∈ Obj π’ž"
using assms(2) assms(3) by auto
show "h βˆ˜β‡˜π’žβ‡™ g βˆ˜β‡˜π’žβ‡™ f β‰ˆβ‡˜π’žβ‡™ h βˆ˜β‡˜π’žβ‡™ (g βˆ˜β‡˜π’žβ‡™ f)"
by (rule assms(9), auto simp add: hom_def 2 1)
qed
lemma CategoryE:
"Category π’ž ⟹
(setoid (Arr π’ž) ⟹
(β‹€f. f ∈ Arr π’ž ⟹ Dom π’ž f ∈ Obj π’ž) ⟹ (β‹€f. f ∈ Arr π’ž ⟹ Cod π’ž f ∈ Obj π’ž) ⟹
(β‹€A. A ∈ Obj π’ž ⟹ Id π’ž A ∈ Hom[π’ž][A,A]) ⟹
(β‹€A B C f g. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; f ∈ Hom[π’ž][A,B]; g ∈ Hom[π’ž][B,C] ⟧ ⟹ g βˆ˜β‡˜π’žβ‡™ f ∈ Hom[π’ž][A,C]) ⟹
(β‹€A B C f g h i. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; f ∈ Hom[π’ž][B,C]; g ∈ Hom[π’ž][B,C]; h ∈ Hom[π’ž][A,B]; i ∈ Hom[π’ž][A,B]; f β‰ˆβ‡˜π’žβ‡™ g; h β‰ˆβ‡˜π’žβ‡™ i ⟧ ⟹ f βˆ˜β‡˜π’žβ‡™ h β‰ˆβ‡˜π’žβ‡™ g βˆ˜β‡˜π’žβ‡™ i) ⟹
thesis)
⟹ thesis"
by (unfold Category_def hom_def, auto)
lemma CategoryE_hom_refl: "⟦ Category π’ž; f ∈ Hom[π’ž][A,B] ⟧ ⟹ f β‰ˆβ‡˜π’žβ‡™ f"
by (simp add: hom_def Category.arr_refl)
lemma CategoryE_hom_sym: "⟦ Category π’ž; f β‰ˆβ‡˜π’žβ‡™ g ⟧ ⟹ g β‰ˆβ‡˜π’žβ‡™ f"
by (simp add: hom_def Category.arr_sym)
lemma CategoryE_hom_trans: "⟦ Category π’ž; f β‰ˆβ‡˜π’žβ‡™ g; g β‰ˆβ‡˜π’žβ‡™ h ⟧ ⟹ f β‰ˆβ‡˜π’žβ‡™ h"
by (rule Category.arr_trans, auto simp add: hom_def)
lemma CategoryE_id_exist:
assumes "Category π’ž"
shows "A ∈ Obj π’ž ⟹ Id π’ž A ∈ Hom[π’ž][A,A]"
by (metis CategoryE [OF assms])
lemma CategoryE_comp_exist:
assumes "Category π’ž"
shows "β‹€A B C f g. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; f ∈ Hom[π’ž][A,B]; g ∈ Hom[π’ž][B,C] ⟧ ⟹ g βˆ˜β‡˜π’žβ‡™ f ∈ Hom[π’ž][A,C]"
by (metis CategoryE [OF assms])
lemma CategoryE_comp_equal:
assumes "Category π’ž"
shows "β‹€A B C f g h i. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; f ∈ Hom[π’ž][B,C]; g ∈ Hom[π’ž][B,C]; h ∈ Hom[π’ž][A,B]; i ∈ Hom[π’ž][A,B]; f β‰ˆβ‡˜π’žβ‡™ g; h β‰ˆβ‡˜π’žβ‡™ i ⟧ ⟹ f βˆ˜β‡˜π’žβ‡™ h β‰ˆβ‡˜π’žβ‡™ g βˆ˜β‡˜π’žβ‡™ i"
by (rule CategoryE [OF assms], simp)
lemma CategoryE_left_id:
assumes "Category π’ž"
shows "(β‹€A B f. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; f ∈ Hom[π’ž][A,B] ⟧ ⟹ Id π’ž B βˆ˜β‡˜π’žβ‡™ f β‰ˆβ‡˜π’žβ‡™ f)"
using Category.left_id [OF assms] by (auto simp add: hom_def)
lemma CategoryE_right_id:
assumes "Category π’ž"
shows "(β‹€A B f. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; f ∈ Hom[π’ž][A,B] ⟧ ⟹ f β‰ˆβ‡˜π’žβ‡™ f βˆ˜β‡˜π’žβ‡™ Id π’ž A)"
using Category.right_id [OF assms] by (auto simp add: hom_def)
lemma CategoryE_assoc:
assumes "Category π’ž"
shows "β‹€A B C D f g h. ⟦ A ∈ Obj π’ž; B ∈ Obj π’ž; C ∈ Obj π’ž; D ∈ Obj π’ž; f ∈ Hom[π’ž][A,B]; g ∈ Hom[π’ž][B,C]; h ∈ Hom[π’ž][C,D] ⟧ ⟹ (h βˆ˜β‡˜π’žβ‡™ g) βˆ˜β‡˜π’žβ‡™ f β‰ˆβ‡˜π’žβ‡™ h βˆ˜β‡˜π’žβ‡™ (g βˆ˜β‡˜π’žβ‡™ f)"
using Category.assoc [OF assms] by (simp add: hom_def)
definition opposite ("_ {^op}") 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})"
proof (rule CategoryI, auto simp add: opposite_def)
show "setoid (Arr π’ž)"
using assms by (unfold Category_def, auto)
next
fix f
{ assume a: "f ∈ carrier (Arr π’ž)" show "Cod π’ž f ∈ Obj π’ž" by (rule Category.cod_obj [OF assms a]) }
{ assume a: "f ∈ carrier (Arr π’ž)" show "Dom π’ž f ∈ Obj π’ž" by (rule Category.dom_obj [OF assms a]) }
next
fix A
assume a: "A ∈ Obj π’ž"
show "idβ‡˜π’žβ‡™ A ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,A]"
by (simp add: hom_def Category.id_exist [OF assms a])
next
fix A B C f g
assume a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "C ∈ Obj π’ž"
and "f ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,B]"
and "g ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][B,C]"
thus "f βˆ˜β‡˜π’žβ‡™ g ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,C]"
by (simp add: hom_def Category.comp_exist [OF assms])
next
fix A B C A' B' C' f g h i
assume "A ∈ Obj π’ž" "B ∈ Obj π’ž" "C ∈ Obj π’ž"
and "f ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][B,C]"
and "g ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][B,C]"
and "h ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,B]"
and "i ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,B]"
and "f β‰ˆβ‡˜π’žβ‡™ g" "h β‰ˆβ‡˜π’žβ‡™ i"
thus"h βˆ˜β‡˜π’žβ‡™ f β‰ˆβ‡˜π’žβ‡™ i βˆ˜β‡˜π’žβ‡™ g"
using Category.comp_equal [of π’ž h i f g] by (simp add: hom_def assms)
next
fix A B f
assume a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "f ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,B]"
hence 1: "f ∈ Hom[π’ž][B,A]" by (simp add: hom_def)
show "f βˆ˜β‡˜π’žβ‡™ idβ‡˜π’žβ‡™ B β‰ˆβ‡˜π’žβ‡™ f"
by (rule CategoryE_hom_sym [OF assms], rule CategoryE_right_id [OF assms a(2) a(1) 1])
next
fix A B f
assume a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "f ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,B]"
hence 1: "f ∈ Hom[π’ž][B,A]" by (simp add: hom_def)
show "f β‰ˆβ‡˜π’žβ‡™ idβ‡˜π’žβ‡™ A βˆ˜β‡˜π’žβ‡™ f"
by (rule CategoryE_hom_sym [OF assms], rule CategoryE_left_id [OF assms a(2) a(1) 1])
next
fix A B C D f g h
assume a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "C ∈ Obj π’ž" "D ∈ Obj π’ž"
and "f ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][A,B]"
and "g ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][B,C]"
and "h ∈ Hom[⦇Obj = Obj π’ž, Arr = Arr π’ž, Dom = Cod π’ž, Cod = Dom π’ž, Id = Category.Id π’ž, comp = Ξ»f g. g βˆ˜β‡˜π’žβ‡™ f⦈][C,D]"
hence 1: "f ∈ Hom[π’ž][B,A]" "g ∈ Hom[π’ž][C,B]" "h ∈ Hom[π’ž][D,C]" by (auto simp add: hom_def)
show "f βˆ˜β‡˜π’žβ‡™ (g βˆ˜β‡˜π’žβ‡™ h) β‰ˆβ‡˜π’žβ‡™ f βˆ˜β‡˜π’žβ‡™ g βˆ˜β‡˜π’žβ‡™ h"
by (rule CategoryE_hom_sym [OF assms], rule CategoryE_assoc [OF assms a(4) a(3) a(2) a(1) 1(3) 1(2) 1(1)])
qed
record ('a,'b) setmap =
setdom :: "'a setoid"
setcod :: "'b setoid"
setfunction :: "'a β‡’ 'b"
locale setmap =
fixes f :: "('a,'b,'f) setmap_scheme"
assumes mapping: "β‹€x. x ∈ setdom f ⟹ setfunction f x ∈ setcod f"
and dom_setoid: "setoid (setdom f)"
and cod_setoid: "setoid (setcod f)"
and preserve_equal: "β‹€x y. equal (setdom f) x y ⟹ equal (setcod f) (setfunction f x) (setfunction f y)"
lemma setmap_cod_equiv: "setmap f ⟹ equiv (setcod f) {(x,y). equal (setcod f) x y}"
using setoid.equal_equiv [OF setmap.cod_setoid [of f]] by simp
lemma setmap_cod_refl: "setmap f ⟹ x ∈ setcod f ⟹ equal (setcod f) x x"
by (rule equiv_reflp, rule setmap_cod_equiv, auto)
lemma setmap_cod_sym: "setmap f ⟹ equal (setcod f) x y ⟹ equal (setcod f) y x"
by (rule equiv_symp, rule setmap_cod_equiv, auto)
lemma setmap_cod_trans: "setmap f ⟹ equal (setcod f) x y ⟹ equal (setcod f) y z ⟹ equal (setcod f) x z"
by (rule equiv_transp, rule setmap_cod_equiv, auto)
definition setmap_eq where
"setmap_eq f g ≑ ((setdom f = setdom g) ∧ (setcod f = setcod g)
∧ (βˆ€x ∈ setdom f. equal (setcod f) (setfunction f x) (setfunction g x)))"
lemma setmap_eqI: "⟦ setdom f = setdom g; setcod f = setcod g; (β‹€x. x ∈ setdom f ⟹ equal (setcod f) (setfunction f x) (setfunction g x)) ⟧
⟹ setmap_eq f g"
by (simp add: setmap_eq_def)
definition setmap_comp ("_ ∘[setmap] _" 80) where
"g ∘[setmap] f ≑ ⦇ setdom = setdom f, setcod = setcod g, setfunction = (Ξ»x. setfunction g (setfunction f x)) ⦈"
lemma setmap_comp_setmap:
assumes "setmap g" "setmap f" "setcod f = setdom g"
shows "setmap (g ∘[setmap] f)"
apply (unfold setmap_comp_def setmap_def, auto)
using assms by (auto simp add: setmap_def)
definition idsetmap where
"idsetmap A ≑ ⦇ setdom = A, setcod = A, setfunction = (Ξ»x. x) ⦈"
lemma id_setmap: "setoid A ⟹ setmap (idsetmap A)"
by (unfold idsetmap_def setmap_def, auto)
definition Setoid where
"Setoid ≑ ⦇
Obj = {A. setoid A},
Arr = ⦇ carrier = {f. setmap f}, equal = (Ξ»f g. setmap f ∧ setmap g ∧ setmap_eq f g) ⦈,
Dom = setdom,
Cod = setcod,
Id = idsetmap,
comp = setmap_comp
⦈"
lemma Setoid_Category: "Category Setoid"
proof (rule CategoryI)
show "setoid (Arr Setoid)"
proof (unfold Setoid_def setoid_def, auto, rule equivI)
show "refl_on (Collect setmap) {(x, y). setmap x ∧ setmap y ∧ setmap_eq x y}"
apply (rule refl_onI, auto, unfold setmap_eq_def, auto)
by (rule setmap_cod_refl, auto simp add: setmap_def)
show "sym {(x, y). setmap x ∧ setmap y ∧ setmap_eq x y}"
apply (rule symI, auto simp add: setmap_eq_def)
by (rule setmap_cod_sym, auto simp add: setmap_def)
show "transP (λx y. setmap x ∧ setmap y ∧ setmap_eq x y)"
apply (rule transI, auto simp add: setmap_eq_def)
by (rule setmap_cod_trans, auto simp add: setmap_def)
qed
next
fix f :: "('a,'a) setmap"
assume "f ∈ carrier (Arr Setoid)" thus "Dom Setoid f ∈ Obj Setoid"
apply (unfold Setoid_def, auto) by (metis setmap.dom_setoid)
next
fix f :: "('a,'a) setmap"
assume "f ∈ carrier (Arr Setoid)" thus "Cod Setoid f ∈ Obj Setoid"
apply (unfold Setoid_def, auto) by (metis setmap.cod_setoid)
next
fix A :: "'a setoid"
assume "A ∈ Obj Setoid" thus "idβ‡˜Setoid⇙ A ∈ Hom[Setoid][A,A]"
by (unfold Setoid_def hom_def, simp, simp add: id_setmap, simp add: idsetmap_def)
next
fix A B C :: "'a setoid" and f g
assume "A ∈ Obj Setoid" "B ∈ Obj Setoid" "C ∈ Obj Setoid" "f ∈ Hom[Setoid][A,B]" "g ∈ Hom[Setoid][B,C]"
thus "g βˆ˜β‡˜Setoid⇙ f ∈ Hom[Setoid][A,C]"
by (unfold Setoid_def hom_def, simp add: setmap_comp_setmap, unfold setmap_comp_def, auto)
next
fix A B C :: "'a setoid" and f g h i
assume a: "A ∈ Obj Setoid" "B ∈ Obj Setoid" "C ∈ Obj Setoid"
and b: "f ∈ Hom[Setoid][B,C]" "g ∈ Hom[Setoid][B,C]" "h ∈ Hom[Setoid][A,B]" "i ∈ Hom[Setoid][A,B]"
and c: "f β‰ˆβ‡˜Setoid⇙ g" "h β‰ˆβ‡˜Setoid⇙ i"
have b2: "setmap f" "setmap g" "setmap h" "setmap i"
using b by (auto simp add: Setoid_def hom_def)
have h: "setmap_eq (f ∘[setmap] h) (g ∘[setmap] i)"
apply (unfold setmap_eq_def, auto)
using b(3) b(4) apply (simp add: setmap_comp_def hom_def Setoid_def)
using b(1) b(2) apply (simp add: setmap_comp_def hom_def Setoid_def)
apply (simp add: setmap_comp_def)
apply (rule setmap_cod_trans, rule b2(1))
apply (rule setmap.preserve_equal [of f], rule b2(1))
using b c(2) apply (simp add: Setoid_def hom_def setmap_eq_def, fastforce)
using b c(1) apply (simp add: Setoid_def hom_def setmap_eq_def setmap_def, fastforce)
done
show "f βˆ˜β‡˜Setoid⇙ h β‰ˆβ‡˜Setoid⇙ g βˆ˜β‡˜Setoid⇙ i"
apply (unfold Setoid_def hom_def, auto)
apply (rule setmap_comp_setmap, rule b2, rule b2) using b apply (simp add: hom_def Setoid_def)
apply (rule setmap_comp_setmap, rule b2, rule b2) using b apply (simp add: hom_def Setoid_def)
apply (rule h)
done
next
fix A B :: "'a setoid" and f
assume "A ∈ Obj Setoid" "B ∈ Obj Setoid" "f ∈ Hom[Setoid][A,B]"
thus "idβ‡˜Setoid⇙ B βˆ˜β‡˜Setoid⇙ f β‰ˆβ‡˜Setoid⇙ f"
apply (unfold Setoid_def hom_def, simp)
apply (rule, rule setmap_comp_setmap, rule id_setmap, simp, simp, simp add: idsetmap_def)
apply (simp add: idsetmap_def setmap_eq_def setmap_comp_def, auto)
apply (rule setmap_cod_refl, auto simp add: Setoid_def hom_def setmap_def)
done
next
fix A B :: "'a setoid" and f
assume "A ∈ Obj Setoid" "B ∈ Obj Setoid" "f ∈ Hom[Setoid][A,B]"
thus "f β‰ˆβ‡˜Setoid⇙ f βˆ˜β‡˜Setoid⇙ idβ‡˜Setoid⇙ A"
apply (unfold Setoid_def hom_def, simp)
apply (rule, rule setmap_comp_setmap, simp, rule id_setmap, simp, simp add: idsetmap_def)
apply (simp add: idsetmap_def setmap_eq_def setmap_comp_def, auto)
apply (rule setmap_cod_refl, auto simp add: Setoid_def hom_def setmap_def)
done
next
fix A B C D :: "'a setoid" and f g h
assume "A ∈ Obj Setoid" "B ∈ Obj Setoid" "C ∈ Obj Setoid" "D ∈ Obj Setoid"
and "f ∈ Hom[Setoid][A,B]" "g ∈ Hom[Setoid][B,C]" "h ∈ Hom[Setoid][C,D]"
thus "h βˆ˜β‡˜Setoid⇙ g βˆ˜β‡˜Setoid⇙ f β‰ˆβ‡˜Setoid⇙ h βˆ˜β‡˜Setoid⇙ (g βˆ˜β‡˜Setoid⇙ f)"
apply (unfold Setoid_def hom_def, auto)
apply (auto simp add: setmap_comp_def setmap_def setmap_eq_def)
apply (rule setmap_cod_refl, auto simp add: Setoid_def hom_def)
done
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 fobj_mapping: "X ∈ Obj (domCat F) ⟹ fobj F X ∈ Obj (codCat F)"
and fmap_mapping: "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: "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"
and preserve_equal: "⟦ f ∈ Arr (domCat F); g ∈ Arr (domCat F); Dom (domCat F) f = Dom (domCat F) g; Cod (domCat F) f = Cod (domCat F) g; f β‰ˆβ‡˜domCat F⇙ g ⟧
⟹ fmap F f β‰ˆβ‡˜codCat F⇙ fmap F g"
abbreviation Functor_type ("Functor' _ : _ ⟢ _" 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]) ⟹
(X ∈ Obj π’ž ⟹ fmap F (Id π’ž X) β‰ˆβ‡˜π’Ÿβ‡™ Id π’Ÿ (fobj F X)) ⟹
(f ∈ Hom[π’ž][A,B] ⟹ g ∈ Hom[π’ž][B,C] ⟹ fmap F (g βˆ˜β‡˜π’žβ‡™ f) β‰ˆβ‡˜π’Ÿβ‡™ fmap F g βˆ˜β‡˜π’Ÿβ‡™ fmap F f) ⟹
(A ∈ Obj π’ž ⟹ B ∈ Obj π’ž ⟹ f ∈ Hom[π’ž][A,B] ⟹ g ∈ Hom[π’ž][A,B] ⟹ f β‰ˆβ‡˜π’žβ‡™ g ⟹ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ fmap F g) ⟹
thesis) ⟹ thesis"
by (auto simp add: Functor_def hom_def)
lemma FunctorE_cod_category: "Functor' F : π’ž ⟢ π’Ÿ ⟹ Category π’Ÿ" by (metis FunctorE)
lemma FunctorE_fobj: "Functor' F : π’ž ⟢ π’Ÿ ⟹ X ∈ Obj π’ž ⟹ fobj F X ∈ Obj π’Ÿ" by (metis FunctorE)
lemma FunctorE_fmap: "Functor' F : π’ž ⟢ π’Ÿ ⟹ f ∈ Hom[π’ž][A,B] ⟹ fmap F f ∈ Hom[π’Ÿ][fobj F A,fobj F B]" by (metis FunctorE)
lemma FunctorE_preserver_id: "Functor' F : π’ž ⟢ π’Ÿ ⟹ X ∈ Obj π’ž ⟹ fmap F (Id π’ž X) β‰ˆβ‡˜π’Ÿβ‡™ Id π’Ÿ (fobj F X)" by (metis FunctorE)
lemma FunctorE_preserver_comp: "Functor' F : π’ž ⟢ π’Ÿ ⟹ f ∈ Hom[π’ž][A,B] ⟹ g ∈ Hom[π’ž][B,C] ⟹ fmap F (g βˆ˜β‡˜π’žβ‡™ f) β‰ˆβ‡˜π’Ÿβ‡™ fmap F g βˆ˜β‡˜π’Ÿβ‡™ fmap F f" by (metis FunctorE)
lemma FunctorE_preserver_equal: "Functor' F : π’ž ⟢ π’Ÿ ⟹ A ∈ Obj π’ž ⟹ B ∈ Obj π’ž ⟹ f ∈ Hom[π’ž][A,B] ⟹ g ∈ Hom[π’ž][A,B] ⟹ f β‰ˆβ‡˜π’žβ‡™ g ⟹ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ fmap F g" by (metis FunctorE)
lemma FunctorI:
fixes F :: "('o,'a,'c,'o2,'a2,'d,'f) Functor_scheme"
assumes "Category π’ž" "Category π’Ÿ"
and "domCat F = π’ž" "codCat F = π’Ÿ"
and "β‹€X. X ∈ Obj π’ž ⟹ fobj F X ∈ Obj π’Ÿ"
and "β‹€A B f. f ∈ Hom[π’ž][A,B] ⟹ fmap F f ∈ Hom[π’Ÿ][fobj F A,fobj F B]"
and "β‹€X. X ∈ Obj π’ž ⟹ fmap F (Id π’ž X) β‰ˆβ‡˜π’Ÿβ‡™ Id π’Ÿ (fobj F X)"
and "β‹€A B C f g. A ∈ Obj π’ž ⟹ B ∈ Obj π’ž ⟹ C ∈ Obj π’ž ⟹ f ∈ Hom[π’ž][A,B] ⟹ g ∈ Hom[π’ž][B,C] ⟹ fmap F (g βˆ˜β‡˜π’žβ‡™ f) β‰ˆβ‡˜π’Ÿβ‡™ fmap F g βˆ˜β‡˜π’Ÿβ‡™ fmap F f"
and "β‹€A B f g. A ∈ Obj π’ž ⟹ B ∈ Obj π’ž ⟹ f ∈ Hom[π’ž][A,B] ⟹ g ∈ Hom[π’ž][A,B] ⟹ f β‰ˆβ‡˜π’žβ‡™ g ⟹ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ fmap F g"
shows "Functor' F : π’ž ⟢ π’Ÿ"
apply (unfold Functor_def, auto simp add: assms(3) assms(4))
apply (rule assms(1), rule assms(2), simp add: assms(5))
using assms(6) apply (simp add: hom_def)
using assms(6) apply (simp add: hom_def)
using assms(6) apply (simp add: hom_def)
apply (simp add: assms(7))
using assms(8) apply (simp add: hom_def)
apply (metis Category.cod_obj Category.dom_obj assms(1))
using assms(9) apply (simp add: hom_def)
apply (metis Category.cod_obj Category.dom_obj assms(1))
done
definition idFunctor where
"idFunctor π’ž ≑ ⦇ domCat = π’ž, codCat = π’ž, fobj = Ξ»X. X, fmap = Ξ»f. f ⦈"
lemma id_Functor:
assumes "Category π’ž"
shows "Functor' (idFunctor π’ž) : π’ž ⟢ π’ž"
apply (rule FunctorI, unfold idFunctor_def, auto, rule assms, rule assms)
apply (rule CategoryE_hom_refl [OF assms], rule CategoryE [OF assms], auto)
apply (rule CategoryE_hom_refl [OF assms])
apply (rule CategoryE_comp_exist [OF assms], auto simp add: hom_def)
done
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 Ξ·)"
and cod_functor: "Functor (codFunctor Ξ·)"
and component_mapping: "X ∈ Obj (domCat (domFunctor η))
⟹ component η X ∈ Hom[codCat (domFunctor η)][fobj (domFunctor η) X, fobj (codFunctor η) X]"
and naturality: "f ∈ Arr (domCat (domFunctor η)) ⟹
(component Ξ· (Cod (domCat (domFunctor Ξ·)) f) βˆ˜β‡˜codCat (domFunctor Ξ·)⇙ fmap (domFunctor Ξ·) f) β‰ˆβ‡˜codCat (domFunctor Ξ·)⇙
(fmap (codFunctor Ξ·) f βˆ˜β‡˜codCat (domFunctor Ξ·)⇙ component Ξ· (Dom (domCat (domFunctor Ξ·)) f))"
abbreviation Nat_type ("Nat' _ : _ ⟢ _" [81] 90) where
"Nat' Ξ· : F ⟢ G ≑ Nat Ξ· & Nat.domFunctor Ξ· = F & Nat.codFunctor Ξ· = G"
lemma NatI:
fixes Ξ· :: "('o,'a,'c,'o2,'a2,'d,'f,'f2,'n) Nat_scheme"
assumes "Functor' F : π’ž ⟢ π’Ÿ" "Functor' G : π’ž ⟢ π’Ÿ"
and "domFunctor Ξ· = F" "codFunctor Ξ· = G"
and "β‹€X. X ∈ Obj π’ž ⟹ component Ξ· X ∈ Hom[π’Ÿ][fobj F X, fobj G X]"
and "β‹€A B f. A ∈ Obj π’ž ⟹ B ∈ Obj π’ž ⟹ f ∈ Hom[π’ž][A,B] ⟹ (component Ξ· B βˆ˜β‡˜π’Ÿβ‡™ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ fmap G f βˆ˜β‡˜π’Ÿβ‡™ component Ξ· A)"
shows "Nat' η : F ⟢ G"
apply (unfold Nat_def, auto simp add: assms hom_def)
using assms(5) apply (simp add: hom_def)
using assms(5) apply (simp add: hom_def)
using assms(5) apply (simp add: hom_def)
using assms(6)
by (metis (mono_tags, lifting) Category.cod_obj Category.dom_obj Functor.dom_category assms(2) hom_def mem_Collect_eq setoid.select_convs(1))
lemma NatE: "Nat' η : F ⟢ G ⟹
(Functor F ⟹ Functor G ⟹
domCat F = domCat G ⟹ codCat F = codCat G ⟹
(X ∈ Obj (domCat F) ⟹ component η X ∈ Hom[codCat F][fobj F X,fobj G X]) ⟹
(X ∈ Obj (domCat G) ⟹ component η X ∈ Hom[codCat G][fobj F X,fobj G X]) ⟹
thesis) ⟹ thesis"
by (simp add: Nat_def hom_def, auto)
lemma NatE_component: "⟦ Nat' η : F ⟢ G; A ∈ Obj (domCat F) ⟧ ⟹ component η A ∈ Hom[codCat F][fobj F A,fobj G A]"
by (metis NatE)
lemma NatE_naturality: "⟦ Nat' Ξ· : F ⟢ G; f ∈ Hom[domCat F][A,B] ⟧ ⟹ (component Ξ· B βˆ˜β‡˜codCat F⇙ fmap F f) β‰ˆβ‡˜codCat F⇙ (fmap G f βˆ˜β‡˜codCat F⇙ component Ξ· A)"
by (simp add: Nat_def hom_def, auto)
definition idNat where
"idNat F ≑ ⦇ domFunctor = F, codFunctor = F, component = Ξ»X. Id (codCat F) (fobj F X) ⦈"
lemma id_Nat:
assumes "Functor' F : π’ž ⟢ π’Ÿ"
shows "Nat' (idNat F) : F ⟢ F"
apply (rule NatI, simp add: assms, simp add: assms, unfold idNat_def, auto)
apply (simp add: assms)
apply (rule CategoryE_id_exist [OF FunctorE_cod_category [OF assms]])
apply (rule FunctorE_fobj [OF assms], simp)
proof (simp add: assms)
fix A B f
assume "A ∈ Obj π’ž" "B ∈ Obj π’ž" "f ∈ Hom[π’ž][A,B]"
show "idβ‡˜π’Ÿβ‡™ fobj F B βˆ˜β‡˜π’Ÿβ‡™ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ fmap F f βˆ˜β‡˜π’Ÿβ‡™ idβ‡˜π’Ÿβ‡™ fobj F A"
proof-
have "idβ‡˜π’Ÿβ‡™ fobj F B βˆ˜β‡˜π’Ÿβ‡™ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ fmap F f"
apply (rule CategoryE_left_id [OF FunctorE_cod_category [OF assms]])
apply (rule FunctorE_fobj [OF assms `A ∈ Obj π’ž`])
apply (rule FunctorE_fobj [OF assms `B ∈ Obj π’ž`])
apply (rule FunctorE_fmap [OF assms `f ∈ Hom[π’ž][A,B]`]) done
moreover have "… β‰ˆβ‡˜π’Ÿβ‡™ fmap F f βˆ˜β‡˜π’Ÿβ‡™ idβ‡˜π’Ÿβ‡™ fobj F A"
apply (rule CategoryE_right_id [OF FunctorE_cod_category [OF assms]])
apply (rule FunctorE_fobj [OF assms `A ∈ Obj π’ž`])
apply (rule FunctorE_fobj [OF assms `B ∈ Obj π’ž`])
apply (rule FunctorE_fmap [OF assms `f ∈ Hom[π’ž][A,B]`]) done
ultimately
show ?thesis
using CategoryE_hom_trans [OF FunctorE_cod_category [OF assms]] by blast
qed
qed
definition compNat ("_ ∘[Nat] _") where
"compNat Ξ· Ξ΅ ≑ ⦇
domFunctor = domFunctor Ξ΅, codFunctor = codFunctor Ξ·,
component = Ξ»X. component Ξ· X βˆ˜β‡˜codCat (domFunctor Ξ·)⇙ component Ξ΅ X ⦈"
lemma compNat_Nat:
assumes "Nat' η : F ⟢ G" "Nat' Ρ : G ⟢ H"
shows "Nat' (Ρ ∘[Nat] η) : F ⟢ H"
apply (rule NatI)
apply (rule NatE [OF assms(1)], simp)
apply (rule NatE [OF assms(2)], simp)
apply (unfold compNat_def, auto simp add: assms)
proof-
def π’ž ≑ "domCat F"
def π’Ÿ ≑ "codCat F"
have F: "Functor' F : π’ž ⟢ π’Ÿ" by (simp add: π’ž_def π’Ÿ_def, rule NatE [OF assms(1)], simp)
have G: "Functor' G : π’ž ⟢ π’Ÿ" by (simp add: π’ž_def π’Ÿ_def, rule NatE [OF assms(1)], simp)
have H: "Functor' H : π’ž ⟢ π’Ÿ" by (rule NatE [OF assms(2)], simp add: G)
have π’ž_cat: "Category π’ž" by (unfold π’ž_def, rule NatE [OF assms(1)], rule FunctorE, auto)
have π’Ÿ_cat: "Category π’Ÿ" by (unfold π’Ÿ_def, rule NatE [OF assms(1)], rule FunctorE_cod_category, auto)
{
fix X
assume "X ∈ Obj (domCat G)" thus "component Ξ΅ X βˆ˜β‡˜codCat G⇙ component Ξ· X ∈ Hom[codCat G][fobj F X,fobj H X]"
proof (simp add: G)
assume a: "X ∈ Obj π’ž"
show "component Ξ΅ X βˆ˜β‡˜π’Ÿβ‡™ component Ξ· X ∈ Hom[π’Ÿ][fobj F X,fobj H X]"
apply (rule CategoryE_comp_exist [OF π’Ÿ_cat FunctorE_fobj [OF F a] FunctorE_fobj [OF G a] FunctorE_fobj [OF H a]])
using NatE_component [OF assms(1)] apply (simp add: F a)
using NatE_component [OF assms(2)] apply (simp add: G a)
done
qed
}
{
fix A B f
assume "A ∈ Obj (domCat G)" "B ∈ Obj (domCat G)" "f ∈ Hom[domCat G][A,B]"
thus "component Ξ΅ B βˆ˜β‡˜codCat G⇙ component Ξ· B βˆ˜β‡˜codCat G⇙ fmap F f β‰ˆβ‡˜codCat G⇙
fmap H f βˆ˜β‡˜codCat G⇙ (component Ξ΅ A βˆ˜β‡˜codCat G⇙ component Ξ· A)"
proof (simp add: G)
assume a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "f ∈ Hom[π’ž][A,B]"
have Ff: "fmap F f ∈ Hom[π’Ÿ][fobj F A, fobj F B]"
by (rule FunctorE_fmap [OF F], rule a(3))
have Gf: "fmap G f ∈ Hom[π’Ÿ][fobj G A, fobj G B]"
by (rule FunctorE_fmap [OF G], rule a(3))
have Hf: "fmap H f ∈ Hom[π’Ÿ][fobj H A, fobj H B]"
by (rule FunctorE_fmap [OF H], rule a(3))
have Ξ΅X: "β‹€X. X ∈ Obj π’ž ⟹ component Ξ΅ X ∈ Hom[π’Ÿ][fobj G X, fobj H X]"
using NatE_component [OF assms(2)] by (simp add: G a(2))
have Ξ·X: "β‹€X. X ∈ Obj π’ž ⟹ component Ξ· X ∈ Hom[π’Ÿ][fobj F X, fobj G X]"
using NatE_component [OF assms(1)] by (simp add: F a(2))
have 1: "(component Ξ΅ B βˆ˜β‡˜π’Ÿβ‡™ component Ξ· B) βˆ˜β‡˜π’Ÿβ‡™ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ component Ξ΅ B βˆ˜β‡˜π’Ÿβ‡™ (component Ξ· B βˆ˜β‡˜π’Ÿβ‡™ fmap F f)"
apply (rule CategoryE_assoc [OF π’Ÿ_cat _ _ _ _ Ff Ξ·X Ξ΅X])
apply (auto simp add: a FunctorE_fobj F G H) done
have 2: "… β‰ˆβ‡˜π’Ÿβ‡™ component Ξ΅ B βˆ˜β‡˜π’Ÿβ‡™ (fmap G f βˆ˜β‡˜π’Ÿβ‡™ component Ξ· A)"
apply (rule CategoryE_comp_equal [OF π’Ÿ_cat _ _ _ Ξ΅X Ξ΅X], rule FunctorE_fobj [OF F], rule a(1))
apply (auto simp add: FunctorE_fobj G H a)
apply (rule CategoryE_comp_exist [OF π’Ÿ_cat FunctorE_fobj [OF F a(1)] FunctorE_fobj [OF F a(2)] FunctorE_fobj [OF G a(2)]])
apply (auto simp add: Ff Ξ·X [OF a(2)])
apply (rule CategoryE_comp_exist [OF π’Ÿ_cat FunctorE_fobj [OF F a(1)] FunctorE_fobj [OF G a(1)] FunctorE_fobj [OF G a(2)]])
apply (auto simp add: Gf Ξ·X [OF a(1)])
apply (rule CategoryE_hom_refl [OF π’Ÿ_cat], rule Ξ΅X [OF a(2)])
using NatE_naturality [OF assms(1)] apply (simp add: F a(3))
done
have 3: "… β‰ˆβ‡˜π’Ÿβ‡™ (component Ξ΅ B βˆ˜β‡˜π’Ÿβ‡™ fmap G f) βˆ˜β‡˜π’Ÿβ‡™ component Ξ· A"
apply (rule CategoryE_hom_sym [OF π’Ÿ_cat CategoryE_assoc [OF π’Ÿ_cat _ _ _ _ Ξ·X Gf Ξ΅X]])
apply (auto simp add: FunctorE_fobj F G H a) done
have 4: "… β‰ˆβ‡˜π’Ÿβ‡™ (fmap H f βˆ˜β‡˜π’Ÿβ‡™ component Ξ΅ A) βˆ˜β‡˜π’Ÿβ‡™ component Ξ· A"
apply (rule CategoryE_comp_equal [OF π’Ÿ_cat _ _ _ _ _ Ξ·X Ξ·X], auto simp add: FunctorE_fobj F G a)
apply (rule FunctorE_fobj [OF H a(2)])
apply (rule CategoryE_comp_exist [OF π’Ÿ_cat _ _ _ Gf], auto simp add: FunctorE_fobj F G H a Ξ΅X)
apply (rule CategoryE_comp_exist [OF π’Ÿ_cat _ _ _ Ξ΅X Hf], auto simp add: FunctorE_fobj G H a)
using NatE_naturality [OF assms(2)] apply (simp add: G a(3))
apply (rule CategoryE_hom_refl [OF π’Ÿ_cat], rule Ξ·X [OF a(1)])
done
have 5: "… β‰ˆβ‡˜π’Ÿβ‡™ fmap H f βˆ˜β‡˜π’Ÿβ‡™ (component Ξ΅ A βˆ˜β‡˜π’Ÿβ‡™ component Ξ· A)"
apply (rule CategoryE_assoc [OF π’Ÿ_cat _ _ _ _ Ξ·X Ξ΅X Hf])
apply (auto simp add: FunctorE_fobj F G H a) done
show "(component Ξ΅ B βˆ˜β‡˜π’Ÿβ‡™ component Ξ· B) βˆ˜β‡˜π’Ÿβ‡™ fmap F f β‰ˆβ‡˜π’Ÿβ‡™ fmap H f βˆ˜β‡˜π’Ÿβ‡™ (component Ξ΅ A βˆ˜β‡˜π’Ÿβ‡™ component Ξ· A)"
by (rule CategoryE_hom_trans [OF π’Ÿ_cat CategoryE_hom_trans [OF π’Ÿ_cat 1 2] CategoryE_hom_trans [OF π’Ÿ_cat 3 CategoryE_hom_trans [OF π’Ÿ_cat 4 5]]])
qed
}
qed
definition Nat_equal where
"Nat_equal Ξ· Ξ΅ ≑ (domFunctor Ξ· = domFunctor Ξ΅ ∧ codFunctor Ξ· = codFunctor Ξ΅ ∧
(βˆ€X. X ∈ Obj (domCat (domFunctor Ξ·)) ⟢ component Ξ· X β‰ˆβ‡˜codCat (domFunctor Ξ·)⇙ component Ξ΅ X))"
lemma Nat_equalI:
assumes "Nat' η : F ⟢ G" "Nat' Ρ : F ⟢ G"
and "β‹€X. X ∈ Obj (domCat F) ⟹ component Ξ· X β‰ˆβ‡˜codCat F⇙ component Ξ΅ X"
shows "Nat_equal Ξ· Ξ΅"
by (unfold Nat_equal_def, auto simp add: assms)
lemma Nat_equalE_equal:
"Nat_equal Ξ· Ξ΅ ⟹ X ∈ Obj (domCat (domFunctor Ξ·)) ⟹ component Ξ· X β‰ˆβ‡˜codCat (domFunctor Ξ·)⇙ component Ξ΅ X"
using assms by (unfold Nat_equal_def, auto)
definition FunCat ("Cat[_,_]") where
"Cat[π’ž,π’Ÿ] ≑ ⦇
Obj = {F. Functor' F : π’ž ⟢ π’Ÿ},
Arr = ⦇ carrier = {Ξ·. βˆƒF. βˆƒG. (Nat' Ξ· : F ⟢ G) ∧ (Functor' F : π’ž ⟢ π’Ÿ) ∧ (Functor' G : π’ž ⟢ π’Ÿ)},
equal = λη Ξ΅. βˆƒF. βˆƒG. (Nat_equal Ξ· Ξ΅) ∧ (Nat' Ξ· : F ⟢ G) ∧ (Nat' Ξ΅ : F ⟢ G) ∧ (Functor' F : π’ž ⟢ π’Ÿ) ∧ (Functor' G : π’ž ⟢ π’Ÿ) ⦈,
Dom = domFunctor,
Cod = codFunctor,
Id = idNat,
comp = compNat
⦈"
lemma FunCat_Category:
assumes "Category π’ž" "Category π’Ÿ"
shows "Category Cat[π’ž,π’Ÿ]"
proof (rule CategoryI)
show "setoid (Arr Cat[π’ž,π’Ÿ])"
proof (unfold setoid_def, rule equivI)
show "refl_on (carrier (Arr Cat[π’ž,π’Ÿ])) {(x, y). x β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ y}"
apply (unfold FunCat_def, auto, rule refl_onI, auto)
apply (unfold Nat_equal_def, auto)
apply (rule CategoryE_hom_refl, metis assms(2))
apply (rule NatE_component, auto)
done
show "sym {(x, y). x β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ y}"
apply (rule symI, simp add: FunCat_def, auto)
apply (rule Nat_equalI, simp, simp)
apply (rule CategoryE_hom_sym, metis assms(2), rule Nat_equalE_equal, auto)
done
show "transP op β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙"
apply (simp add: transp_trans [symmetric], rule transpI)
apply (unfold FunCat_def, simp, unfold Nat_equal_def, auto)
apply (rule CategoryE_hom_trans, metis assms(2), auto)
done
qed
next
fix f assume "f ∈ carrier (Arr Cat[π’ž,π’Ÿ])"
thus "Dom Cat[π’ž,π’Ÿ] f ∈ Obj Cat[π’ž,π’Ÿ]" by (unfold FunCat_def, simp)
next
fix f assume "f ∈ carrier (Arr Cat[π’ž,π’Ÿ])"
thus "Cod Cat[π’ž,π’Ÿ] f ∈ Obj Cat[π’ž,π’Ÿ]" by (unfold FunCat_def, auto)
next
fix A assume "A ∈ Obj Cat[π’ž,π’Ÿ]"
thus "idβ‡˜Cat[π’ž,π’Ÿ]⇙ A ∈ Hom[Cat[π’ž,π’Ÿ]][A,A]" by (unfold FunCat_def hom_def, auto, auto simp add: id_Nat)
next
fix A B C f g
assume "A ∈ Obj Cat[π’ž,π’Ÿ]" "B ∈ Obj Cat[π’ž,π’Ÿ]" "C ∈ Obj Cat[π’ž,π’Ÿ]"
and "f ∈ Hom[Cat[π’ž,π’Ÿ]][A,B]" "g ∈ Hom[Cat[π’ž,π’Ÿ]][B,C]"
thus "g βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ f ∈ Hom[Cat[π’ž,π’Ÿ]][A,C]" by (simp add: hom_def FunCat_def compNat_Nat)
next
fix A B C f g h i
assume a: "A ∈ Obj Cat[π’ž,π’Ÿ]" "B ∈ Obj Cat[π’ž,π’Ÿ]" "C ∈ Obj Cat[π’ž,π’Ÿ]"
and b: "f ∈ Hom[Cat[π’ž,π’Ÿ]][B,C]" "g ∈ Hom[Cat[π’ž,π’Ÿ]][B,C]" "h ∈ Hom[Cat[π’ž,π’Ÿ]][A,B]" "i ∈ Hom[Cat[π’ž,π’Ÿ]][A,B]"
and c: "f β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ g" "h β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ i"
have a2: "Functor' A : π’ž ⟢ π’Ÿ" "Functor' B : π’ž ⟢ π’Ÿ" "Functor' C : π’ž ⟢ π’Ÿ"
using a(1) apply (simp add: FunCat_def)
using a(2) apply (simp add: FunCat_def)
using a(3) apply (simp add: FunCat_def) done
have b2: "Nat' f : B ⟢ C" "Nat' g : B ⟢ C" "Nat' h : A ⟢ B" "Nat' i : A ⟢ B"
using b(1) apply (simp add: FunCat_def hom_def)
using b(2) apply (simp add: FunCat_def hom_def)
using b(3) apply (simp add: FunCat_def hom_def)
using b(4) apply (simp add: FunCat_def hom_def) done
have h: "β‹€A B C f g h i. ⟦ Functor' A : π’ž ⟢ π’Ÿ; Functor' B : π’ž ⟢ π’Ÿ; Functor' C : π’ž ⟢ π’Ÿ; Nat' f : B ⟢ C; Nat' g : B ⟢ C; Nat' h : A ⟢ B; Nat' i : A ⟢ B; Nat_equal f g; Nat_equal h i ⟧ ⟹ Nat_equal (f ∘[Nat] h) (g ∘[Nat] i)"
apply (rule Nat_equalI)
apply (rule compNat_Nat, simp, simp)
apply (rule compNat_Nat, simp, simp)
apply (unfold compNat_def, simp)
apply (rule CategoryE_comp_equal [OF assms(2)])
prefer 4 using NatE_component apply (rule, simp, simp, fastforce)
prefer 2 apply (rule FunctorE_fobj, simp, simp)
prefer 2 apply (rule FunctorE_fobj, simp, simp)
prefer 2 using NatE_component apply (rule, simp, simp, fastforce)
prefer 2 using NatE_component apply (rule, simp, simp, fastforce)
apply (rule FunctorE_fobj, simp, simp)
using NatE_component apply (rule, simp, simp, fastforce)
apply (unfold Nat_equal_def, auto)
done
show "f βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ h β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ g βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ i"
apply (unfold FunCat_def, auto)
apply (rule h, auto simp add: a2 b2)
using c(1) apply (simp add: FunCat_def)
using c(2) apply (simp add: FunCat_def)
using compNat_Nat [OF b2(3) b2(1)] apply simp
using compNat_Nat [OF b2(4) b2(2)] apply simp
apply (auto simp add: compNat_def a2 b2)
done
next
fix A B f
assume a: "A ∈ Obj Cat[π’ž,π’Ÿ]" "B ∈ Obj Cat[π’ž,π’Ÿ]" "f ∈ Hom[Cat[π’ž,π’Ÿ]][A,B]"
show "idβ‡˜Cat[π’ž,π’Ÿ]⇙ B βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ f β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ f"
apply (simp add: FunCat_def hom_def, auto)
defer
using compNat_Nat [of f A B "idNat B" B] a apply (simp add: hom_def FunCat_def id_Nat)
using a(3) apply (simp add: hom_def FunCat_def)
using a(3) apply (simp add: compNat_def FunCat_def hom_def)
using a(3) apply (simp add: compNat_def FunCat_def hom_def idNat_def)
using a apply (simp add: compNat_def FunCat_def hom_def idNat_def)
using a apply (simp add: compNat_def FunCat_def hom_def idNat_def)
using a apply (simp add: compNat_def FunCat_def hom_def idNat_def)
using a apply (simp add: compNat_def FunCat_def hom_def idNat_def)
using a apply (simp add: compNat_def FunCat_def hom_def idNat_def)
using a apply (simp add: compNat_def FunCat_def hom_def idNat_def)
apply (rule Nat_equalI)
apply (rule compNat_Nat) using a(3) apply (simp add: FunCat_def hom_def)
apply (rule id_Nat) using a(2) apply (simp add: FunCat_def)
using a(3) apply (simp add: FunCat_def hom_def)
apply (simp add: compNat_def idNat_def)
using a(1) a(2)
proof (simp add: FunCat_def)
fix X
assume a2: "X ∈ Obj π’ž" "Functor' A : π’ž ⟢ π’Ÿ" "Functor' B : π’ž ⟢ π’Ÿ"
show "idβ‡˜π’Ÿβ‡™ fobj B X βˆ˜β‡˜π’Ÿβ‡™ component f X β‰ˆβ‡˜π’Ÿβ‡™ component f X"
apply (rule CategoryE_left_id [OF FunctorE_cod_category [OF a2(2)]])
apply (auto simp add: FunctorE_fobj a2)
using a(3) apply (simp add: FunCat_def hom_def)
apply (rule FunctorE_fobj [OF a2(2) a2(1)])
using NatE_component [of f A B X] a a2(1) by (simp add: FunCat_def hom_def)
qed
next
fix A B f
assume a: "A ∈ Obj Cat[π’ž,π’Ÿ]" "B ∈ Obj Cat[π’ž,π’Ÿ]" "f ∈ Hom[Cat[π’ž,π’Ÿ]][A,B]"
have a2: "Functor' A : π’ž ⟢ π’Ÿ" "Functor' B : π’ž ⟢ π’Ÿ" "Nat' f : A ⟢ B"
using a(1) apply (simp add: FunCat_def)
using a(2) apply (simp add: FunCat_def)
using a(3) apply (simp add: FunCat_def hom_def) done
show "f β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ f βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ idβ‡˜Cat[π’ž,π’Ÿ]⇙ A"
apply (simp add: FunCat_def hom_def, auto)
defer
apply (simp add: a2(3))
using compNat_Nat [of "idNat A" A A f B] a apply (simp add: hom_def FunCat_def id_Nat)
apply (simp add: compNat_def idNat_def a2(3))
apply (simp add: compNat_def idNat_def a2(3))
apply (simp add: a2)+
apply (rule Nat_equalI, rule a2)
apply (rule compNat_Nat, rule id_Nat, rule a2, rule a2)
apply (simp add: a2 compNat_def idNat_def)
apply (rule CategoryE_right_id [OF assms(2)])
apply (simp add: FunctorE_fobj [OF a2(1)], rule FunctorE_fobj [OF a2(2)], simp)
using NatE_component [OF a2(3)] apply (simp add: a2)
done
next
fix A B C D f g h
assume a: "A ∈ Obj Cat[π’ž,π’Ÿ]" "B ∈ Obj Cat[π’ž,π’Ÿ]" "C ∈ Obj Cat[π’ž,π’Ÿ]" "D ∈ Obj Cat[π’ž,π’Ÿ]"
and b: "f ∈ Hom[Cat[π’ž,π’Ÿ]][A,B]" "g ∈ Hom[Cat[π’ž,π’Ÿ]][B,C]" "h ∈ Hom[Cat[π’ž,π’Ÿ]][C,D]"
have a2: "Functor' A : π’ž ⟢ π’Ÿ" "Functor' B : π’ž ⟢ π’Ÿ" "Functor' C : π’ž ⟢ π’Ÿ" "Functor' D : π’ž ⟢ π’Ÿ"
using a(1) apply (simp add: FunCat_def)
using a(2) apply (simp add: FunCat_def)
using a(3) apply (simp add: FunCat_def)
using a(4) apply (simp add: FunCat_def) done
have b2: "Nat' f : A ⟢ B" "Nat' g : B ⟢ C" "Nat' h : C ⟢ D"
using b(1) apply (simp add: FunCat_def hom_def)
using b(2) apply (simp add: FunCat_def hom_def)
using b(3) apply (simp add: FunCat_def hom_def) done
have h: "Nat_equal ((h ∘[Nat] g) ∘[Nat] f) (h ∘[Nat] (g ∘[Nat] f))"
apply (rule Nat_equalI)
apply (rule compNat_Nat, rule b2, rule compNat_Nat, rule b2, rule b2)
apply (rule compNat_Nat, rule compNat_Nat, rule b2, rule b2, rule b2)
apply (simp add: compNat_def a2 b2)
apply (rule CategoryE_assoc [OF assms(2)])
apply (rule FunctorE_fobj [OF a2(1)], simp)
apply (rule FunctorE_fobj [OF a2(2)], simp)
apply (rule FunctorE_fobj [OF a2(3)], simp)
apply (rule FunctorE_fobj [OF a2(4)], simp)
using NatE_component [OF b2(1)] apply (fastforce simp add: a2)
using NatE_component [OF b2(2)] apply (fastforce simp add: a2)
using NatE_component [OF b2(3)] apply (fastforce simp add: a2)
done
show "h βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ g βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ f β‰ˆβ‡˜Cat[π’ž,π’Ÿ]⇙ h βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ (g βˆ˜β‡˜Cat[π’ž,π’Ÿ]⇙ f)"
apply (simp add: FunCat_def, auto)
apply (rule h)
apply (metis compNat_Nat b2)
apply (metis compNat_Nat b2)
apply (auto simp add: compNat_def b2 a2)
done
qed
definition Presheaf ("PSh(_)") where
"PSh(π’ž) ≑ FunCat (π’ž {^op}) Setoid"
lemma Presheaf_Category: "Category π’ž ⟹ Category (PSh π’ž)"
by (simp add: Presheaf_def, rule FunCat_Category, simp add: opposite_Category, rule Setoid_Category)
definition contraHom ("Hom{_}[-,_]") where
"Hom{π’ž}[-,C] ≑ ⦇
domCat = π’ž {^op},
codCat = Setoid,
fobj = Ξ»X. Hom[π’ž][X,C],
fmap = Ξ»f. ⦇ setdom = Hom[π’ž][Cod π’ž f,C], setcod = Hom[π’ž][Dom π’ž f,C], setfunction = Ξ»u. (u βˆ˜β‡˜π’žβ‡™ f) ⦈
⦈"
lemma contraHom_fobj_setoid:
assumes "Category π’ž" "C ∈ Obj π’ž" "X ∈ Obj π’ž"
shows "setoid (fobj Hom{π’ž}[-,C] X)"
by (simp add: contraHom_def, rule hom_setoid [OF assms(1) assms(3) assms(2)])
lemma contraHom_fmap_setmap:
assumes "Category π’ž" "C ∈ Obj π’ž" "f ∈ Hom[π’ž][A,B]"
shows "setmap (fmap Hom{π’ž}[-,C] f)"
apply (auto simp add: contraHom_def setmap_def)
defer apply (rule hom_setoid [OF assms(1)], rule Category.cod_obj [OF assms(1)]) using assms(3) apply (simp add: hom_def, simp add: assms)
apply (rule hom_setoid [OF assms(1)], rule Category.dom_obj [OF assms(1)]) using assms(3) apply (simp add: hom_def, simp add: assms)
apply (simp add: hom_def, auto)
apply (rule CategoryE_comp_equal [OF assms(1), of A B _ _ _ f f])
using assms(3) apply (auto simp add: hom_def)
apply (metis Category.dom_obj [OF assms(1)])
apply (metis Category.cod_obj [OF assms(1)])
apply (metis Category.cod_obj [OF assms(1)])
apply (rule CategoryE_hom_refl [OF assms(1) assms(3)])
apply (metis Category.comp_exist [OF assms(1)])+
done
lemma contraHom_Functor:
assumes "Category π’ž" "C ∈ Obj π’ž"
shows "Functor' Hom{π’ž}[-,C] : π’ž {^op} ⟢ Setoid"
apply (rule FunctorI, rule opposite_Category, rule assms, rule Setoid_Category)
apply (simp add: contraHom_def, simp add: contraHom_def)
apply (simp add: contraHom_def Setoid_def setoid_set_setoid)
proof-
fix A B f
assume "f ∈ Hom[π’ž {^op}][A,B]"
hence f: "f ∈ Hom[π’ž][B,A]" by (simp add: hom_def opposite_def)
show "fmap Hom{π’ž}[-,C] f ∈ Hom[Setoid][fobj Hom{π’ž}[-,C] A,fobj Hom{π’ž}[-,C] B]"
apply (auto simp add: Setoid_def hom_def)
apply (rule contraHom_fmap_setmap [OF assms f])
apply (simp add: contraHom_def) using f apply (simp add: hom_def)
apply (simp add: contraHom_def) using f apply (simp add: hom_def)
done
next
fix X
assume "X ∈ Obj (π’ž {^op})"
hence X: "X ∈ Obj π’ž" by (simp add: opposite_def)
hence idX: "idβ‡˜π’žβ‡™ X ∈ Hom[π’ž][X,X]" by (rule CategoryE_id_exist [OF assms(1)])
show "fmap Hom{π’ž}[-,C] (idβ‡˜π’ž {^op}⇙ X) β‰ˆβ‡˜Setoid⇙ idβ‡˜Setoid⇙ fobj Hom{π’ž}[-,C] X"
apply (simp add: Setoid_def, auto)
apply (rule contraHom_fmap_setmap [OF assms])
apply (simp add: opposite_def, rule CategoryE_id_exist [OF assms(1) X])
apply (rule id_setmap, rule contraHom_fobj_setoid [OF assms X])
apply (rule setmap_eqI)
apply (simp add: contraHom_def idsetmap_def opposite_def)
using CategoryE_id_exist [OF assms(1) X] apply (simp add: hom_def)
apply (simp add: contraHom_def idsetmap_def opposite_def)
using CategoryE_id_exist [OF assms(1) X] apply (simp add: hom_def)
apply (simp add: contraHom_def opposite_def idsetmap_def)
apply (simp add: hom_def)
using CategoryE_id_exist [OF assms(1) X] apply (simp add: hom_def)
using CategoryE_hom_sym [OF assms(1) CategoryE_right_id [OF assms(1) X assms(2)]] apply (simp add: hom_def)
using CategoryE_comp_exist [OF assms(1) X X assms(2) CategoryE_id_exist [OF assms(1) X]] apply (simp add: hom_def)
done
next
fix X
assume "X ∈ Obj (π’ž {^op})" thus "setoid (Hom[π’ž][X,C])"
using hom_setoid [OF assms(1) _ assms(2)] by (simp add: opposite_def)
next
fix A B Ca f g
assume a: "A ∈ Obj (π’ž {^op})" "B ∈ Obj (π’ž {^op})" "Ca ∈ Obj (π’ž {^op})"
and b: "f ∈ carrier (Hom[π’ž {^op}][A,B])" "g ∈ carrier (Hom[π’ž {^op}][B,Ca])"
have a2: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "Ca ∈ Obj π’ž" using a by (auto simp add: opposite_def)
have b2: "f ∈ carrier (Hom[π’ž][B,A])" "g ∈ carrier (Hom[π’ž][Ca,B])" using b by (auto simp add: opposite_def hom_def)
show "fmap Hom{π’ž}[-,C] (g βˆ˜β‡˜π’ž {^op}⇙ f) β‰ˆβ‡˜Setoid⇙ fmap Hom{π’ž}[-,C] g βˆ˜β‡˜Setoid⇙ fmap Hom{π’ž}[-,C] f"
apply (simp add: Setoid_def, auto)
apply (rule contraHom_fmap_setmap [OF assms])
apply (simp add: opposite_def, rule CategoryE_comp_exist [OF assms(1) a2(3) a2(2) a2(1) b2(2) b2(1)])
apply (rule setmap_comp_setmap)
apply (rule contraHom_fmap_setmap [OF assms]) using b2 apply (simp add: hom_def)
apply (rule contraHom_fmap_setmap [OF assms]) using b2 apply (simp add: hom_def)
apply (simp add: contraHom_def) using b2 apply (simp add: hom_def)
apply (rule setmap_eqI)
apply (simp add: setmap_comp_def contraHom_def opposite_def)
using CategoryE_comp_exist [OF assms(1) a2(3) a2(2) a2(1) b2(2) b2(1)] b2(1) apply (simp add: hom_def)
apply (simp add: setmap_comp_def contraHom_def opposite_def)
using CategoryE_comp_exist [OF assms(1) a2(3) a2(2) a2(1) b2(2) b2(1)] b2(2) apply (simp add: hom_def)
apply (simp add: setmap_comp_def contraHom_def opposite_def)
using CategoryE_comp_exist [OF assms(1), of _ _ _ "f βˆ˜β‡˜π’žβ‡™ g"] b2 apply (simp add: hom_def)
using CategoryE_comp_exist [OF assms(1) a2(3) a2(2) a2(1) b2(2) b2(1)] b2 apply (simp add: hom_def)
by (simp add: Category.arr_sym Category.assoc Category.comp_exist assms(1))
next
fix A B f g
assume a: "f ∈ Hom[π’ž {^op}][A,B]" "g ∈ Hom[π’ž {^op}][A,B]" "f β‰ˆβ‡˜π’ž {^op}⇙ g"
have a2: "f ∈ Hom[π’ž][B,A]" "g ∈ Hom[π’ž][B,A]" "f β‰ˆβ‡˜π’žβ‡™ g"
using a by (auto simp add: hom_def opposite_def)
show "fmap Hom{π’ž}[-,C] f β‰ˆβ‡˜Setoid⇙ fmap Hom{π’ž}[-,C] g"
apply (simp add: Setoid_def, auto)
apply (rule contraHom_fmap_setmap [OF assms a2(1)])
apply (rule contraHom_fmap_setmap [OF assms a2(2)])
apply (rule setmap_eqI)
using a2 apply (simp add: contraHom_def hom_def)
using a2 apply (simp add: contraHom_def hom_def)
using a2 apply (simp add: contraHom_def hom_def)
by (smt Category.Category.select_convs(2) Category.arr_refl Category.comp_equal Category.comp_exist a2(3) assms(1))
qed
definition contraHomNat ("HomNat{_}[-,_]") where
"HomNat{π’ž}[-,f] ≑ ⦇
domFunctor = Hom{π’ž}[-,Dom π’ž f],
codFunctor = Hom{π’ž}[-,Cod π’ž f],
component = Ξ»x. ⦇ setdom = fobj Hom{π’ž}[-,Dom π’ž f] x, setcod = fobj Hom{π’ž}[-,Cod π’ž f] x, setfunction = Ξ»u. f βˆ˜β‡˜π’žβ‡™ u ⦈
⦈"
lemma contraHomNat_component_setmap:
assumes "Category π’ž" "f ∈ Hom[π’ž][A,B]" "x ∈ Obj π’ž" "A ∈ Obj π’ž" "B ∈ Obj π’ž"
shows "setmap (component HomNat{π’ž}[-,f] x)"
apply (simp add: contraHomNat_def setmap_def, auto)
apply (simp add: contraHom_def, rule CategoryE_comp_exist [OF assms(1) assms(3), of "Dom π’ž f"])
apply (rule Category.dom_obj [OF assms(1)]) using assms(2) apply (simp add: hom_def)
apply (rule Category.cod_obj [OF assms(1)]) using assms(2) apply (simp add: hom_def)
apply simp using assms(2) apply (simp add: hom_def)
apply (rule contraHom_fobj_setoid [OF assms(1) _ assms(3)]) using assms(2) assms(4) apply (simp add: hom_def)
apply (rule contraHom_fobj_setoid [OF assms(1) _ assms(3)]) using assms(2) assms(5) apply (simp add: hom_def)
apply (simp add: contraHom_def hom_def)
by (smt Category.comp_equal Category.comp_exist CategoryE_hom_refl CollectD assms(1) assms(2) hom_def setoid.select_convs(1))
lemma contraHomNat_Nat:
assumes "Category π’ž" "f ∈ Hom[π’ž][A,B]" "A ∈ Obj π’ž" "B ∈ Obj π’ž"
shows "Nat' HomNat{π’ž}[-,f] : Hom{π’ž}[-,A] ⟢ Hom{π’ž}[-,B]"
apply (rule NatI)
apply (rule contraHom_Functor [OF assms(1)], rule assms(3))
apply (rule contraHom_Functor [OF assms(1)], rule assms(4))
apply (simp add: contraHomNat_def) using assms(2) apply (simp add: hom_def)
apply (simp add: contraHomNat_def) using assms(2) apply (simp add: hom_def)
apply (simp add: opposite_def hom_def Setoid_def)
using assms(2) apply (simp add: contraHomNat_component_setmap [OF assms(1) _ _ assms(3) assms(4)] hom_def)
apply (simp add: contraHomNat_def opposite_def hom_def Setoid_def setmap_def)
apply (simp add: Setoid_def opposite_def hom_def, auto)
apply (rule setmap_comp_setmap, rule contraHomNat_component_setmap [OF assms(1) assms(2) _ assms(3) assms(4)], simp)
apply (rule contraHom_fmap_setmap [OF assms(1)])
using assms(2) apply (simp add: hom_def, simp add: assms)
using assms(2) apply (simp add: hom_def)
using assms(2) apply (simp add: contraHom_def contraHomNat_def hom_def)
apply (rule setmap_comp_setmap, rule contraHom_fmap_setmap [OF assms(1)])
using assms(2) apply (simp add: hom_def assms)
using assms(2) apply (simp add: hom_def)
apply (rule contraHomNat_component_setmap [OF assms(1) assms(2) _ assms(3) assms(4)])
using assms(2) apply (simp add: hom_def assms)
using assms(2) apply (simp add: contraHom_def contraHomNat_def hom_def)
apply (rule setmap_eqI)
apply (simp add: setmap_comp_def contraHom_def contraHomNat_def)
using assms(2) apply (simp add: setmap_comp_def contraHom_def contraHomNat_def hom_def)
using assms(2) apply (simp add: setmap_comp_def contraHom_def contraHomNat_def hom_def)
apply (simp add: setmap_comp_def contraHomNat_def contraHom_def hom_def)
by (smt Category.arr_sym Category.assoc Category.comp_exist CollectD assms(1) assms(2) hom_def setoid.select_convs(1))
definition yoneda where
"yoneda π’ž ≑ ⦇
domCat = π’ž,
codCat = PSh(π’ž),
fobj = contraHom π’ž,
fmap = contraHomNat π’ž
⦈"
lemma yoneda_functor:
assumes "Category π’ž"
shows "Functor' (yoneda π’ž) : π’ž ⟢ PSh(π’ž)"
apply (rule FunctorI, rule assms)
apply (rule Presheaf_Category [OF assms], simp add: yoneda_def)
apply (simp add: yoneda_def, simp add: yoneda_def Presheaf_def)
apply (simp add: yoneda_def FunCat_def, rule contraHom_Functor [OF assms], simp)
proof (unfold Presheaf_def)
fix A B f
assume f: "f ∈ Hom[π’ž][A,B]"
have AB: "A ∈ Obj π’ž" "B ∈ Obj π’ž"
using f by (auto simp add: hom_def Category.dom_obj [OF assms] Category.cod_obj [OF assms])
show "fmap (yoneda π’ž) f ∈ Hom[Cat[π’ž {^op},Setoid]][fobj (yoneda π’ž) A,fobj (yoneda π’ž) B]"
using f apply (simp add: hom_def)
apply (simp add: yoneda_def FunCat_def hom_def)
apply (simp add: contraHomNat_Nat [OF assms f AB])
apply (simp add: contraHom_Functor [OF assms AB(1)] contraHom_Functor [OF assms AB(2)])
done
next
fix X
assume X: "X ∈ Obj π’ž"
show "fmap (yoneda π’ž) (idβ‡˜π’žβ‡™ X) β‰ˆβ‡˜Cat[π’ž {^op},Setoid]⇙ idβ‡˜Cat[π’ž {^op},Setoid]⇙ fobj (yoneda π’ž) X"
apply (simp add: yoneda_def FunCat_def id_Nat [OF contraHom_Functor [OF assms]])
apply (simp add: contraHomNat_Nat [OF assms CategoryE_id_exist [OF assms X] X X])
apply (simp add: id_Nat [OF contraHom_Functor [OF assms X]])
apply (simp add: contraHom_Functor [OF assms X])
apply (rule Nat_equalI)
apply (rule contraHomNat_Nat [OF assms CategoryE_id_exist [OF assms X] X X])
apply (simp add: id_Nat [OF contraHom_Functor [OF assms X]] Category.id_exist [OF assms X])
apply (simp add: contraHom_def opposite_def idNat_def Setoid_def, auto)
apply (simp add: contraHomNat_component_setmap [OF assms CategoryE_id_exist [OF assms X] _ X X])
apply (simp add: id_setmap [OF hom_setoid [OF assms _ X]])
apply (rule setmap_eqI)
apply (simp add: contraHomNat_def idsetmap_def contraHom_def)
apply (simp add: Category.id_exist [OF assms X])
apply (simp add: contraHomNat_def idsetmap_def contraHom_def)
apply (simp add: Category.id_exist [OF assms X])
apply (simp add: contraHomNat_def contraHom_def idsetmap_def)
by (simp add: Category.comp_exist Category.id_exist CategoryE_left_id X assms hom_def)
next
fix A B C f g
assume a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "C ∈ Obj π’ž" "f ∈ Hom[π’ž][A,B]" "g ∈ Hom[π’ž][B,C]"
hence gf: "g βˆ˜β‡˜π’žβ‡™ f ∈ Hom[π’ž][A,C]"
using CategoryE_comp_exist [OF assms a] by (simp add: hom_def)
show "fmap (yoneda π’ž) (g βˆ˜β‡˜π’žβ‡™ f) β‰ˆβ‡˜Cat[π’ž {^op},Setoid]⇙ fmap (yoneda π’ž) g βˆ˜β‡˜Cat[π’ž {^op},Setoid]⇙ fmap (yoneda π’ž) f"
apply (simp add: yoneda_def FunCat_def)
apply (simp add: contraHomNat_Nat [OF assms gf a(1) a(3)])
apply rule defer
apply (simp add: contraHom_Functor [OF assms a(1)])
apply (simp add: contraHom_Functor [OF assms a(3)])
apply (rule compNat_Nat)
apply (simp add: contraHomNat_Nat [OF assms a(4) a(1) a(2)])
apply (simp add: contraHomNat_Nat [OF assms a(5) a(2) a(3)])
apply (rule Nat_equalI)
apply (rule contraHomNat_Nat [OF assms gf a(1) a(3)])
apply (rule compNat_Nat)
apply (simp add: contraHomNat_Nat [OF assms a(4) a(1) a(2)])
apply (simp add: contraHomNat_Nat [OF assms a(5) a(2) a(3)])
apply (auto simp add: contraHom_def Setoid_def opposite_def)
apply (rule contraHomNat_component_setmap [OF assms gf _ a(1) a(3)], simp)
apply (simp add: compNat_def contraHomNat_def contraHom_def Setoid_def)
apply (rule setmap_comp_setmap)
using contraHomNat_component_setmap [OF assms a(5) _ a(2) a(3)] apply (simp add: contraHomNat_def contraHom_def)
using contraHomNat_component_setmap [OF assms a(4) _ a(1) a(2)] apply (simp add: contraHomNat_def contraHom_def)
using a apply (simp add: contraHomNat_def contraHom_def hom_def)
apply (rule setmap_eqI)
apply (simp add: compNat_def contraHomNat_def contraHom_def Setoid_def setmap_comp_def)
using a gf apply (simp add: hom_def)
apply (simp add: compNat_def contraHomNat_def contraHom_def Setoid_def setmap_comp_def)
using a gf apply (simp add: hom_def)
apply (simp add: compNat_def contraHomNat_def contraHom_def Setoid_def setmap_comp_def)
by (smt Category.assoc Category.comp_exist a(4) a(5) assms hom_def mem_Collect_eq setoid.select_convs(1) setoid.select_convs(2))
next
fix A B f g
assume a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "f ∈ Hom[π’ž][A,B]" "g ∈ Hom[π’ž][A,B]" "f β‰ˆβ‡˜π’žβ‡™ g"
show "fmap (yoneda π’ž) f β‰ˆβ‡˜Cat[π’ž {^op},Setoid]⇙ fmap (yoneda π’ž) g"
apply (simp add: yoneda_def FunCat_def)
apply (simp add: contraHomNat_Nat [OF assms a(3) a(1) a(2)] contraHomNat_Nat [OF assms a(4) a(1) a(2)])
apply (simp add: contraHom_Functor [OF assms a(1)] contraHom_Functor [OF assms a(2)])
apply (rule Nat_equalI)
apply (simp add: contraHomNat_Nat [OF assms a(3) a(1) a(2)], simp add: contraHomNat_Nat [OF assms a(4) a(1) a(2)])
apply (simp add: contraHom_def Setoid_def opposite_def, auto)
apply (rule contraHomNat_component_setmap [OF assms a(3) _ a(1) a(2)], simp)
apply (rule contraHomNat_component_setmap [OF assms a(4) _ a(1) a(2)], simp)
apply (rule setmap_eqI)
apply (simp add: contraHomNat_def) using a apply (simp add: hom_def)
apply (simp add: contraHomNat_def) using a apply (simp add: hom_def)
apply (simp add: contraHomNat_def contraHom_def)
by (smt Category.comp_exist CategoryE_comp_equal CategoryE_hom_refl a(1) a(2) a(3) a(4) a(5) assms hom_def mem_Collect_eq setoid.select_convs(1) setoid.select_convs(2))
qed
definition obj_to_nat_build where
"obj_to_nat_build π’ž F C x ≑ ⦇
domFunctor = (fobj (yoneda π’ž) C),
codFunctor = F,
component = Ξ»d. ⦇ setdom = fobj (fobj (yoneda π’ž) C) d, setcod = fobj F d
, setfunction = λu. setfunction (fmap F u) x ⦈
⦈"
lemma obj_to_nat_build_component_setmap:
assumes "Category π’ž" "F ∈ Obj PSh(π’ž)" "C ∈ Obj π’ž" "x ∈ fobj F C" "X ∈ Obj (π’ž {^op})"
shows "setmap (component (obj_to_nat_build π’ž F C x) X)"
proof (simp add: obj_to_nat_build_def)
have F_Functor: "Functor' F : π’ž {^op} ⟢ Setoid"
using assms(2) by (simp add: Presheaf_def FunCat_def)
have Xop: "X ∈ Obj (π’ž {^op})" by (rule assms)
hence X: "X ∈ Obj π’ž" by (simp add: opposite_def)
show "setmap ⦇setdom = fobj (fobj (yoneda π’ž) C) X, setcod = fobj F X, setfunction = Ξ»u. setfunction (fmap F u) x⦈"
proof (simp add: setmap_def, auto)
fix xa
assume "xa ∈ carrier (fobj (fobj (yoneda π’ž) C) X)"
hence xa: "xa ∈ Hom[π’ž][X,C]" by (simp add: yoneda_def contraHom_def)
have Fxa: "fmap F xa ∈ Hom[Setoid][fobj F C,fobj F X]"
apply (rule FunctorE_fmap [OF F_Functor])
using xa apply (simp add: hom_def opposite_def) done
show "setfunction (fmap F xa) x ∈ carrier (fobj F X)"
using Fxa assms(4) by (simp add: hom_def Setoid_def setmap_def, auto)
next
show "setoid (fobj (fobj (yoneda π’ž) C) X)"
by (simp add: yoneda_def contraHom_def, rule hom_setoid [OF assms(1) X assms(3)])
next
show "setoid (fobj F X)"
using FunctorE_fobj [OF F_Functor Xop] by (simp add: Setoid_def)
next
fix xa y
assume "equal (fobj (fobj (yoneda π’ž) C) X) xa y"
hence a: "xa ∈ Hom[π’ž][X,C]" "y ∈ Hom[π’ž][X,C]" "xa β‰ˆβ‡˜π’žβ‡™ y"
by (auto simp add: yoneda_def contraHom_def hom_def)
hence aop: "xa ∈ Hom[π’ž {^op}][C,X]" "y ∈ Hom[π’ž {^op}][C,X]" "xa β‰ˆβ‡˜π’ž {^op}⇙ y"
by (auto simp add: opposite_def hom_def)
have h: "fmap F xa β‰ˆβ‡˜Setoid⇙ fmap F y"
using FunctorE_preserver_equal [OF F_Functor _ Xop aop] by (simp add: assms opposite_def)
have h2: "setdom (fmap F xa) = fobj F C" "setcod (fmap F xa) = fobj F X" "setdom (fmap F y) = fobj F C"
using FunctorE_fmap [OF F_Functor aop(1)] FunctorE_fmap [OF F_Functor aop(2)]
by (auto simp add: hom_def Setoid_def)
show "equal (fobj F X) (setfunction (fmap F xa) x) (setfunction (fmap F y) x)"
using h apply (simp add: Setoid_def setmap_eq_def)
using assms(4) by (fastforce simp add: h2)
qed
qed
lemma obj_to_nat_build_Nat:
assumes "Category π’ž" "F ∈ Obj PSh(π’ž)" "C ∈ Obj π’ž" "x ∈ fobj F C"
shows "Nat' (obj_to_nat_build π’ž F C x) : (fobj (yoneda π’ž) C) ⟢ F"
apply (rule NatI)
apply (simp add: yoneda_def, rule contraHom_Functor [OF assms(1) assms(3)])
using assms(2) apply (simp add: Presheaf_def FunCat_def)
apply (simp add: obj_to_nat_build_def, simp add: obj_to_nat_build_def)
proof-
fix X
assume Xop: "X ∈ Obj (π’ž {^op})"
show "component (obj_to_nat_build π’ž F C x) X ∈ Hom[Setoid][fobj (fobj (yoneda π’ž) C) X,fobj F X]"
apply (simp add: opposite_def obj_to_nat_build_def hom_def Setoid_def)
using obj_to_nat_build_component_setmap [OF assms Xop] by (simp add: obj_to_nat_build_def)
next
have F_Functor: "Functor' F : π’ž {^op} ⟢ Setoid"
using assms(2) by (simp add: Presheaf_def FunCat_def)
fix A B f
assume aop: "A ∈ Obj (π’ž {^op})" "B ∈ Obj (π’ž {^op})" "f ∈ carrier (Hom[π’ž {^op}][A,B])"
hence a: "A ∈ Obj π’ž" "B ∈ Obj π’ž" "f ∈ carrier (Hom[π’ž][B,A])" by (auto simp add: hom_def opposite_def)
show "component (obj_to_nat_build π’ž F C x) B βˆ˜β‡˜Setoid⇙ fmap (fobj (yoneda π’ž) C) f β‰ˆβ‡˜Setoid⇙
fmap F f βˆ˜β‡˜Setoid⇙ component (obj_to_nat_build π’ž F C x) A"
apply (simp add: Setoid_def, auto)
apply (rule setmap_comp_setmap, simp add: obj_to_nat_build_def)
using obj_to_nat_build_component_setmap [OF assms] apply (simp add: obj_to_nat_build_def aop)
apply (simp add: yoneda_def, rule contraHom_fmap_setmap [OF assms(1) assms(3) a(3)])
apply (simp add: yoneda_def obj_to_nat_build_def contraHom_def) using a(3) apply (simp add: hom_def)
apply (rule setmap_comp_setmap)
using FunctorE_fmap [OF F_Functor aop(3)] apply (simp add: hom_def Setoid_def)
apply (simp add: obj_to_nat_build_def) using obj_to_nat_build_component_setmap [OF assms] apply (simp add: obj_to_nat_build_def aop)
apply (simp add: obj_to_nat_build_def)
using FunctorE_fmap [OF F_Functor aop(3)] apply (simp add: hom_def Setoid_def)
apply (rule setmap_eqI)
apply (simp add: setmap_comp_def yoneda_def obj_to_nat_build_def contraHom_def) using a(3) apply (simp add: hom_def)
apply (simp add: setmap_comp_def yoneda_def obj_to_nat_build_def contraHom_def)
using FunctorE_fmap [OF F_Functor aop(3)] apply (simp add: hom_def Setoid_def)
apply (simp add: setmap_comp_def obj_to_nat_build_def yoneda_def contraHom_def)
proof-
fix xa
assume "xa ∈ Hom[π’ž][Cod π’ž f,C]"
hence b: "xa ∈ Hom[π’ž][A,C]" using a by (simp add: hom_def)
hence bop: "xa ∈ Hom[π’ž {^op}][C,A]" using a by (simp add: hom_def opposite_def)
have h: "fmap F (xa βˆ˜β‡˜π’žβ‡™ f) β‰ˆβ‡˜Setoid⇙ fmap F f βˆ˜β‡˜Setoid⇙ fmap F xa"
using FunctorE_preserver_comp [OF F_Functor bop aop(3)] by (simp add: opposite_def)
have Fxaf: "fmap F (xa βˆ˜β‡˜π’žβ‡™ f) ∈ Hom[Setoid][fobj F C, fobj F B]"
using FunctorE_fmap [OF F_Functor, of "xa βˆ˜β‡˜π’žβ‡™ f" C B] apply (rule)
using CategoryE_comp_exist [OF assms(1) a(2) a(1) assms(3) a(3) b] by (simp add: hom_def opposite_def, simp)
have p: "setdom (fmap F (xa βˆ˜β‡˜π’žβ‡™ f)) = fobj F C" "setcod (fmap F (xa βˆ˜β‡˜π’žβ‡™ f)) = fobj F B"
using Fxaf by (auto simp add: hom_def Setoid_def)
have q1: "equal (fobj F B) (setfunction (fmap F (xa βˆ˜β‡˜π’žβ‡™ f)) x) (setfunction (fmap F f βˆ˜β‡˜Setoid⇙ fmap F xa) x)"
using h apply (simp add: Setoid_def setmap_eq_def)
using assms(4) apply (auto simp add: p)
done
have q2: "setfunction (fmap F f βˆ˜β‡˜Setoid⇙ fmap F xa) x = setfunction (fmap F f) (setfunction (fmap F xa) x)"
by (simp add: Setoid_def setmap_comp_def)
show "equal (fobj F B) (setfunction (fmap F (xa βˆ˜β‡˜π’žβ‡™ f)) x) (setfunction (fmap F f) (setfunction (fmap F xa) x))"
using q1 by (simp add: q2)
qed
qed
definition obj_to_nat where
"obj_to_nat π’ž F C ≑ ⦇
setdom = fobj F C,
setcod = Hom[PSh(π’ž)][fobj (yoneda π’ž) C, F],
setfunction = obj_to_nat_build π’ž F C
⦈"
lemma obj_to_nat_setmap:
assumes "Category π’ž" "F ∈ Obj (PSh π’ž)" "C ∈ Obj π’ž"
shows "setmap (obj_to_nat π’ž F C)"
apply (auto simp add: setmap_def)
apply (simp add: obj_to_nat_def hom_def Presheaf_def FunCat_def)
apply (simp add: obj_to_nat_build_Nat [OF assms] yoneda_def contraHom_Functor [OF assms(1) assms(3)])
using assms(2) apply (simp add: Presheaf_def FunCat_def)
apply (simp add: obj_to_nat_def)
using FunctorE_fobj [of F "π’ž {^op}" Setoid C] assms(2) assms(3) apply (simp add: Presheaf_def FunCat_def opposite_def Setoid_def)
apply (simp add: obj_to_nat_def)
apply (rule hom_setoid, simp add: Presheaf_def FunCat_Category [OF opposite_Category [OF assms(1)] Setoid_Category])
apply (simp add: Presheaf_def FunCat_def yoneda_def contraHom_Functor [OF assms(1) assms(3)], rule assms(2))
proof (simp add: obj_to_nat_def)
have F_Functor: "Functor' F : π’ž {^op} ⟢ Setoid"
using assms(2) by (simp add: Presheaf_def FunCat_def)
fix x y
assume a: "equal (fobj F C) x y"
have 1: "setoid (fobj F C)"
using FunctorE_fobj [OF F_Functor, of C] by (simp add: opposite_def assms(3) Setoid_def)
have 2: "x ∈ fobj F C" "y ∈ fobj F C"
using equiv_type [OF setoid.equal_equiv [OF 1]] a by auto
have 3: "β‹€X. X ∈ Obj π’ž ⟹ component (obj_to_nat_build π’ž F C x) X ∈ Hom[Setoid][fobj (fobj (yoneda π’ž) C) X, fobj F X]"
using NatE_component [OF obj_to_nat_build_Nat [OF assms 2(1)]] by (simp add: yoneda_def contraHom_def opposite_def)
show "equal (Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) (obj_to_nat_build π’ž F C x) (obj_to_nat_build π’ž F C y)"
apply (simp add: hom_def Presheaf_def FunCat_def)
apply (simp add: obj_to_nat_build_Nat [OF assms 2(1)] obj_to_nat_build_Nat [OF assms 2(2)])
apply (simp add: yoneda_def contraHom_Functor [OF assms(1) assms(3)] F_Functor)
apply (rule Nat_equalI)
apply (rule obj_to_nat_build_Nat [OF assms 2(1)], rule obj_to_nat_build_Nat [OF assms 2(2)])
apply (simp add: yoneda_def contraHom_def opposite_def)
apply (simp add: Setoid_def, auto)
using NatE_component [OF obj_to_nat_build_Nat [OF assms 2(1)]] apply (simp add: yoneda_def contraHom_def opposite_def hom_def Setoid_def)
using NatE_component [OF obj_to_nat_build_Nat [OF assms 2(2)]] apply (simp add: yoneda_def contraHom_def opposite_def hom_def Setoid_def)
apply (rule setmap_eqI)
apply (simp add: obj_to_nat_build_def, simp add: obj_to_nat_build_def)
apply (simp add: obj_to_nat_build_def yoneda_def contraHom_def)
proof-
fix X xa
assume b: "X ∈ Obj π’ž" "xa ∈ Hom[π’ž][X,C]"
have 4: "fmap F xa ∈ Hom[Setoid][fobj F C, fobj F X]"
apply (rule FunctorE_fmap [OF F_Functor]) using b(2) by (simp add: hom_def opposite_def)
show "equal (fobj F X) (setfunction (fmap F xa) x) (setfunction (fmap F xa) y)"
using setmap.preserve_equal [of "fmap F xa"] 4 by (simp add: hom_def Setoid_def a)
qed
qed
definition nat_to_obj where
"nat_to_obj π’ž F C ≑ ⦇
setdom = Hom[PSh(π’ž)][fobj (yoneda π’ž) C, F],
setcod = fobj F C,
setfunction = λα. setfunction (component Ξ± C) (Id π’ž C)
⦈"
lemma nat_to_obj_setmap:
assumes "Category π’ž" "F ∈ Obj (PSh π’ž)" "C ∈ Obj π’ž"
shows "setmap (nat_to_obj π’ž F C)"
proof (auto simp add: setmap_def, simp add: nat_to_obj_def)
fix x
assume "x ∈ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]"
hence 1: "Nat' x : fobj (yoneda π’ž) C ⟢ F"
by (simp add: hom_def Presheaf_def FunCat_def)
have 2: "component x C ∈ Hom[Setoid][Hom[π’ž][C,C], fobj F C]"
using NatE_component [OF 1, of C] by (simp add: yoneda_def contraHom_def opposite_def assms(3))
have 3: "setmap (component x C)" "idβ‡˜π’žβ‡™ C ∈ setdom (component x C)" "setcod (component x C) = fobj F C"
using 2 apply (simp add: hom_def Setoid_def)
using 2 apply (simp add: hom_def Setoid_def Category.id_exist [OF assms(1) assms(3)])
using 2 apply (simp add: hom_def Setoid_def)
done
show "setfunction (component x C) (idβ‡˜π’žβ‡™ C) ∈ fobj F C"
using 3(1) apply (simp add: setmap_def)
using 3(2) 3(3) apply simp
done
next
show "setoid (setdom (nat_to_obj π’ž F C))"
apply (simp add: nat_to_obj_def, rule hom_setoid)
apply (simp add: Presheaf_def, rule FunCat_Category [OF opposite_Category [OF assms(1)] Setoid_Category])
apply (simp add: yoneda_def Presheaf_def FunCat_def, rule contraHom_Functor [OF assms(1) assms(3)], rule assms(2))
done
next
show "setoid (setcod (nat_to_obj π’ž F C))"
apply (simp add: nat_to_obj_def)
using assms(2) apply (simp add: Presheaf_def FunCat_def)
using FunctorE_fobj [of F "π’ž {^op}" Setoid C] assms(3) by (simp add: opposite_def Setoid_def)
next
fix x y
assume 1: "equal (setdom (nat_to_obj π’ž F C)) x y"
have 2: "x β‰ˆβ‡˜Cat[π’ž {^op},Setoid]⇙ y" "Nat' x : fobj (yoneda π’ž) C ⟢ F" "Nat' y : fobj (yoneda π’ž) C ⟢ F"
using 1 apply (simp add: nat_to_obj_def hom_def Presheaf_def)
using 1 apply (simp add: nat_to_obj_def hom_def Presheaf_def FunCat_def)
using 1 apply (simp add: nat_to_obj_def hom_def Presheaf_def FunCat_def)
done
have "Nat_equal x y"
using 2(1) by (simp add: FunCat_def)
hence 3: "component x C β‰ˆβ‡˜Setoid⇙ component y C"
apply (simp add: Nat_equal_def)
using 2(2) apply (simp add: yoneda_def contraHom_def opposite_def, simp add: assms(3))
done
have "β‹€xa. xa ∈ setdom (component x C) ⟹ equal (setcod (component x C)) (setfunction (component x C) xa) (setfunction (component y C) xa)"
using 3 by (simp add: Setoid_def setmap_eq_def, auto)
hence 4: "β‹€xa. xa ∈ Hom[π’ž][C,C] ⟹ equal (fobj F C) (setfunction (component x C) xa) (setfunction (component y C) xa)"
using NatE_component [OF 2(2)] apply (simp add: yoneda_def contraHom_def opposite_def)
using assms(3) apply (simp add: hom_def Setoid_def)
done
show "equal (setcod (nat_to_obj π’ž F C)) (setfunction (nat_to_obj π’ž F C) x) (setfunction (nat_to_obj π’ž F C) y)"
by (simp add: nat_to_obj_def, rule 4, rule CategoryE_id_exist [OF assms(1) assms(3)])
qed
definition IsoWith where
"IsoWith A B f g ≑ (equal (Hom[Setoid][A,A]) (g ∘[setmap] f) (idβ‡˜Setoid⇙ A))
∧ (equal (Hom[Setoid][B,B]) (f ∘[setmap] g) (idβ‡˜Setoid⇙ B))"
lemma YonedaLemma:
assumes "Category π’ž" "F ∈ Obj PSh(π’ž)" "C ∈ Obj π’ž"
shows "IsoWith (Hom[PSh(π’ž)][fobj (yoneda π’ž) C, F]) (fobj F C) (nat_to_obj π’ž F C) (obj_to_nat π’ž F C)"
proof (unfold IsoWith_def, auto)
have F_Functor: "Functor' F : π’ž {^op} ⟢ Setoid"
using assms(2) by (simp add: Presheaf_def FunCat_def)
have q1: "setmap_eq ((obj_to_nat π’ž F C) ∘[setmap] (nat_to_obj π’ž F C)) (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F])"
apply (rule setmap_eqI)
apply (simp add: setmap_comp_def nat_to_obj_def obj_to_nat_def Setoid_def idsetmap_def)
apply (simp add: setmap_comp_def nat_to_obj_def obj_to_nat_def Setoid_def idsetmap_def)
proof-
fix x
assume "x ∈ setdom (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C)"
hence x: "x ∈ Hom[PSh(π’ž)][fobj (yoneda π’ž) C, F]"
by (simp add: setmap_comp_def nat_to_obj_def)
hence x_Nat: "Nat' x : fobj (yoneda π’ž) C ⟢ F" by (simp add: hom_def Presheaf_def FunCat_def)
have h1: "setcod (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) = Hom[PSh(π’ž)][fobj (yoneda π’ž) C, F]"
by (simp add: setmap_comp_def obj_to_nat_def)
have h2: "β‹€f g. equal (Hom[PSh(π’ž)][fobj (yoneda π’ž) C, F]) f g = ((f β‰ˆβ‡˜PSh π’žβ‡™ g) ∧ (f ∈ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) ∧ (g ∈ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]))"
by (simp add: hom_def, auto)
show "equal (setcod (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C))
(setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)
(setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x)"
proof (simp add: h1 h2, auto)
have ha1: "β‹€f g. (f β‰ˆβ‡˜PSh π’žβ‡™ g) = (Nat_equal f g
∧ (Nat' f : domFunctor f ⟢ codFunctor f) ∧ (Nat' g : domFunctor f ⟢ codFunctor f)
∧ (Functor' (domFunctor f) : π’ž {^op} ⟢ Setoid) ∧ (Functor' (codFunctor f) : π’ž {^op} ⟢ Setoid))"
by (simp add: Presheaf_def FunCat_def)
have onno_Nat: "Nat' setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x : fobj (yoneda π’ž) C ⟢ F"
apply (simp add: setmap_comp_def obj_to_nat_def)
apply (rule obj_to_nat_build_Nat [OF assms])
using nat_to_obj_setmap [OF assms] apply (simp add: setmap_def nat_to_obj_def x) done
have idx_Nat: "Nat' setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x : fobj (yoneda π’ž) C ⟢ F"
apply (simp add: Setoid_def idsetmap_def)
using x by (simp add: hom_def Presheaf_def FunCat_def)
have 1: "domCat (fobj (yoneda π’ž) C) = (π’ž {^op})" "codCat (fobj (yoneda π’ž) C) = Setoid"
by (auto simp add: yoneda_def contraHom_def)
have 2: "setfunction (nat_to_obj π’ž F C) x ∈ carrier (fobj F C)"
using nat_to_obj_setmap [OF assms] by (simp add: setmap_def nat_to_obj_def x)
{
show "setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x β‰ˆβ‡˜PSh π’žβ‡™ setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x"
proof (simp add: ha1, auto)
have 3: "β‹€X. X ∈ Obj π’ž ⟹ setdom (component x X) = Hom[π’ž][X,C] ∧ fobj F X = setcod (component x X) ∧ setmap (component x X)"
using NatE_component [OF x_Nat] by (simp add: yoneda_def contraHom_def opposite_def hom_def Setoid_def)
show "Nat_equal
(setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)
(setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x)"
apply (rule Nat_equalI, rule onno_Nat, rule idx_Nat)
apply (simp add: 1 opposite_def Setoid_def, auto)
apply (simp add: setmap_comp_def obj_to_nat_def)
apply (rule obj_to_nat_build_component_setmap [OF assms 2], simp add: opposite_def)
apply (simp add: idsetmap_def)
using NatE_component [OF x_Nat] apply (simp add: yoneda_def contraHom_def opposite_def hom_def Setoid_def)
apply (rule setmap_eqI)
apply (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def idsetmap_def yoneda_def contraHom_def 3)
apply (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def idsetmap_def yoneda_def contraHom_def 3)
apply (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def idsetmap_def yoneda_def contraHom_def nat_to_obj_def)
proof-
fix X xa
assume a: "X ∈ Obj π’ž" "xa ∈ Hom[π’ž][X,C]"
hence aop: "X ∈ Obj (π’ž {^op})" "xa ∈ Hom[π’ž {^op}][C,X]" by (auto simp add: hom_def opposite_def)
have 4: "setdom (fmap F xa ∘[setmap] component x C) = Hom[π’ž][C,C]" "setcod (fmap F xa ∘[setmap] component x C) = fobj F X"
apply (simp add: setmap_comp_def)
using NatE_component [OF x_Nat, of C] apply (simp add: yoneda_def contraHom_def opposite_def assms hom_def Setoid_def)
apply (simp add: setmap_comp_def)
using FunctorE_fmap [OF F_Functor aop(2)] apply (simp add: hom_def Setoid_def) done
have 5: "idβ‡˜π’žβ‡™ C ∈ Hom[π’ž][C,C]" by (rule CategoryE_id_exist [OF assms(1) assms(3)])
have 51: "fmap F xa βˆ˜β‡˜Setoid⇙ component x C β‰ˆβ‡˜Setoid⇙ component x X βˆ˜β‡˜Setoid⇙ fmap (fobj (yoneda π’ž) C) xa"
using NatE_naturality [OF x_Nat, of xa C X]
apply (simp add: yoneda_def contraHom_def aop(2))
apply (simp add: CategoryE_hom_sym [OF Setoid_Category]) done
hence 6: "β‹€k. k ∈ Hom[π’ž][C,C] ⟹ equal (fobj F X) (setfunction (fmap F xa βˆ˜β‡˜Setoid⇙ component x C) k) (setfunction (component x X βˆ˜β‡˜Setoid⇙ fmap (fobj (yoneda π’ž) C) xa) k)"
by (simp add: Setoid_def setmap_eq_def, metis 4)
have 7: "equal (fobj F X) (setfunction (component x X) xa) (setfunction (component x X) (idβ‡˜π’žβ‡™ C βˆ˜β‡˜π’žβ‡™ xa))"
proof-
have h1: "xa β‰ˆβ‡˜π’žβ‡™ idβ‡˜π’žβ‡™ C βˆ˜β‡˜π’žβ‡™ xa" by (rule CategoryE_hom_sym [OF assms(1)], rule CategoryE_left_id [OF assms(1) a(1) assms(3) a(2)])
have h2: "setmap (component x X)" using 3 [OF a(1)] by simp
have h3: "setdom (component x X) = Hom[π’ž][X,C]" using 3 [OF a(1)] by simp
have h4: "setcod (component x X) = fobj F X" using 3 [OF a(1)] by simp
show ?thesis
using setmap.preserve_equal [OF h2] apply (simp add: h3 h4 hom_def)
using h1 a(2) CategoryE_id_exist [OF assms(1) assms(3)]
by (simp add: Category.comp_exist assms(1) hom_def)
qed
show "equal (fobj F X) (setfunction (fmap F xa) (setfunction (component x C) (idβ‡˜π’žβ‡™ C))) (setfunction (component x X) xa)"
using 6 [OF 5] apply (simp add: Setoid_def setmap_comp_def yoneda_def contraHom_def)
using 7
by (metis (mono_tags, lifting) "4"(2) Category.Category.select_convs(2) Category.Category.select_convs(6) Setoid_def 51setmap_cod_sym setmap_cod_trans setoid.select_convs(2))
qed
next
show "Nat (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)" by (simp add: onno_Nat)
next
show "Nat (setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x)" by (simp add: Setoid_def idsetmap_def x_Nat)
next
show "domFunctor (setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x) = domFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)"
apply (simp add: Setoid_def idsetmap_def setmap_comp_def obj_to_nat_def obj_to_nat_build_def) using x by (simp add: hom_def Presheaf_def FunCat_def)
next
show "codFunctor (setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x) = codFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)"
apply (simp add: Setoid_def idsetmap_def setmap_comp_def obj_to_nat_def obj_to_nat_build_def) using x by (simp add: hom_def Presheaf_def FunCat_def)
next
show "Functor (domFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x))"
by (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def yoneda_def contraHom_Functor [OF assms(1) assms(3)])
next
show "domCat (domFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)) = (π’ž {^op})"
by (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def yoneda_def contraHom_Functor [OF assms(1) assms(3)])
next
show "codCat (domFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)) = Setoid"
by (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def yoneda_def contraHom_Functor [OF assms(1) assms(3)])
next
show "Functor (codFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x))"
by (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def F_Functor)
next
show "domCat (codFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)) = (π’ž {^op})"
by (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def F_Functor)
next
show "codCat (codFunctor (setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x)) = Setoid"
by (simp add: setmap_comp_def obj_to_nat_def obj_to_nat_build_def F_Functor)
qed
}
{
show "setfunction (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) x ∈ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]"
apply (simp add: hom_def Presheaf_def FunCat_def onno_Nat)
by (simp add: yoneda_def contraHom_Functor [OF assms(1) assms(3)] F_Functor)
}
{
have q: "β‹€x. Nat' x : (fobj (yoneda π’ž) C) ⟢ F ⟹ x ∈ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]"
by (simp add: hom_def Presheaf_def FunCat_def yoneda_def contraHom_Functor [OF assms(1) assms(3)] F_Functor)
show "setfunction (idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x ∈ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]"
by (simp add: q idx_Nat)
}
qed
qed
have q2: "setmap_eq ((nat_to_obj π’ž F C) ∘[setmap] (obj_to_nat π’ž F C)) (idβ‡˜Setoid⇙ fobj F C)"
apply (rule setmap_eqI)
apply (simp add: setmap_comp_def obj_to_nat_def Setoid_def idsetmap_def)
apply (simp add: setmap_comp_def Setoid_def idsetmap_def nat_to_obj_def)
apply (simp add: setmap_comp_def obj_to_nat_def nat_to_obj_def obj_to_nat_build_def Setoid_def idsetmap_def)
proof-
fix x
assume x: "x ∈ carrier (fobj F C)"
have 1: "fmap F (idβ‡˜π’žβ‡™ C) β‰ˆβ‡˜Setoid⇙ idβ‡˜Setoid⇙ fobj F C"
using FunctorE_preserver_id [OF F_Functor, of C] by (simp add: opposite_def assms(3))
have 2: "equal (fobj F C) (setfunction (fmap F (idβ‡˜π’žβ‡™ C)) x) (setfunction (idsetmap (fobj F C)) x)"
using 1 apply (simp add: Setoid_def setmap_eq_def)
by (simp add: idsetmap_def, metis x)
show "equal (fobj F C) (setfunction (fmap F (idβ‡˜π’žβ‡™ C)) x) x"
using 2 by (simp add: idsetmap_def)
qed
{
show "equal (Hom[Setoid][Hom[PSh π’ž][fobj (yoneda π’ž) C,F],Hom[PSh π’ž][fobj (yoneda π’ž) C,F]])
((obj_to_nat π’ž F C) ∘[setmap] (nat_to_obj π’ž F C))
(idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F])"
proof-
have 1: "β‹€a b f g. (equal (Hom[Setoid][a,b]) f g) =
(equal (Arr Setoid) f g ∧ f ∈ carrier (Arr Setoid) ∧ g ∈ carrier (Arr Setoid) ∧ Dom Setoid f = a ∧ Cod Setoid f = b ∧ Dom Setoid g = a ∧ Cod Setoid g = b)"
by (simp add: hom_def)
show ?thesis
apply (simp add: 1, auto)
defer defer
apply (simp add: Setoid_def, rule id_setmap, rule hom_setoid, rule Presheaf_Category [OF assms(1)])
apply (simp add: yoneda_def Presheaf_def FunCat_def contraHom_Functor [OF assms(1) assms(3)])
apply (simp add: assms(2))
apply (simp add: Setoid_def setmap_comp_def nat_to_obj_def)
apply (simp add: Setoid_def setmap_comp_def obj_to_nat_def)
apply (simp add: Setoid_def setmap_comp_def nat_to_obj_def idsetmap_def)
apply (simp add: Setoid_def setmap_comp_def nat_to_obj_def idsetmap_def)
proof-
show "(obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) β‰ˆβ‡˜Setoid⇙ idβ‡˜Setoid⇙ Hom[PSh π’ž][fobj (yoneda π’ž) C,F]"
proof (auto simp add: Setoid_def)
show "setmap (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C)"
apply (simp add: setmap_comp_def nat_to_obj_def obj_to_nat_def)
proof (simp add: setmap_def, auto)
fix x
assume x: "x ∈ carrier (Hom[PSh π’ž][fobj (yoneda π’ž) C,F])"
hence x_Nat: "Nat' x : fobj (yoneda π’ž) C ⟢ F" by (simp add: hom_def Presheaf_def FunCat_def)
have 1: "component x C ∈ Hom[Setoid][fobj (fobj (yoneda π’ž) C) C, fobj F C]"
using NatE_component [OF x_Nat, of C] by (simp add: yoneda_def contraHom_def opposite_def assms(3))
have "β‹€xa. xa ∈ (fobj (fobj (yoneda π’ž) C) C) ⟹ setfunction (component x C) xa ∈ fobj F C"
using 1 by (simp add: hom_def Setoid_def setmap_def, auto)
hence 2: "β‹€xa. xa ∈ Hom[π’ž][C,C] ⟹ setfunction (component x C) xa ∈ fobj F C"
by (simp add: yoneda_def contraHom_def)
have 3: "setfunction (component x C) (idβ‡˜π’žβ‡™ C) ∈ fobj F C"
by (rule 2, rule CategoryE_id_exist [OF assms(1) assms(3)])
show "obj_to_nat_build π’ž F C (setfunction (component x C) (idβ‡˜π’žβ‡™ C)) ∈ carrier (Hom[PSh π’ž][fobj (yoneda π’ž) C,F])"
apply (simp add: hom_def Presheaf_def FunCat_def obj_to_nat_build_Nat [OF assms 3])
apply (simp add: yoneda_def contraHom_Functor [OF assms(1) assms(3)] F_Functor)
done
next
show "setoid (Hom[PSh π’ž][fobj (yoneda π’ž) C,F])"
apply (rule hom_setoid, rule Presheaf_Category [OF assms(1)])
apply (simp add: Presheaf_def FunCat_def yoneda_def contraHom_Functor [OF assms(1) assms(3)], rule assms(2))
done
next
fix x y
assume a: "equal (Hom[PSh π’ž][fobj (yoneda π’ž) C,F]) x y"
from a have x: "x ∈ carrier (Hom[PSh π’ž][fobj (yoneda π’ž) C,F])" by (simp add: hom_def)
from a have y: "y ∈ carrier (Hom[PSh π’ž][fobj (yoneda π’ž) C,F])" by (simp add: hom_def)
from x have x_Nat: "Nat' x : fobj (yoneda π’ž) C ⟢ F" by (simp add: hom_def Presheaf_def FunCat_def)
from y have y_Nat: "Nat' y : fobj (yoneda π’ž) C ⟢ F" by (simp add: hom_def Presheaf_def FunCat_def)
have x1: "component x C ∈ Hom[Setoid][fobj (fobj (yoneda π’ž) C) C, fobj F C]"
using NatE_component [OF x_Nat, of C] by (simp add: yoneda_def contraHom_def opposite_def assms(3))
have "β‹€xa. xa ∈ (fobj (fobj (yoneda π’ž) C) C) ⟹ setfunction (component x C) xa ∈ fobj F C"
using x1 by (simp add: hom_def Setoid_def setmap_def, auto)
hence x2: "β‹€xa. xa ∈ Hom[π’ž][C,C] ⟹ setfunction (component x C) xa ∈ fobj F C"
by (simp add: yoneda_def contraHom_def)
have x3: "setfunction (component x C) (idβ‡˜π’žβ‡™ C) ∈ fobj F C"
by (rule x2, rule CategoryE_id_exist [OF assms(1) assms(3)])
have y1: "component y C ∈ Hom[Setoid][fobj (fobj (yoneda π’ž) C) C, fobj F C]"
using NatE_component [OF y_Nat, of C] by (simp add: yoneda_def contraHom_def opposite_def assms(3))
have "β‹€xa. xa ∈ (fobj (fobj (yoneda π’ž) C) C) ⟹ setfunction (component y C) xa ∈ fobj F C"
using y1 by (simp add: hom_def Setoid_def setmap_def, auto)
hence y2: "β‹€xa. xa ∈ Hom[π’ž][C,C] ⟹ setfunction (component y C) xa ∈ fobj F C"
by (simp add: yoneda_def contraHom_def)
have y3: "setfunction (component y C) (idβ‡˜π’žβ‡™ C) ∈ fobj F C"
by (rule y2, rule CategoryE_id_exist [OF assms(1) assms(3)])
show "equal (Hom[PSh π’ž][fobj (yoneda π’ž) C,F])
(obj_to_nat_build π’ž F C (setfunction (component x C) (idβ‡˜π’žβ‡™ C)))
(obj_to_nat_build π’ž F C (setfunction (component y C) (idβ‡˜π’žβ‡™ C)))"
apply (simp add: hom_def Presheaf_def FunCat_def)
apply (simp add: obj_to_nat_build_Nat [OF assms x3] obj_to_nat_build_Nat [OF assms y3])
apply (simp add: F_Functor yoneda_def contraHom_Functor [OF assms(1) assms(3)])
apply (rule Nat_equalI)
apply (simp add: obj_to_nat_build_Nat [OF assms x3], simp add: obj_to_nat_build_Nat [OF assms y3])
apply (simp add: yoneda_def contraHom_def opposite_def)
apply (auto simp add: Setoid_def)
using obj_to_nat_build_component_setmap [OF assms x3] apply (simp add: opposite_def)
using obj_to_nat_build_component_setmap [OF assms y3] apply (simp add: opposite_def)
apply (rule setmap_eqI)
apply (simp add: obj_to_nat_build_def)
apply (simp add: obj_to_nat_build_def)
apply (simp add: obj_to_nat_build_def yoneda_def)
proof-
fix X xa
assume b: "X ∈ Obj π’ž" "xa ∈ fobj Hom{π’ž}[-,C] X"
hence xa: "xa ∈ Hom[π’ž][X,C]" by (simp add: contraHom_def)
have "Nat_equal x y"
using a by (simp add: hom_def Presheaf_def FunCat_def)
hence "component x C β‰ˆβ‡˜Setoid⇙ component y C"
apply (simp add: Nat_equal_def)
using x_Nat apply (simp add: yoneda_def contraHom_def opposite_def)
using assms(3) by (metis (mono_tags, lifting))
hence "β‹€xa. xa ∈ setdom (component x C) ⟹ equal (setcod (component x C)) (setfunction (component x C) xa) (setfunction (component y C) xa)"
by (simp add: Setoid_def setmap_eq_def, auto)
hence q1: "β‹€xa. xa ∈ Hom[π’ž][C,C] ⟹ equal (fobj F C) (setfunction (component x C) xa) (setfunction (component y C) xa)"
using x1 by (simp add: hom_def Setoid_def yoneda_def contraHom_def)
have q2: "equal (fobj F C) (setfunction (component x C) (idβ‡˜π’žβ‡™ C)) (setfunction (component y C) (idβ‡˜π’žβ‡™ C))"
by (rule q1, rule CategoryE_id_exist [OF assms(1) assms(3)])
have Fxa: "fmap F xa ∈ Hom[Setoid][fobj F C, fobj F X]"
using FunctorE_fmap [OF F_Functor, of xa] xa by (simp add: hom_def opposite_def)
hence Fxa_setmap: "setmap (fmap F xa)"
by (simp add: hom_def Setoid_def)
show "equal (fobj F X)
(setfunction (fmap F xa) (setfunction (component x C) (idβ‡˜π’žβ‡™ C)))
(setfunction (fmap F xa) (setfunction (component y C) (idβ‡˜π’žβ‡™ C)))"
using setmap.preserve_equal [OF Fxa_setmap, of "setfunction (component x C) (idβ‡˜π’žβ‡™ C)" "setfunction (component y C) (idβ‡˜π’žβ‡™ C)"]
using Fxa by (simp add: hom_def Setoid_def q2)
qed
qed
next
show "setmap (idsetmap (Hom[PSh π’ž][fobj (yoneda π’ž) C,F]))"
apply (rule id_setmap, rule hom_setoid [OF Presheaf_Category [OF assms(1)] _ assms(2)])
apply (simp add: Presheaf_def FunCat_def yoneda_def contraHom_Functor [OF assms(1) assms(3)])
done
next
show "setmap_eq (obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) (idsetmap (Hom[PSh π’ž][fobj (yoneda π’ž) C,F]))"
using q1 by (simp add: Setoid_def)
qed
next
show "(obj_to_nat π’ž F C ∘[setmap] nat_to_obj π’ž F C) ∈ Arr Setoid"
apply (simp add: Setoid_def, rule setmap_comp_setmap)
apply (rule obj_to_nat_setmap [OF assms], rule nat_to_obj_setmap [OF assms])
apply (simp add: nat_to_obj_def obj_to_nat_def)
done
qed
qed
}
{
have 1: "setmap (nat_to_obj π’ž F C ∘[setmap] obj_to_nat π’ž F C)"
apply (rule setmap_comp_setmap [OF nat_to_obj_setmap [OF assms] obj_to_nat_setmap [OF assms]])
apply (simp add: obj_to_nat_def nat_to_obj_def) done
have 2: "setmap (idsetmap (fobj F C))"
apply (rule id_setmap) using FunctorE_fobj [OF F_Functor, of C] assms(3) by (simp add: opposite_def Setoid_def)
show "equal (Hom[Setoid][fobj F C,fobj F C]) (nat_to_obj π’ž F C ∘[setmap] obj_to_nat π’ž F C) (idβ‡˜Setoid⇙ fobj F C)"
apply (simp add: hom_def Setoid_def, simp add: 1 2, auto)
using q2 apply (simp add: Setoid_def)
apply (simp add: setmap_comp_def obj_to_nat_def)
apply (simp add: setmap_comp_def nat_to_obj_def)
apply (simp add: idsetmap_def, simp add: idsetmap_def)
done
}
qed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment