Last active
          August 29, 2015 14:25 
        
      - 
      
- 
        Save myuon/506c3277b6dbd18cd800 to your computer and use it in GitHub Desktop. 
    setoid construction
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | theory Category | |
| imports Main | |
| begin | |
| no_notation Fun.comp (infixl "β" 55) | |
| 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