src/HOL/Algebra/Group_Action.thy
changeset 68606 96a49db47c97
parent 68582 b9b9e2985878
child 68975 5ce4d117cea7
equal deleted inserted replaced
68605:440aa6b7d99a 68606:96a49db47c97
   132 lemma (in group_action) orbit_sym:
   132 lemma (in group_action) orbit_sym:
   133   assumes "x \<in> E" and "y \<in> E" and "y \<in> orbit G \<phi> x"
   133   assumes "x \<in> E" and "y \<in> E" and "y \<in> orbit G \<phi> x"
   134   shows "x \<in> orbit G \<phi> y"
   134   shows "x \<in> orbit G \<phi> y"
   135 proof -
   135 proof -
   136   have "\<exists> g \<in> carrier G. (\<phi> g) x = y"
   136   have "\<exists> g \<in> carrier G. (\<phi> g) x = y"
   137     by (smt assms(3) mem_Collect_eq orbit_def)
   137     using assms by (auto simp: orbit_def)
   138   then obtain g where g: "g \<in> carrier G \<and> (\<phi> g) x = y" by blast
   138   then obtain g where g: "g \<in> carrier G \<and> (\<phi> g) x = y" by blast
   139   hence "(\<phi> (inv g)) y = x"
   139   hence "(\<phi> (inv g)) y = x"
   140     using orbit_sym_aux by (simp add: assms(1))
   140     using orbit_sym_aux by (simp add: assms(1))
   141   thus ?thesis
   141   thus ?thesis
   142     using g group_hom group_hom.axioms(1) orbit_def by fastforce 
   142     using g group_hom group_hom.axioms(1) orbit_def by fastforce 
   147     and "y \<in> orbit G \<phi> x" "z \<in> orbit G \<phi> y" 
   147     and "y \<in> orbit G \<phi> x" "z \<in> orbit G \<phi> y" 
   148   shows "z \<in> orbit G \<phi> x"
   148   shows "z \<in> orbit G \<phi> x"
   149 proof -
   149 proof -
   150   interpret group G
   150   interpret group G
   151     using group_hom group_hom.axioms(1) by auto
   151     using group_hom group_hom.axioms(1) by auto
   152 
   152   obtain g1 where g1: "g1 \<in> carrier G \<and> (\<phi> g1) x = y" 
   153   have "\<exists> g1 \<in> carrier G. (\<phi> g1) x = y"
   153     using assms by (auto simp: orbit_def)
   154     by (smt assms mem_Collect_eq orbit_def)
   154   obtain g2 where g2: "g2 \<in> carrier G \<and> (\<phi> g2) y = z" 
   155   then obtain g1 where g1: "g1 \<in> carrier G \<and> (\<phi> g1) x = y" by blast
   155     using assms by (auto simp: orbit_def)  
   156 
       
   157   have "\<exists> g2 \<in> carrier G. (\<phi> g2) y = z"
       
   158     by (smt assms mem_Collect_eq orbit_def)
       
   159   then obtain g2 where g2: "g2 \<in> carrier G \<and> (\<phi> g2) y = z" by blast
       
   160   
       
   161   have "(\<phi> (g2 \<otimes> g1)) x = ((\<phi> g2) \<otimes>\<^bsub>BijGroup E\<^esub> (\<phi> g1)) x"
   156   have "(\<phi> (g2 \<otimes> g1)) x = ((\<phi> g2) \<otimes>\<^bsub>BijGroup E\<^esub> (\<phi> g1)) x"
   162     using g1 g2 group_hom group_hom.hom_mult by fastforce
   157     using g1 g2 group_hom group_hom.hom_mult by fastforce
   163   also have " ... = (\<phi> g2) ((\<phi> g1) x)"
   158   also have " ... = (\<phi> g2) ((\<phi> g1) x)"
   164     using composition_rule assms(1) calculation g1 g2 by auto
   159     using composition_rule assms(1) calculation g1 g2 by auto
   165   finally have "(\<phi> (g2 \<otimes> g1)) x = z"
   160   finally have "(\<phi> (g2 \<otimes> g1)) x = z"
   168     using g1 g2 orbit_def by force 
   163     using g1 g2 orbit_def by force 
   169 qed
   164 qed
   170 
   165 
   171 lemma (in group_action) orbits_as_classes:
   166 lemma (in group_action) orbits_as_classes:
   172   "classes\<^bsub>\<lparr> carrier = E, eq = \<lambda>x. \<lambda>y. y \<in> orbit G \<phi> x \<rparr>\<^esub> = orbits G E \<phi>"
   167   "classes\<^bsub>\<lparr> carrier = E, eq = \<lambda>x. \<lambda>y. y \<in> orbit G \<phi> x \<rparr>\<^esub> = orbits G E \<phi>"
   173   unfolding eq_classes_def eq_class_of_def orbits_def apply simp
   168   unfolding eq_classes_def eq_class_of_def orbits_def orbit_def 
   174 proof -
   169   using element_image by auto
   175   have "\<And>x. x \<in> E \<Longrightarrow> {y \<in> E. y \<in> orbit G \<phi> x} = orbit G \<phi> x"
       
   176     by (smt Collect_cong element_image mem_Collect_eq orbit_def)
       
   177   thus "{{y \<in> E. y \<in> orbit G \<phi> x} |x. x \<in> E} = {orbit G \<phi> x |x. x \<in> E}" by blast
       
   178 qed
       
   179 
   170 
   180 theorem (in group_action) orbit_partition:
   171 theorem (in group_action) orbit_partition:
   181   "partition E (orbits G E \<phi>)"
   172   "partition E (orbits G E \<phi>)"
   182 proof -
   173 proof -
   183   have "equivalence \<lparr> carrier = E, eq = \<lambda>x. \<lambda>y. y \<in> orbit G \<phi> x \<rparr>"
   174   have "equivalence \<lparr> carrier = E, eq = \<lambda>x. \<lambda>y. y \<in> orbit G \<phi> x \<rparr>"
   720   qed
   711   qed
   721 next
   712 next
   722   show " \<And> x y. \<lbrakk> x \<in> inv g <# H #> g; y \<in> inv g <# H #> g \<rbrakk> \<Longrightarrow> x \<otimes> y \<in> inv g <# H #> g"
   713   show " \<And> x y. \<lbrakk> x \<in> inv g <# H #> g; y \<in> inv g <# H #> g \<rbrakk> \<Longrightarrow> x \<otimes> y \<in> inv g <# H #> g"
   723   proof -
   714   proof -
   724     fix x y assume "x \<in> inv g <# H #> g"  "y \<in> inv g <# H #> g"
   715     fix x y assume "x \<in> inv g <# H #> g"  "y \<in> inv g <# H #> g"
   725     hence "\<exists> h1 \<in> H. \<exists> h2 \<in> H. x = (inv g) \<otimes> h1 \<otimes> g \<and> y = (inv g) \<otimes> h2 \<otimes> g"
   716     then obtain h1 h2 where h12: "h1 \<in> H" "h2 \<in> H" and "x = (inv g) \<otimes> h1 \<otimes> g \<and> y = (inv g) \<otimes> h2 \<otimes> g"
   726       unfolding l_coset_def r_coset_def by blast
   717       unfolding l_coset_def r_coset_def by blast
   727     hence "\<exists> h1 \<in> H. \<exists> h2 \<in> H. x \<otimes> y = ((inv g) \<otimes> h1 \<otimes> g) \<otimes> ((inv g) \<otimes> h2 \<otimes> g)" by blast
   718     hence "x \<otimes> y = ((inv g) \<otimes> h1 \<otimes> g) \<otimes> ((inv g) \<otimes> h2 \<otimes> g)" by blast
   728     hence "\<exists> h1 \<in> H. \<exists> h2 \<in> H. x \<otimes> y = ((inv g) \<otimes> (h1 \<otimes> h2) \<otimes> g)"
   719     also have "\<dots> = ((inv g) \<otimes> h1 \<otimes> (g \<otimes> inv g) \<otimes> h2 \<otimes> g)"
   729       using assms is_group inv_closed l_one m_assoc m_closed
   720       using h12 assms inv_closed  m_assoc m_closed subgroup.mem_carrier [OF \<open>subgroup H G\<close>] by presburger 
   730             monoid_axioms r_inv subgroup.mem_carrier by smt
   721     also have "\<dots> = ((inv g) \<otimes> (h1 \<otimes> h2) \<otimes> g)"
   731     hence "\<exists> h \<in> H. x \<otimes> y = (inv g) \<otimes> h \<otimes> g"
   722       by (simp add: h12 assms m_assoc subgroup.mem_carrier [OF \<open>subgroup H G\<close>])
   732       by (meson assms(2) subgroup_def)
   723     finally have "\<exists> h \<in> H. x \<otimes> y = (inv g) \<otimes> h \<otimes> g"
       
   724       by (meson assms(2) h12 subgroup_def)
   733     thus "x \<otimes> y \<in> inv g <# H #> g"
   725     thus "x \<otimes> y \<in> inv g <# H #> g"
   734       unfolding l_coset_def r_coset_def by blast
   726       unfolding l_coset_def r_coset_def by blast
   735   qed
   727   qed
   736 next
   728 next
   737   show "\<And>x. x \<in> inv g <# H #> g \<Longrightarrow> inv x \<in> inv g <# H #> g"
   729   show "\<And>x. x \<in> inv g <# H #> g \<Longrightarrow> inv x \<in> inv g <# H #> g"
   739     fix x assume "x \<in> inv g <# H #> g"
   731     fix x assume "x \<in> inv g <# H #> g"
   740     hence "\<exists>h \<in> H. x = (inv g) \<otimes> h \<otimes> g"
   732     hence "\<exists>h \<in> H. x = (inv g) \<otimes> h \<otimes> g"
   741       unfolding r_coset_def l_coset_def by blast
   733       unfolding r_coset_def l_coset_def by blast
   742     then obtain h where h: "h \<in> H \<and> x = (inv g) \<otimes> h \<otimes> g" by blast
   734     then obtain h where h: "h \<in> H \<and> x = (inv g) \<otimes> h \<otimes> g" by blast
   743     hence "x \<otimes> (inv g) \<otimes> (inv h) \<otimes> g = \<one>"
   735     hence "x \<otimes> (inv g) \<otimes> (inv h) \<otimes> g = \<one>"
   744       using assms inv_closed m_assoc m_closed monoid_axioms
   736       using assms m_assoc monoid_axioms by (simp add: subgroup.mem_carrier)
   745             r_inv r_one subgroup.mem_carrier by smt
       
   746     hence "inv x = (inv g) \<otimes> (inv h) \<otimes> g"
   737     hence "inv x = (inv g) \<otimes> (inv h) \<otimes> g"
   747       using assms h inv_closed inv_inv inv_mult_group m_assoc
   738       using assms h inv_mult_group m_assoc monoid_axioms by (simp add: subgroup.mem_carrier)
   748             m_closed monoid_axioms subgroup.mem_carrier by smt
       
   749     moreover have "inv h \<in> H"
   739     moreover have "inv h \<in> H"
   750       by (simp add: assms h subgroup.m_inv_closed)
   740       by (simp add: assms h subgroup.m_inv_closed)
   751     ultimately show "inv x \<in> inv g <# H #> g" unfolding r_coset_def l_coset_def by blast
   741     ultimately show "inv x \<in> inv g <# H #> g" unfolding r_coset_def l_coset_def by blast
   752   qed
   742   qed
   753 qed
   743 qed
   841     by (simp add: assms l_coset_subset_G r_coset_subset_G subgroup_conjugation_is_surj0)
   831     by (simp add: assms l_coset_subset_G r_coset_subset_G subgroup_conjugation_is_surj0)
   842   hence "\<And>H. H \<in> {H. H \<subseteq> carrier G} \<Longrightarrow> \<exists>H' \<in> {H. H \<subseteq> carrier G}. ?\<phi> H' = H"
   832   hence "\<And>H. H \<in> {H. H \<subseteq> carrier G} \<Longrightarrow> \<exists>H' \<in> {H. H \<subseteq> carrier G}. ?\<phi> H' = H"
   843     by (metis assms l_coset_subset_G mem_Collect_eq r_coset_subset_G subgroup_def subgroup_self)
   833     by (metis assms l_coset_subset_G mem_Collect_eq r_coset_subset_G subgroup_def subgroup_self)
   844   hence "{H. H \<subseteq> carrier G} \<subseteq> ?\<phi> ` {H. H \<subseteq> carrier G}" by blast
   834   hence "{H. H \<subseteq> carrier G} \<subseteq> ?\<phi> ` {H. H \<subseteq> carrier G}" by blast
   845   moreover have "?\<phi> ` {H. H \<subseteq> carrier G} \<subseteq> {H. H \<subseteq> carrier G}"
   835   moreover have "?\<phi> ` {H. H \<subseteq> carrier G} \<subseteq> {H. H \<subseteq> carrier G}"
   846     by (smt assms image_subsetI inv_closed l_coset_subset_G
   836     by clarsimp (meson assms contra_subsetD inv_closed l_coset_subset_G r_coset_subset_G)
   847             mem_Collect_eq r_coset_subset_G restrict_apply')
       
   848   ultimately show "?\<phi> ` {H. H \<subseteq> carrier G} = {H. H \<subseteq> carrier G}" by simp
   837   ultimately show "?\<phi> ` {H. H \<subseteq> carrier G} = {H. H \<subseteq> carrier G}" by simp
   849 qed
   838 qed
   850 
   839 
   851 lemma (in group) subset_conjugation_is_hom:
   840 lemma (in group) subset_conjugation_is_hom:
   852   "(\<lambda>g. \<lambda>H \<in> {H. H \<subseteq> carrier G}. g <# H #> (inv g)) \<in> hom G (BijGroup {H. H \<subseteq> carrier G})"
   841   "(\<lambda>g. \<lambda>H \<in> {H. H \<subseteq> carrier G}. g <# H #> (inv g)) \<in> hom G (BijGroup {H. H \<subseteq> carrier G})"