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})" |