# HG changeset patch # User paulson # Date 1677517799 0 # Node ID c2013f617a7081d1aa9f213a7fb0ebd9a925583c # Parent aac23f2e7f3c4207bf6d5810aa163a17f385867a Importation of basic group theory results, due to Jakob von Raumer from his AFP entry Jordan-Hölder Theorem diff -r aac23f2e7f3c -r c2013f617a70 src/HOL/Algebra/Algebra.thy --- a/src/HOL/Algebra/Algebra.thy Sun Feb 26 21:17:53 2023 +0000 +++ b/src/HOL/Algebra/Algebra.thy Mon Feb 27 17:09:59 2023 +0000 @@ -3,6 +3,6 @@ theory Algebra imports Sylow Chinese_Remainder Zassenhaus Galois_Connection Generated_Fields Free_Abelian_Groups Divisibility Embedded_Algebras IntRing Sym_Groups Exact_Sequence Polynomials Algebraic_Closure - Left_Coset + Left_Coset SimpleGroups SndIsomorphismGrp begin end diff -r aac23f2e7f3c -r c2013f617a70 src/HOL/Algebra/Coset.thy --- a/src/HOL/Algebra/Coset.thy Sun Feb 26 21:17:53 2023 +0000 +++ b/src/HOL/Algebra/Coset.thy Mon Feb 27 17:09:59 2023 +0000 @@ -39,7 +39,7 @@ "H \ G \ normal H G" lemma (in comm_group) subgroup_imp_normal: "subgroup A G \ A \ G" - by (simp add: normal_def normal_axioms_def is_group l_coset_def r_coset_def m_comm subgroup.mem_carrier) + by (simp add: normal_def normal_axioms_def l_coset_def r_coset_def m_comm subgroup.mem_carrier) lemma l_coset_eq_set_mult: \<^marker>\contributor \Martin Baillon\\ fixes G (structure) @@ -468,13 +468,65 @@ using assms normal_inv_iff apply blast by (simp add: assms normal.inv_op_closed2) +lemma (in group) one_is_normal: "{\} \ G" + using normal_invI triv_subgroup by force -lemma (in group) one_is_normal: "{\} \ G" -proof(intro normal_invI) - show "subgroup {\} G" - by (simp add: subgroup_def) -qed simp +text \The intersection of two normal subgroups is, again, a normal subgroup.\ +lemma (in group) normal_subgroup_intersect: + assumes "M \ G" and "N \ G" shows "M \ N \ G" + using assms normal_inv_iff subgroups_Inter_pair by force + + +text \Being a normal subgroup is preserved by surjective homomorphisms.\ +lemma (in normal) surj_hom_normal_subgroup: + assumes \: "group_hom G F \" + assumes \surj: "\ ` (carrier G) = carrier F" + shows "(\ ` H) \ F" +proof (rule group.normalI) + show "group F" + using \ group_hom.axioms(2) by blast +next + show "subgroup (\ ` H) F" + using \ group_hom.subgroup_img_is_subgroup subgroup_axioms by blast +next + show "\x\carrier F. \ ` H #>\<^bsub>F\<^esub> x = x <#\<^bsub>F\<^esub> \ ` H" + proof + fix f + assume f: "f \ carrier F" + with \surj obtain g where g: "g \ carrier G" "f = \ g" by auto + hence "\ ` H #>\<^bsub>F\<^esub> f = \ ` H #>\<^bsub>F\<^esub> \ g" by simp + also have "... = (\x. (\ x) \\<^bsub>F\<^esub> (\ g)) ` H" + unfolding r_coset_def image_def by auto + also have "... = (\x. \ (x \ g)) ` H" + using subset g \ group_hom.hom_mult unfolding image_def by fastforce + also have "... = \ ` (H #> g)" + using \ unfolding r_coset_def by auto + also have "... = \ ` (g <# H)" + by (metis coset_eq g(1)) + also have "... = (\x. \ (g \ x)) ` H" + using \ unfolding l_coset_def by auto + also have "... = (\x. (\ g) \\<^bsub>F\<^esub> (\ x)) ` H" + using subset g \ group_hom.hom_mult by fastforce + also have "... = \ g <#\<^bsub>F\<^esub> \ ` H" + unfolding l_coset_def image_def by auto + also have "... = f <#\<^bsub>F\<^esub> \ ` H" + using g by simp + finally show "\ ` H #>\<^bsub>F\<^esub> f = f <#\<^bsub>F\<^esub> \ ` H". + qed +qed + +text \Being a normal subgroup is preserved by group isomorphisms.\ +lemma iso_normal_subgroup: + assumes \: "\ \ iso G F" "group G" "group F" "H \ G" + shows "(\ ` H) \ F" + by (meson assms Group.iso_iff group_hom_axioms_def group_hom_def normal.surj_hom_normal_subgroup) + +text \The set product of two normal subgroups is a normal subgroup.\ +lemma (in group) setmult_lcos_assoc: + "\H \ carrier G; K \ carrier G; x \ carrier G\ + \ (x <# H) <#> K = x <# (H <#> K)" + by (force simp add: l_coset_def set_mult_def m_assoc) subsection\More Properties of Left Cosets\ @@ -770,8 +822,17 @@ order :: "('a, 'b) monoid_scheme \ nat" where "order S = card (carrier S)" +lemma iso_same_order: + assumes "\ \ iso G H" + shows "order G = order H" + by (metis assms is_isoI iso_same_card order_def order_def) + lemma (in monoid) order_gt_0_iff_finite: "0 < order G \ finite (carrier G)" -by(auto simp add: order_def card_gt_0_iff) + by(auto simp add: order_def card_gt_0_iff) + +lemma (in group) order_one_triv_iff: + shows "(order G = 1) = (carrier G = {\})" + by (metis One_nat_def card.empty card_Suc_eq empty_iff one_closed order_def singleton_iff) lemma (in group) rcosets_part_G: assumes "subgroup H G" @@ -889,6 +950,11 @@ qed qed +text \The cardinality of the right cosets of the trivial subgroup is the cardinality of the group itself:\ +corollary (in group) card_rcosets_triv: + assumes "finite (carrier G)" + shows "card (rcosets {\}) = order G" + using lagrange triv_subgroup by fastforce subsection \Quotient Groups: Factorization of a Group\ @@ -1523,7 +1589,7 @@ subsubsection "More Lemmas about set multiplication" -(*A group multiplied by a subgroup stays the same*) +text \A group multiplied by a subgroup stays the same\ lemma (in group) set_mult_carrier_idem: assumes "subgroup H G" shows "(carrier G) <#> H = carrier G" @@ -1537,13 +1603,13 @@ ultimately show "carrier G \ (carrier G) <#> H" by simp qed -(*Same lemma as above, but everything is included in a subgroup*) +text \Same lemma as above, but everything is included in a subgroup\ lemma (in group) set_mult_subgroup_idem: assumes HG: "subgroup H G" and NG: "subgroup N (G \ carrier := H \)" shows "H <#> N = H" using group.set_mult_carrier_idem[OF subgroup.subgroup_is_group[OF HG group_axioms] NG] by simp -(*A normal subgroup is commutative with set_mult*) +text \A normal subgroup is commutative with set_mult\ lemma (in group) commut_normal: assumes "subgroup H G" and "N\G" shows "H<#>N = N<#>H" @@ -1554,22 +1620,22 @@ ultimately show "H<#>N = N<#>H" by simp qed -(*Same lemma as above, but everything is included in a subgroup*) +text \Same lemma as above, but everything is included in a subgroup\ lemma (in group) commut_normal_subgroup: assumes "subgroup H G" and "N \ (G\ carrier := H \)" and "subgroup K (G \ carrier := H \)" shows "K <#> N = N <#> K" - using group.commut_normal[OF subgroup.subgroup_is_group[OF assms(1) group_axioms] assms(3,2)] by simp - + by (metis assms(2) assms(3) group.commut_normal normal.axioms(2) set_mult_consistent) subsubsection "Lemmas about intersection and normal subgroups" +text \Mostly by Jakob von Raumer\ lemma (in group) normal_inter: assumes "subgroup H G" and "subgroup K G" and "H1\G\carrier := H\" - shows " (H1\K)\(G\carrier:= (H\K)\)" + shows "(H1\K)\(G\carrier:= (H\K)\)" proof- define HK and H1K and GH and GHK where "HK = H\K" and "H1K=H1\K" and "GH =G\carrier := H\" and "GHK = (G\carrier:= (H\K)\)" @@ -1647,4 +1713,337 @@ by auto qed +lemma (in group) normal_restrict_supergroup: + assumes "subgroup S G" "N \ G" "N \ S" + shows "N \ (G\carrier := S\)" + by (metis assms inf.absorb_iff1 normal_Int_subgroup) + +text \A subgroup relation survives factoring by a normal subgroup.\ +lemma (in group) normal_subgroup_factorize: + assumes "N \ G" and "N \ H" and "subgroup H G" + shows "subgroup (rcosets\<^bsub>G\carrier := H\\<^esub> N) (G Mod N)" +proof - + interpret GModN: group "G Mod N" + using assms(1) by (rule normal.factorgroup_is_group) + have "N \ G\carrier := H\" + using assms by (metis normal_restrict_supergroup) + hence grpHN: "group (G\carrier := H\ Mod N)" + by (rule normal.factorgroup_is_group) + have "(<#>\<^bsub>G\carrier:=H\\<^esub>) = (\U K. (\h\U. \k\K. {h \\<^bsub>G\carrier := H\\<^esub> k}))" + using set_mult_def by metis + moreover have "\ = (\U K. (\h\U. \k\K. {h \\<^bsub>G\<^esub> k}))" + by auto + moreover have "(<#>) = (\U K. (\h\U. \k\K. {h \ k}))" + using set_mult_def by metis + ultimately have "(<#>\<^bsub>G\carrier:=H\\<^esub>) = (<#>\<^bsub>G\<^esub>)" + by simp + with grpHN have "group ((G Mod N)\carrier := (rcosets\<^bsub>G\carrier := H\\<^esub> N)\)" + unfolding FactGroup_def by auto + moreover have "rcosets\<^bsub>G\carrier := H\\<^esub> N \ carrier (G Mod N)" + unfolding FactGroup_def RCOSETS_def r_coset_def using assms(3) subgroup.subset + by fastforce + ultimately show ?thesis + using GModN.group_incl_imp_subgroup by blast +qed + +text \A normality relation survives factoring by a normal subgroup.\ +lemma (in group) normality_factorization: + assumes NG: "N \ G" and NH: "N \ H" and HG: "H \ G" + shows "(rcosets\<^bsub>G\carrier := H\\<^esub> N) \ (G Mod N)" +proof - + from assms(1) interpret GModN: group "G Mod N" by (metis normal.factorgroup_is_group) + show ?thesis + unfolding GModN.normal_inv_iff + proof (intro conjI strip) + show "subgroup (rcosets\<^bsub>G\carrier := H\\<^esub> N) (G Mod N)" + using assms normal_imp_subgroup normal_subgroup_factorize by force + next + fix U V + assume U: "U \ carrier (G Mod N)" and V: "V \ rcosets\<^bsub>G\carrier := H\\<^esub> N" + then obtain g where g: "g \ carrier G" "U = N #> g" + unfolding FactGroup_def RCOSETS_def by auto + from V obtain h where h: "h \ H" "V = N #> h" + unfolding FactGroup_def RCOSETS_def r_coset_def by auto + hence hG: "h \ carrier G" + using HG normal_imp_subgroup subgroup.mem_carrier by force + hence ghG: "g \ h \ carrier G" + using g m_closed by auto + from g h have "g \ h \ inv g \ H" + using HG normal_inv_iff by auto + moreover have "U <#> V <#> inv\<^bsub>G Mod N\<^esub> U = N #> (g \ h \ inv g)" + proof - + from g U have "inv\<^bsub>G Mod N\<^esub> U = N #> inv g" + using NG normal.inv_FactGroup normal.rcos_inv by fastforce + hence "U <#> V <#> inv\<^bsub>G Mod N\<^esub> U = (N #> g) <#> (N #> h) <#> (N #> inv g)" + using g h by simp + also have "\ = N #> (g \ h \ inv g)" + using g hG NG inv_closed ghG normal.rcos_sum by force + finally show ?thesis . + qed + ultimately show "U \\<^bsub>G Mod N\<^esub> V \\<^bsub>G Mod N\<^esub> inv\<^bsub>G Mod N\<^esub> U \ rcosets\<^bsub>G\carrier := H\\<^esub> N" + unfolding RCOSETS_def r_coset_def by auto + qed +qed + +text \Factorizing by the trivial subgroup is an isomorphism.\ +lemma (in group) trivial_factor_iso: + shows "the_elem \ iso (G Mod {\}) G" +proof - + have "group_hom G G (\x. x)" + unfolding group_hom_def group_hom_axioms_def hom_def using is_group by simp + moreover have "(\x. x) ` carrier G = carrier G" + by simp + moreover have "kernel G G (\x. x) = {\}" + unfolding kernel_def by auto + ultimately show ?thesis using group_hom.FactGroup_iso_set + by force +qed + +text \And the dual theorem to the previous one: Factorizing by the group itself gives the trivial group\ + +lemma (in group) self_factor_iso: + shows "(\X. the_elem ((\x. \) ` X)) \ iso (G Mod (carrier G)) (G\ carrier := {\} \)" +proof - + have "group (G\carrier := {\}\)" + by (metis subgroup_imp_group triv_subgroup) + hence "group_hom G (G\carrier := {\}\) (\x. \)" + unfolding group_hom_def group_hom_axioms_def hom_def using is_group by auto + moreover have "(\x. \) ` carrier G = carrier (G\carrier := {\}\)" + by auto + moreover have "kernel G (G\carrier := {\}\) (\x. \) = carrier G" + unfolding kernel_def by auto + ultimately show ?thesis using group_hom.FactGroup_iso_set + by force +qed + +text \Factoring by a normal subgroups yields the trivial group iff the subgroup is the whole group.\ +lemma (in normal) fact_group_trivial_iff: + assumes "finite (carrier G)" + shows "(carrier (G Mod H) = {\\<^bsub>G Mod H\<^esub>}) \ (H = carrier G)" +proof + assume "carrier (G Mod H) = {\\<^bsub>G Mod H\<^esub>}" + moreover have "order (G Mod H) * card H = order G" + by (simp add: FactGroup_def lagrange order_def subgroup_axioms) + ultimately have "card H = order G" unfolding order_def by auto + thus "H = carrier G" + by (simp add: assms card_subset_eq order_def subset) +next + assume "H = carrier G" + with assms is_subgroup lagrange + have "card (rcosets H) * order G = order G" + by (simp add: order_def) + then have "card (rcosets H) = 1" + using assms order_gt_0_iff_finite by auto + hence "order (G Mod H) = 1" + unfolding order_def FactGroup_def by auto + thus "carrier (G Mod H) = {\\<^bsub>G Mod H\<^esub>}" + using factorgroup_is_group by (metis group.order_one_triv_iff) +qed + +text \The union of all the cosets contained in a subgroup of a quotient group acts as a represenation for that subgroup.\ + +lemma (in normal) factgroup_subgroup_union_char: + assumes "subgroup A (G Mod H)" + shows "(\A) = {x \ carrier G. H #> x \ A}" +proof + show "\A \ {x \ carrier G. H #> x \ A}" + proof + fix x + assume x: "x \ \A" + then obtain a where a: "a \ A" "x \ a" and xx: "x \ carrier G" + using subgroup.subset assms by (force simp add: FactGroup_def RCOSETS_def r_coset_def) + from assms a obtain y where y: "y \ carrier G" "a = H #> y" + using subgroup.subset unfolding FactGroup_def RCOSETS_def by force + with a have "x \ H #> y" by simp + hence "H #> y = H #> x" using y is_subgroup repr_independence by auto + with y(2) a(1) have "H #> x \ A" + by auto + with xx show "x \ {x \ carrier G. H #> x \ A}" by simp + qed +next + show "{x \ carrier G. H #> x \ A} \ \A" + using rcos_self subgroup_axioms by auto +qed + +lemma (in normal) factgroup_subgroup_union_subgroup: + assumes "subgroup A (G Mod H)" + shows "subgroup (\A) G" +proof - + have "subgroup {x \ carrier G. H #> x \ A} G" + proof + show "{x \ carrier G. H #> x \ A} \ carrier G" by auto + next + fix x y + assume xy: "x \ {x \ carrier G. H #> x \ A}" "y \ {x \ carrier G. H #> x \ A}" + then have "(H #> x) <#> (H #> y) \ A" + using subgroup.m_closed assms unfolding FactGroup_def by fastforce + hence "H #> (x \ y) \ A" + using xy rcos_sum by force + with xy show "x \ y \ {x \ carrier G. H #> x \ A}" by blast + next + have "H #> \ \ A" + using assms subgroup.one_closed subset by fastforce + with assms one_closed show "\ \ {x \ carrier G. H #> x \ A}" by simp + next + fix x + assume x: "x \ {x \ carrier G. H #> x \ A}" + hence invx: "inv x \ carrier G" using inv_closed by simp + from assms x have "set_inv (H #> x) \ A" using subgroup.m_inv_closed + using inv_FactGroup subgroup.mem_carrier by fastforce + with invx show "inv x \ {x \ carrier G. H #> x \ A}" + using rcos_inv x by force + qed + with assms factgroup_subgroup_union_char show ?thesis by auto +qed + +lemma (in normal) factgroup_subgroup_union_normal: + assumes "A \ (G Mod H)" + shows "\A \ G" +proof - + have "{x \ carrier G. H #> x \ A} \ G" + unfolding normal_def normal_axioms_def + proof (intro conjI strip) + from assms show "subgroup {x \ carrier G. H #> x \ A} G" + by (metis (full_types) factgroup_subgroup_union_char factgroup_subgroup_union_subgroup normal_imp_subgroup) + next + interpret Anormal: normal A "(G Mod H)" using assms by simp + show "{x \ carrier G. H #> x \ A} #> x = x <# {x \ carrier G. H #> x \ A}" if x: "x \ carrier G" for x + proof - + { fix y + assume y: "y \ {x \ carrier G. H #> x \ A} #> x" + then obtain x' where x': "x' \ carrier G" "H #> x' \ A" "y = x' \ x" + unfolding r_coset_def by auto + from x(1) have Hx: "H #> x \ carrier (G Mod H)" + unfolding FactGroup_def RCOSETS_def by force + with x' have "(inv\<^bsub>G Mod H\<^esub> (H #> x)) \\<^bsub>G Mod H\<^esub> (H #> x') \\<^bsub>G Mod H\<^esub> (H #> x) \ A" + using Anormal.inv_op_closed1 by auto + hence "(set_inv (H #> x)) <#> (H #> x') <#> (H #> x) \ A" + using inv_FactGroup Hx unfolding FactGroup_def by auto + hence "(H #> (inv x)) <#> (H #> x') <#> (H #> x) \ A" + using x(1) by (metis rcos_inv) + hence "H #> (inv x \ x' \ x) \ A" + by (metis inv_closed m_closed rcos_sum x'(1) x(1)) + moreover have "inv x \ x' \ x \ carrier G" + using x x' by (metis inv_closed m_closed) + ultimately have xcoset: "x \ (inv x \ x' \ x) \ x <# {x \ carrier G. H #> x \ A}" + unfolding l_coset_def using x(1) by auto + have "x \ (inv x \ x' \ x) = (x \ inv x) \ x' \ x" + by (metis Units_eq Units_inv_Units m_assoc m_closed x'(1) x(1)) + also have "\ = y" + by (simp add: x x') + finally have "x \ (inv x \ x' \ x) = y" . + with xcoset have "y \ x <# {x \ carrier G. H #> x \ A}" by auto} + moreover + { fix y + assume y: "y \ x <# {x \ carrier G. H #> x \ A}" + then obtain x' where x': "x' \ carrier G" "H #> x' \ A" "y = x \ x'" unfolding l_coset_def by auto + from x(1) have invx: "inv x \ carrier G" + by (rule inv_closed) + hence Hinvx: "H #> (inv x) \ carrier (G Mod H)" + unfolding FactGroup_def RCOSETS_def by force + with x' have "(inv\<^bsub>G Mod H\<^esub> (H #> inv x)) \\<^bsub>G Mod H\<^esub> (H #> x') \\<^bsub>G Mod H\<^esub> (H #> inv x) \ A" + using invx Anormal.inv_op_closed1 by auto + hence "(set_inv (H #> inv x)) <#> (H #> x') <#> (H #> inv x) \ A" + using inv_FactGroup Hinvx unfolding FactGroup_def by auto + hence "H #> (x \ x' \ inv x) \ A" + by (simp add: rcos_inv rcos_sum x x'(1)) + moreover have "x \ x' \ inv x \ carrier G" using x x' by (metis inv_closed m_closed) + ultimately have xcoset: "(x \ x' \ inv x) \ x \ {x \ carrier G. H #> x \ A} #> x" + unfolding r_coset_def using invx by auto + have "(x \ x' \ inv x) \ x = (x \ x') \ (inv x \ x)" + by (metis Units_eq Units_inv_Units m_assoc m_closed x'(1) x(1)) + also have "\ = y" + by (simp add: x x') + finally have "x \ x' \ inv x \ x = y". + with xcoset have "y \ {x \ carrier G. H #> x \ A} #> x" by auto } + ultimately show ?thesis + by auto + qed + qed auto + with assms show ?thesis + by (metis (full_types) factgroup_subgroup_union_char normal_imp_subgroup) +qed + +lemma (in normal) factgroup_subgroup_union_factor: + assumes "subgroup A (G Mod H)" + shows "A = rcosets\<^bsub>G\carrier := \A\\<^esub> H" + using assms subgroup.mem_carrier factgroup_subgroup_union_char by (fastforce simp: RCOSETS_def FactGroup_def) + + +section \Flattening the type of group carriers\ + +text \Flattening here means to convert the type of group elements from 'a set to 'a. +This is possible whenever the empty set is not an element of the group. By Jakob von Raumer\ + + +definition flatten where + "flatten (G::('a set, 'b) monoid_scheme) rep = \carrier=(rep ` (carrier G)), + monoid.mult=(\ x y. rep ((the_inv_into (carrier G) rep x) \\<^bsub>G\<^esub> (the_inv_into (carrier G) rep y))), + one=rep \\<^bsub>G\<^esub> \" + +lemma flatten_set_group_hom: + assumes group: "group G" + assumes inj: "inj_on rep (carrier G)" + shows "rep \ hom G (flatten G rep)" + by (force simp add: hom_def flatten_def inj the_inv_into_f_f) + +lemma flatten_set_group: + assumes "group G" "inj_on rep (carrier G)" + shows "group (flatten G rep)" +proof (rule groupI) + fix x y + assume "x \ carrier (flatten G rep)" and "y \ carrier (flatten G rep)" + then show "x \\<^bsub>flatten G rep\<^esub> y \ carrier (flatten G rep)" + using assms group.surj_const_mult the_inv_into_f_f by (fastforce simp: flatten_def) +next + show "\\<^bsub>flatten G rep\<^esub> \ carrier (flatten G rep)" + unfolding flatten_def by (simp add: assms group.is_monoid) +next + fix x y z + assume "x \ carrier (flatten G rep)" "y \ carrier (flatten G rep)" "z \ carrier (flatten G rep)" + then show "x \\<^bsub>flatten G rep\<^esub> y \\<^bsub>flatten G rep\<^esub> z = x \\<^bsub>flatten G rep\<^esub> (y \\<^bsub>flatten G rep\<^esub> z)" + by (auto simp: assms flatten_def group.is_monoid monoid.m_assoc monoid.m_closed the_inv_into_f_f) +next + fix x + assume x: "x \ carrier (flatten G rep)" + then show "\\<^bsub>flatten G rep\<^esub> \\<^bsub>flatten G rep\<^esub> x = x" + by (auto simp: assms group.is_monoid the_inv_into_f_f flatten_def) + then have "\y\carrier G. rep (y \\<^bsub>G\<^esub> z) = rep \\<^bsub>G\<^esub>" if "z \ carrier G" for z + by (metis \group G\ group.l_inv_ex that) + with assms x show "\y\carrier (flatten G rep). y \\<^bsub>flatten G rep\<^esub> x = \\<^bsub>flatten G rep\<^esub>" + by (auto simp: flatten_def the_inv_into_f_f) +qed + +lemma (in normal) flatten_set_group_mod_inj: + shows "inj_on (\U. SOME g. g \ U) (carrier (G Mod H))" +proof (rule inj_onI) + fix U V + assume U: "U \ carrier (G Mod H)" and V: "V \ carrier (G Mod H)" + then obtain g h where g: "U = H #> g" "g \ carrier G" and h: "V = H #> h" "h \ carrier G" + unfolding FactGroup_def RCOSETS_def by auto + hence notempty: "U \ {}" "V \ {}" + by (metis empty_iff is_subgroup rcos_self)+ + assume "(SOME g. g \ U) = (SOME g. g \ V)" + with notempty have "(SOME g. g \ U) \ U \ V" + by (metis IntI ex_in_conv someI) + thus "U = V" + by (metis Int_iff g h is_subgroup repr_independence) +qed + +lemma (in normal) flatten_set_group_mod: + shows "group (flatten (G Mod H) (\U. SOME g. g \ U))" + by (simp add: factorgroup_is_group flatten_set_group flatten_set_group_mod_inj) + +lemma (in normal) flatten_set_group_mod_iso: + shows "(\U. SOME g. g \ U) \ iso (G Mod H) (flatten (G Mod H) (\U. SOME g. g \ U))" +proof - + have "(\U. SOME g. g \ U) \ hom (G Mod H) (flatten (G Mod H) (\U. SOME g. g \ U))" + using factorgroup_is_group flatten_set_group_hom flatten_set_group_mod_inj by blast + moreover + have "inj_on (\U. SOME g. g \ U) (carrier (G Mod H))" + using flatten_set_group_mod_inj by blast + ultimately show ?thesis + by (simp add: iso_def bij_betw_def flatten_def) +qed + end diff -r aac23f2e7f3c -r c2013f617a70 src/HOL/Algebra/Group.thy --- a/src/HOL/Algebra/Group.thy Sun Feb 26 21:17:53 2023 +0000 +++ b/src/HOL/Algebra/Group.thy Mon Feb 27 17:09:59 2023 +0000 @@ -674,6 +674,9 @@ by (rule monoid.group_l_invI) (auto intro: l_inv mem_carrier) qed +lemma (in group) triv_subgroup: "subgroup {\} G" + by (auto simp: subgroup_def) + lemma subgroup_is_submonoid: assumes "subgroup H G" shows "submonoid H G" using assms by (auto intro: submonoid.intro simp add: subgroup_def) @@ -1362,6 +1365,12 @@ using group_hom.img_is_subgroup[of "G \ carrier := I \" H h] by simp qed +lemma (in subgroup) iso_subgroup: \<^marker>\contributor \Jakob von Raumer\\ + assumes "group G" "group F" + assumes "\ \ iso G F" + shows "subgroup (\ ` H) F" + by (metis assms Group.iso_iff group_hom.intro group_hom_axioms_def group_hom.subgroup_img_is_subgroup subgroup_axioms) + lemma (in group_hom) induced_group_hom: \<^marker>\contributor \Paulo Emílio de Vilhena\\ assumes "subgroup I G" shows "group_hom (G \ carrier := I \) (H \ carrier := h ` I \) h" @@ -1374,6 +1383,24 @@ subgroup.subgroup_is_group[OF subgroup_img_is_subgroup[OF assms] is_group] by simp qed +text \An isomorphism restricts to an isomorphism of subgroups.\ + +lemma iso_restrict: + assumes "\ \ iso G F" + assumes groups: "group G" "group F" + assumes HG: "subgroup H G" + shows "(restrict \ H) \ iso (G\carrier := H\) (F\carrier := \ ` H\)" +proof - + have "\x y. \x \ H; y \ H; x \\<^bsub>G\<^esub> y \ H\ \ \ (x \\<^bsub>G\<^esub> y) = \ x \\<^bsub>F\<^esub> \ y" + by (meson assms hom_mult iso_imp_homomorphism subgroup.mem_carrier) + moreover have "\x y. \x \ H; y \ H; x \\<^bsub>G\<^esub> y \ H\ \ \ x \\<^bsub>F\<^esub> \ y = undefined" + by (simp add: HG subgroup.m_closed) + moreover have "\x y. \x \ H; y \ H; \ x = \ y\ \ x = y" + by (smt (verit, ccfv_SIG) assms group.iso_iff_group_isomorphisms group_isomorphisms_def subgroup.mem_carrier) + ultimately show ?thesis + by (auto simp: iso_def hom_def bij_betw_def inj_on_def) +qed + lemma (in group) canonical_inj_is_hom: \<^marker>\contributor \Paulo Emílio de Vilhena\\ assumes "subgroup H G" shows "group_hom (G \ carrier := H \) G id" @@ -1636,9 +1663,8 @@ qed lemma (in group) subgroups_Inter_pair : - assumes "subgroup I G" - and "subgroup J G" - shows "subgroup (I\J) G" using subgroups_Inter[ where ?A = "{I,J}"] assms by auto + assumes "subgroup I G" "subgroup J G" shows "subgroup (I\J) G" + using subgroups_Inter[ where ?A = "{I,J}"] assms by auto theorem (in group) subgroups_complete_lattice: "complete_lattice \carrier = {H. subgroup H G}, eq = (=), le = (\)\" diff -r aac23f2e7f3c -r c2013f617a70 src/HOL/Algebra/SimpleGroups.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Algebra/SimpleGroups.thy Mon Feb 27 17:09:59 2023 +0000 @@ -0,0 +1,95 @@ +(* Title: Simple Groups + Author: Jakob von Raumer, Karlsruhe Institute of Technology + Maintainer: Jakob von Raumer +*) + +theory SimpleGroups +imports Coset "HOL-Computational_Algebra.Primes" +begin + +section \Simple Groups\ + +locale simple_group = group + + assumes order_gt_one: "order G > 1" + assumes no_real_normal_subgroup: "\H. H \ G \ (H = carrier G \ H = {\})" + +lemma (in simple_group) is_simple_group: "simple_group G" + by (rule simple_group_axioms) + +text \Simple groups are non-trivial.\ + +lemma (in simple_group) simple_not_triv: "carrier G \ {\}" + using order_gt_one unfolding order_def by auto + +text \Every group of prime order is simple\ + +lemma (in group) prime_order_simple: + assumes prime: "prime (order G)" + shows "simple_group G" +proof + from prime show "1 < order G" + unfolding prime_nat_iff by auto +next + fix H + assume "H \ G" + hence HG: "subgroup H G" unfolding normal_def by simp + hence "card H dvd order G" + by (metis dvd_triv_right lagrange) + with prime have "card H = 1 \ card H = order G" + unfolding prime_nat_iff by simp + thus "H = carrier G \ H = {\}" + proof + assume "card H = 1" + moreover from HG have "\ \ H" by (metis subgroup.one_closed) + ultimately show ?thesis by (auto simp: card_Suc_eq) + next + assume "card H = order G" + moreover from HG have "H \ carrier G" unfolding subgroup_def by simp + moreover from prime have "finite (carrier G)" + using order_gt_0_iff_finite by force + ultimately show ?thesis + unfolding order_def by (metis card_subset_eq) + qed +qed + +text \Being simple is a property that is preserved by isomorphisms.\ + +lemma (in simple_group) iso_simple: + assumes H: "group H" + assumes iso: "\ \ iso G H" + shows "simple_group H" +unfolding simple_group_def simple_group_axioms_def +proof (intro conjI strip H) + from iso have "order G = order H" unfolding iso_def order_def using bij_betw_same_card by auto + with order_gt_one show "1 < order H" by simp +next + have inv_iso: "(inv_into (carrier G) \) \ iso H G" using iso + by (simp add: iso_set_sym) + fix N + assume NH: "N \ H" + then interpret Nnormal: normal N H by simp + define M where "M = (inv_into (carrier G) \) ` N" + hence MG: "M \ G" + using inv_iso NH H by (metis is_group iso_normal_subgroup) + have surj: "\ ` carrier G = carrier H" + using iso unfolding iso_def bij_betw_def by simp + hence MN: "\ ` M = N" + unfolding M_def using Nnormal.subset image_inv_into_cancel by metis + then have "N = {\\<^bsub>H\<^esub>}" if "M = {\}" + using Nnormal.subgroup_axioms subgroup.one_closed that by force + then show "N = carrier H \ N = {\\<^bsub>H\<^esub>}" + by (metis MG MN no_real_normal_subgroup surj) +qed + +text \As a corollary of this: Factorizing a group by itself does not result in a simple group!\ + +lemma (in group) self_factor_not_simple: "\ simple_group (G Mod (carrier G))" +proof + assume assm: "simple_group (G Mod (carrier G))" + with self_factor_iso simple_group.iso_simple have "simple_group (G\carrier := {\}\)" + using subgroup_imp_group triv_subgroup by blast + thus False + using simple_group.simple_not_triv by force +qed + +end diff -r aac23f2e7f3c -r c2013f617a70 src/HOL/Algebra/SndIsomorphismGrp.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Algebra/SndIsomorphismGrp.thy Mon Feb 27 17:09:59 2023 +0000 @@ -0,0 +1,207 @@ +(* Title: The Second Isomorphism Theorem for Groups + Author: Jakob von Raumer, Karlsruhe Institute of Technology + Maintainer: Jakob von Raumer +*) + +theory SndIsomorphismGrp +imports Coset +begin + +section \The Second Isomorphism Theorem for Groups\ + +text \This theory provides a proof of the second isomorphism theorems for groups. +The theorems consist of several facts about normal subgroups.\ + +text \The first lemma states that whenever we have a subgroup @{term S} and +a normal subgroup @{term H} of a group @{term G}, their intersection is normal +in @{term G}\ + +locale second_isomorphism_grp = normal + + fixes S:: "'a set" + assumes subgrpS: "subgroup S G" + +context second_isomorphism_grp +begin + +interpretation groupS: group "G\carrier := S\" + using subgrpS + by (metis subgroup_imp_group) + +lemma normal_subgrp_intersection_normal: + shows "S \ H \ (G\carrier := S\)" +proof(auto simp: groupS.normal_inv_iff) + from subgrpS is_subgroup have "\x. x \ {S, H} \ subgroup x G" by auto + hence "subgroup (\ {S, H}) G" using subgroups_Inter by blast + hence "subgroup (S \ H) G" by auto + moreover have "S \ H \ S" by simp + ultimately show "subgroup (S \ H) (G\carrier := S\)" + by (simp add: subgroup_incl subgrpS) +next + fix g h + assume g: "g \ S" and hH: "h \ H" and hS: "h \ S" + from g hH subgrpS show "g \ h \ inv\<^bsub>G\carrier := S\\<^esub> g \ H" + by (metis inv_op_closed2 subgroup.mem_carrier m_inv_consistent) + from g hS subgrpS show "g \ h \ inv\<^bsub>G\carrier := S\\<^esub> g \ S" + by (metis subgroup.m_closed subgroup.m_inv_closed m_inv_consistent) +qed + +lemma normal_set_mult_subgroup: + shows "subgroup (H <#> S) G" +proof(rule subgroupI) + show "H <#> S \ carrier G" + by (metis setmult_subset_G subgroup.subset subgrpS subset) +next + have "\ \ H" "\ \ S" + using is_subgroup subgrpS subgroup.one_closed by auto + hence "\ \ \ \ H <#> S" + unfolding set_mult_def by blast + thus "H <#> S \ {}" by auto +next + fix g + assume g: "g \ H <#> S" + then obtain h s where h: "h \ H" and s: "s \ S" and ghs: "g = h \ s" unfolding set_mult_def + by auto + hence "s \ carrier G" by (metis subgroup.mem_carrier subgrpS) + with h ghs obtain h' where h': "h' \ H" and "g = s \ h'" + using coset_eq unfolding r_coset_def l_coset_def by auto + with s have "inv g = (inv h') \ (inv s)" + by (metis inv_mult_group mem_carrier subgroup.mem_carrier subgrpS) + moreover from h' s subgrpS have "inv h' \ H" "inv s \ S" + using subgroup.m_inv_closed m_inv_closed by auto + ultimately show "inv g \ H <#> S" + unfolding set_mult_def by auto +next + fix g g' + assume g: "g \ H <#> S" and h: "g' \ H <#> S" + then obtain h h' s s' where hh'ss': "h \ H" "h' \ H" "s \ S" "s' \ S" and "g = h \ s" and "g' = h' \ s'" + unfolding set_mult_def by auto + hence "g \ g' = (h \ s) \ (h' \ s')" by metis + also from hh'ss' have inG: "h \ carrier G" "h' \ carrier G" "s \ carrier G" "s' \ carrier G" + using subgrpS mem_carrier subgroup.mem_carrier by force+ + hence "(h \ s) \ (h' \ s') = h \ (s \ h') \ s'" + using m_assoc by auto + also from hh'ss' inG obtain h'' where h'': "h'' \ H" and "s \ h' = h'' \ s" + using coset_eq unfolding r_coset_def l_coset_def + by fastforce + hence "h \ (s \ h') \ s' = h \ (h'' \ s) \ s'" + by simp + also from h'' inG have "... = (h \ h'') \ (s \ s')" + using m_assoc mem_carrier by auto + finally have "g \ g' = h \ h'' \ (s \ s')". + moreover have "... \ H <#> S" + unfolding set_mult_def using h'' hh'ss' subgrpS subgroup.m_closed by fastforce + ultimately show "g \ g' \ H <#> S" + by simp +qed + +lemma H_contained_in_set_mult: + shows "H \ H <#> S" +proof + fix x + assume x: "x \ H" + have "x \ \ \ H <#> S" unfolding set_mult_def + using second_isomorphism_grp.subgrpS second_isomorphism_grp_axioms subgroup.one_closed x by force + with x show "x \ H <#> S" by (metis mem_carrier r_one) +qed + +lemma S_contained_in_set_mult: + shows "S \ H <#> S" +proof + fix s + assume s: "s \ S" + then have "\ \ s \ H <#> S" unfolding set_mult_def by force + with s show "s \ H <#> S" using subgrpS subgroup.mem_carrier l_one by force +qed + +lemma normal_intersection_hom: + shows "group_hom (G\carrier := S\) ((G\carrier := H <#> S\) Mod H) (\g. H #> g)" +proof - + have "group ((G\carrier := H <#> S\) Mod H)" + by (simp add: H_contained_in_set_mult normal.factorgroup_is_group normal_axioms + normal_restrict_supergroup normal_set_mult_subgroup) + moreover + { fix g + assume g: "g \ S" + with g have "g \ H <#> S" + using S_contained_in_set_mult by blast + hence "H #> g \ carrier ((G\carrier := H <#> S\) Mod H)" + unfolding FactGroup_def RCOSETS_def r_coset_def by auto } + moreover + have "\x y. \x \ S; y \ S\ \ H #> x \ y = H #> x <#> (H #> y)" + using normal.rcos_sum normal_axioms subgroup.mem_carrier subgrpS by fastforce + ultimately show ?thesis + by (auto simp: group_hom_def group_hom_axioms_def hom_def) +qed + +lemma normal_intersection_hom_kernel: + shows "kernel (G\carrier := S\) ((G\carrier := H <#> S\) Mod H) (\g. H #> g) = H \ S" +proof - + have "kernel (G\carrier := S\) ((G\carrier := H <#> S\) Mod H) (\g. H #> g) + = {g \ S. H #> g = \\<^bsub>(G\carrier := H <#> S\) Mod H\<^esub>}" + unfolding kernel_def by auto + also have "... = {g \ S. H #> g = H}" + unfolding FactGroup_def by auto + also have "... = {g \ S. g \ H}" + by (meson coset_join1 is_group rcos_const subgroupE(1) subgroup_axioms subgrpS subset_eq) + also have "... = H \ S" by auto + finally show ?thesis. +qed + +lemma normal_intersection_hom_surj: + shows "(\g. H #> g) ` carrier (G\carrier := S\) = carrier ((G\carrier := H <#> S\) Mod H)" +proof auto + fix g + assume "g \ S" + hence "g \ H <#> S" + using S_contained_in_set_mult by auto + thus "H #> g \ carrier ((G\carrier := H <#> S\) Mod H)" + unfolding FactGroup_def RCOSETS_def r_coset_def by auto +next + fix x + assume "x \ carrier (G\carrier := H <#> S\ Mod H)" + then obtain h s where h: "h \ H" and s: "s \ S" and "x = H #> (h \ s)" + unfolding FactGroup_def RCOSETS_def r_coset_def set_mult_def by auto + hence "x = (H #> h) #> s" + by (metis h s coset_mult_assoc mem_carrier subgroup.mem_carrier subgrpS subset) + also have "... = H #> s" + by (metis h is_group rcos_const) + finally have "x = H #> s". + with s show "x \ (#>) H ` S" + by simp +qed + +text \Finally we can prove the actual isomorphism theorem:\ + +theorem normal_intersection_quotient_isom: + shows "(\X. the_elem ((\g. H #> g) ` X)) \ iso ((G\carrier := S\) Mod (H \ S)) (((G\carrier := H <#> S\)) Mod H)" +using normal_intersection_hom_kernel[symmetric] normal_intersection_hom normal_intersection_hom_surj +by (metis group_hom.FactGroup_iso_set) + +end + + +corollary (in group) normal_subgroup_set_mult_closed: + assumes "M \ G" and "N \ G" + shows "M <#> N \ G" +proof (rule normalI) + from assms show "subgroup (M <#> N) G" + using second_isomorphism_grp.normal_set_mult_subgroup normal_imp_subgroup + unfolding second_isomorphism_grp_def second_isomorphism_grp_axioms_def by force +next + show "\x\carrier G. M <#> N #> x = x <# (M <#> N)" + proof + fix x + assume x: "x \ carrier G" + have "M <#> N #> x = M <#> (N #> x)" + by (metis assms normal_inv_iff setmult_rcos_assoc subgroup.subset x) + also have "\ = M <#> (x <# N)" + by (metis assms(2) normal.coset_eq x) + also have "\ = (M #> x) <#> N" + by (metis assms normal_imp_subgroup rcos_assoc_lcos subgroup.subset x) + also have "\ = x <# (M <#> N)" + by (simp add: assms normal.coset_eq normal_imp_subgroup setmult_lcos_assoc subgroup.subset x) + finally show "M <#> N #> x = x <# (M <#> N)" . + qed +qed + +end