Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/Isabelle/Archive-of-Formal-Proofs/thys/Category3/   (Sammlung formaler Beweise Version 2026-5©)  Datei vom 31.4.2026 mit Größe 17 kB image not shown  

Quelle  EpiMonoIso.thy

  Sprache: Isabelle
 

(*  Title:       EpiMonoIso
    Author:      Eugene W. Stark <stark@cs.stonybrook.edu>, 2016
    Maintainer:  Eugene W. Stark <stark@cs.stonybrook.edu>
*)


chapter EpiMonoIso

theory EpiMonoIso
imports Category
begin

  text
 This theory defines and develops properties of epimorphisms, monomorphisms,
 isomorphisms, sections, and retractions.
 


  context category
  begin

     definition epi
     where "epi f = (arr f inj_on (λg. g f) {g. seq g f})"

     definition mono
     where "mono f = (arr f inj_on (λg. f g) {g. seq f g})"

     lemma epiI [intro]:
     assumes "arr f" and "g g'. [seq g f; seq g' f; g f = g' f] ==> g = g'"
     shows "epi f"
       using assms epi_def inj_on_def by blast

     lemma epi_implies_arr:
     assumes "epi f"
     shows "arr f"
       using assms epi_def by auto

     lemma epi_cancel:
     assumes "epi f"
     and "seq g f" and "g f = g' f"
     shows "g = g'"
       using assms unfolding epi_def inj_on_def by auto
       
     lemma monoI [intro]:
     assumes "arr g" and "f f'. [seq g f; g f = g f'] ==> f = f'"
     shows "mono g"
       using assms mono_def inj_on_def by blast

     lemma mono_implies_arr:
     assumes "mono f"
     shows "arr f"
       using assms mono_def by auto
       
     lemma mono_cancel:
     assumes "mono g"
     and "seq g f" and "g f = g f'"
     shows "f' = f"
       using assms unfolding mono_def inj_on_def by auto

     definition inverse_arrows
     where "inverse_arrows f g ide (g f) ide (f g)"

     lemma inverse_arrowsI [intro]:
     assumes "ide (g f)" and "ide (f g)"
     shows "inverse_arrows f g"
       using assms inverse_arrows_def by blast

     lemma inverse_arrowsE [elim]:
     assumes "inverse_arrows f g"
     and "[ ide (g f); ide (f g) ] ==> T"
     shows "T"
       using assms inverse_arrows_def by blast

     lemma inverse_arrows_sym:
       shows "inverse_arrows f g inverse_arrows g f"
       using inverse_arrows_def by auto

     lemma ide_self_inverse:
     assumes "ide a"
     shows "inverse_arrows a a"
       using assms by auto

     lemma inverse_arrow_unique:
     assumes "inverse_arrows f g" and "inverse_arrows f g'"
     shows "g = g'"
       using assms apply (elim inverse_arrowsE)
       by (metis comp_cod_arr ide_compE comp_assoc seqE)

     lemma inverse_arrows_compose:
     assumes "seq g f" and "inverse_arrows f f'" and "inverse_arrows g g'"
     shows "inverse_arrows (g f) (f' g')"
       using assms apply (elim inverse_arrowsE, intro inverse_arrowsI)
        apply (metis seqE comp_arr_dom ide_compE comp_assoc)
       by (metis seqE comp_arr_dom ide_compE comp_assoc)

     definition "section"
     where "section f g. ide (g f)"

     lemma sectionI [intro]:
     assumes "ide (g f)"
     shows "section f"
       using assms section_def by auto

     lemma sectionE [elim]:
     assumes "section f"
     obtains g where "ide (g f)"
       using assms section_def by blast

     definition retraction
     where "retraction g f. ide (g f)"

     lemma retractionI [intro]:
     assumes "ide (g f)"
     shows "retraction g"
       using assms retraction_def by auto

     lemma retractionE [elim]:
     assumes "retraction g"
     obtains f where "ide (g f)"
       using assms retraction_def by blast
       
     lemma section_is_mono:
     assumes "section g"
     shows "mono g"
     proof
       show "arr g" using assms section_def by blast
       from assms obtain h where h: "ide (h g)" by blast
       have hg: "seq h g" using h by auto
       thus "f f'. [seq g f; g f = g f'] ==> f = f'"
         using hg h ide_compE seqE comp_assoc comp_cod_arr by metis
     qed

     lemma retraction_is_epi:
     assumes "retraction g"
     shows "epi g"
     proof
       show "arr g" using assms retraction_def by blast
       from assms obtain f where f: "ide (g f)" by blast
       have gf: "seq g f" using f by auto
       thus "h h'. [seq h g; seq h' g; h g = h' g] ==> h = h'"
         using gf f ide_compE seqE comp_assoc comp_arr_dom by metis
     qed

     lemma section_retraction_compose:
     assumes "ide (e m)" and "ide (e' m')" and "seq m' m"
     shows "ide ((e e') (m' m))"
       using assms seqI seqE ide_compE comp_assoc comp_arr_dom by metis

     lemma sections_compose [intro]:
     assumes "section m" and "section m'" and "seq m' m"
     shows "section (m' m)"
       using assms section_def section_retraction_compose by metis

     lemma retractions_compose [intro]:
     assumes "retraction e" and "retraction e'" and "seq e' e"
     shows "retraction (e' e)"
     proof -
       from assms(1-2obtain m m'
       where *: "ide (e m) ide (e' m')"
         using retraction_def by auto
       hence "seq m m'"
         using assms(3by (metis seqE seqI ide_compE)
       with * show ?thesis
         using section_retraction_compose retractionI by blast
     qed
       
     lemma monos_compose [intro]:
     assumes "mono m" and "mono m'" and "seq m' m"
     shows "mono (m' m)"
     proof -
       have "inj_on (λf. (m' m) f) {f. seq (m' m) f}"
         unfolding inj_on_def
         using assms
         by (metis CollectD seqE mono_cancel comp_assoc)
       thus ?thesis using assms(3) mono_def by force
     qed           

     lemma epis_compose [intro]:
     assumes "epi e" and "epi e'" and "seq e' e"
     shows "epi (e' e)"
     proof -
       have "inj_on (λg. g (e' e)) {g. seq g (e' e)}"
         unfolding inj_on_def
         using assms by (metis CollectD epi_cancel match_2 comp_assoc)
       thus ?thesis using assms(3) epi_def by force
     qed           

     definition iso
     where "iso f g. inverse_arrows f g"

     lemma isoI [intro]:
     assumes "inverse_arrows f g"
     shows "iso f"
       using assms iso_def by auto

     lemma isoE [elim]:
     assumes "iso f"
     obtains g where "inverse_arrows f g"
       using assms iso_def by blast

     lemma ide_is_iso [simp]:
     assumes "ide a"
     shows "iso a"
       using assms ide_self_inverse by auto

     lemma iso_is_arr:
     assumes "iso f"
     shows "arr f"
       using assms by blast

     lemma iso_is_section:
     assumes "iso f"
     shows "section f"
       using assms inverse_arrows_def by blast

     lemma iso_is_retraction:
     assumes "iso f"
     shows "retraction f"
       using assms inverse_arrows_def by blast

    lemma iso_iff_mono_and_retraction:
    shows "iso f mono f retraction f"
    proof
      show "iso f ==> mono f retraction f"
        by (simp add: iso_is_retraction iso_is_section section_is_mono)
      show "mono f retraction f ==> iso f"
      proof -
        assume f: "mono f retraction f"
        from f obtain g where g: "ide (f g)" by blast
        have "inverse_arrows f g"
          using f g comp_arr_dom comp_cod_arr comp_assoc inverse_arrowsI
          by (metis ide_char' ide_compE mono_cancel mono_implies_arr)
        thus "iso f" by auto
      qed
    qed

    lemma iso_iff_section_and_epi:
    shows "iso f section f epi f"
    proof
      show "iso f ==> section f epi f"
        by (simp add: iso_is_retraction iso_is_section retraction_is_epi)
      show "section f epi f ==> iso f"
      proof -
        assume f: "section f epi f"
        from f obtain g where g: "ide (g f)" by blast
        have "inverse_arrows f g"
          using f g comp_arr_dom comp_cod_arr epi_implies_arr
                comp_assoc ide_compE inverse_arrowsI epi_cancel ide_char'
          by metis
        thus "iso f" by auto
      qed
    qed

    lemma iso_iff_section_and_retraction:
    shows "iso f section f retraction f"
      using iso_is_retraction iso_is_section iso_iff_mono_and_retraction section_is_mono
      by auto

    lemma isos_compose [intro]:
    assumes "iso f" and "iso f'" and "seq f' f"
    shows "iso (f' f)"
    proof -
      from assms(1obtain g where g: "inverse_arrows f g" by blast
      from assms(2obtain g' where g': "inverse_arrows f' g'" by blast
      have "inverse_arrows (f' f) (g g')"
        using assms g g inverse_arrowsI inverse_arrowsE section_retraction_compose
        by (simp add: g' inverse_arrows_compose)
      thus ?thesis using iso_def by auto
    qed

    lemma iso_cancel_left:
    assumes "iso f" and "f g = f g'" and "seq f g"
    shows "g = g'"
      using assms iso_is_section section_is_mono mono_cancel by metis

    lemma iso_cancel_right:
    assumes "iso g" and "f g = f' g" and "seq f g" and "iso g"
    shows "f = f'"
      using assms iso_is_retraction retraction_is_epi epi_cancel by metis

    definition isomorphic
    where "isomorphic a a' = (f. «f : a a'¬ iso f)"

    lemma isomorphicI [intro]:
    assumes "iso f"
    shows "isomorphic (dom f) (cod f)"
      using assms isomorphic_def iso_is_arr by blast

    lemma isomorphicE [elim]:
    assumes "isomorphic a a'"
    obtains f where "«f : a a'¬ iso f"
      using assms isomorphic_def by meson

    definition iso_in_hom  («_ : _ _¬)
    where "iso_in_hom f a b «f : a b¬ iso f"

    lemma iso_in_homI [intro]:
    assumes "«f : a b¬" and "iso f"
    shows "«f : a b¬"
      using assms iso_in_hom_def by simp

    lemma iso_in_homE [elim]:
    assumes "«f : a b¬"
    and "[«f : a b¬; iso f] ==> T"
    shows T
      using assms iso_in_hom_def by simp

    lemma isomorphicI':
    assumes "«f : a b¬"
    shows "isomorphic a b"
      using assms iso_in_hom_def isomorphic_def by auto

    lemma ide_iso_in_hom:
    assumes "ide a"
    shows "«a : a a¬"
      using assms by fastforce

    lemma comp_iso_in_hom [intro]:
    assumes "«f : a b¬" and "«g : b c¬"
    shows "«g f : a c¬"
      using assms iso_in_hom_def by auto

    definition inv
    where "inv f = (SOME g. inverse_arrows f g)"

    lemma inv_is_inverse:
    assumes "iso f"
    shows "inverse_arrows f (inv f)"
      using assms inv_def someI [of "inverse_arrows f"by auto

    lemma iso_inv_iso [intro, simp]:
    assumes "iso f"
    shows "iso (inv f)"
      using assms inv_is_inverse inverse_arrows_sym by blast

    lemma inverse_unique:
    assumes "inverse_arrows f g"
    shows "inv f = g"
      using assms inv_is_inverse inverse_arrow_unique isoI by auto

    lemma inv_ide [simp]:
    assumes "ide a"
    shows "inv a = a"
      using assms by (simp add: inverse_arrowsI inverse_unique)

    lemma inv_inv [simp]:
    assumes "iso f"
    shows "inv (inv f) = f"
      using assms inverse_arrows_sym inverse_unique by blast

    lemma comp_arr_inv:
    assumes "inverse_arrows f g"
    shows "f g = dom g"
      using assms by auto

    lemma comp_inv_arr:
    assumes "inverse_arrows f g"
    shows "g f = dom f"
      using assms by auto

    lemma comp_arr_inv':
    assumes "iso f"
    shows "f inv f = cod f"
      using assms inv_is_inverse by blast

    lemma comp_inv_arr':
    assumes "iso f"
    shows "inv f f = dom f"
      using assms inv_is_inverse by blast

    lemma inv_in_hom [simp]:
    assumes "iso f" and "«f : a b¬"
    shows "«inv f : b a¬"
      using assms inv_is_inverse seqE inverse_arrowsE
      by (metis ide_compE in_homE in_homI)

    lemma arr_inv [simp]:
    assumes "iso f"
    shows "arr (inv f)"
      using assms inv_in_hom by blast

    lemma dom_inv [simp]:
    assumes "iso f"
    shows "dom (inv f) = cod f"
      using assms inv_in_hom by blast

    lemma cod_inv [simp]:
    assumes "iso f"
    shows "cod (inv f) = dom f"
      using assms inv_in_hom by blast

    lemma inv_comp:
    assumes "iso f" and "iso g" and "seq g f"
    shows "inv (g f) = inv f inv g"
      using assms inv_is_inverse inverse_unique inverse_arrows_compose inverse_arrows_def
      by meson

    lemma isomorphic_reflexive:
    assumes "ide f"
    shows "isomorphic f f"
      unfolding isomorphic_def
      using assms ide_is_iso ide_in_hom by blast

    lemma isomorphic_symmetric:
    assumes "isomorphic f g"
    shows "isomorphic g f"
      using assms inv_in_hom by blast

    lemma isomorphic_transitive [trans]:
    assumes "isomorphic f g" and "isomorphic g h"
    shows "isomorphic f h"
      using assms isomorphic_def isos_compose by auto

    text 
 A section or retraction of an isomorphism is in fact an inverse.
 


    lemma section_retraction_of_iso:
    assumes "iso f"
    shows "ide (g f) ==> inverse_arrows f g"
    and "ide (f g) ==> inverse_arrows f g"
    proof -
      show "ide (g f) ==> inverse_arrows f g"
        using assms
        by (metis comp_inv_arr' epi_cancel ide_compE inv_is_inverse
            iso_iff_section_and_epi)
      show "ide (f g) ==> inverse_arrows f g"
        using assms
        by (metis ide_compE comp_arr_inv' inv_is_inverse iso_iff_mono_and_retraction
            mono_cancel)
    qed

    text 
 A situation that occurs frequently is that we have a commuting triangle,
 but we need the triangle obtained by inverting one side that is an isomorphism.
 The following fact streamlines this derivation.
 


    lemma invert_side_of_triangle:
    assumes "arr h" and "f g = h"
    shows "iso f ==> seq (inv f) h g = inv f h"
    and "iso g ==> seq h (inv g) f = h inv g"
    proof -
      show "iso f ==> seq (inv f) h g = inv f h"
        by (metis assms seqE inv_is_inverse comp_cod_arr comp_inv_arr comp_assoc)
      show "iso g ==> seq h (inv g) f = h inv g"
        by (metis assms seqE inv_is_inverse comp_arr_dom comp_arr_inv dom_inv comp_assoc)
    qed

    text 
 A similar situation is where we have a commuting square and we want to
 invert two opposite sides.
 


    lemma invert_opposite_sides_of_square:
    assumes "seq f g" and "f g = h k"
    shows "[ iso f; iso k ] ==> seq g (inv k) seq (inv f) h g inv k = inv f h"
      by (metis assms invert_side_of_triangle comp_assoc)

    text 
 The following versions of inv_comp provide information needed for repeated
 application to a composition of more than two arrows and seem often to be more
 useful.
 


    lemma inv_comp_left:
    assumes "iso (g f)" and "iso g"
    shows "inv (g f) = inv f inv g" and "iso f"
    proof -
      have 1"inv f = inv (g f) g"
      proof -
        have "inv (g f) g = inv (g f) inv (inv g)"
         using assms by simp
        also have "... = inv (inv g g f)"
          using assms inv_comp iso_is_arr by simp
        also have "... = inv ((inv g g) f)"
          using comp_assoc by simp
        also have "... = inv f"
          using assms comp_ide_arr invert_side_of_triangle(1) iso_is_arr comp_assoc
          by metis
        finally show ?thesis by simp
      qed
      show "inv (g f) = inv f inv g"
        using assms 1 comp_arr_dom comp_assoc
        by (metis arr_inv cod_comp dom_inv invert_side_of_triangle(2) iso_is_arr seqI)
      show "iso f"
        using assms 1 comp_assoc inv_is_inverse
        by (metis arr_inv invert_side_of_triangle(1) inv_inv iso_inv_iso isos_compose)
    qed

    lemma inv_comp_right:
    assumes "iso (g f)" and "iso f"
    shows "inv (g f) = inv f inv g" and "iso g"
    proof -
      have 1"inv g = f inv (g f)"
      proof -
        have "f inv (g f) = inv (inv f) inv (g f)"
          using assms by simp
        also have "... = inv ((g f) inv f)"
          using assms inv_comp iso_is_arr by simp
        also have "... = inv (g f inv f)"
          using comp_assoc by simp
        also have "... = inv g"
          using assms comp_arr_dom invert_side_of_triangle(2) iso_is_arr comp_assoc
          by metis
        finally show ?thesis by simp
      qed
      show "inv (g f) = inv f inv g"
        using assms 1 comp_cod_arr comp_assoc
        by (metis arr_inv cod_inv dom_comp seqI invert_side_of_triangle(1) iso_is_arr)
      show "iso g"
        using assms 1 comp_assoc inv_is_inverse
        by (metis arr_inv invert_side_of_triangle(2) inv_inv iso_inv_iso isos_compose)
    qed

  end

end



Messung V0.5 in Prozent
C=96 H=100 G=97

¤ Dauer der Verarbeitung: 0.3 Sekunden  (vorverarbeitet am  2026-06-10) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.