(* Title: HOL/Algebra/Elementary_Groups.thy Author: LC Paulson, ported from HOL Light *)
theory Elementary_Groups imports Generated_Groups "HOL-Library.Infinite_Set" begin
subsection‹Direct sum/product lemmas›
locale group_disjoint_sum = group G + AG: subgroup A G + BG: subgroup B G for G (structure) and A B begin
lemma subset_one: "A ∩ B ⊆ {1} ⟷ A ∩ B = {1}" by auto
lemma sub_id_iff: "A ∩ B ⊆ {1} ⟷ (∀x∈A. ∀y∈B. x ⊗ y = 1⟶ x = 1∧ y = 1)"
(is"?lhs = ?rhs") proof - have"?lhs = (∀x∈A. ∀y∈B. x ⊗ inv y = 1⟶ x = 1∧ inv y = 1)" proof (intro ballI iffI impI) fix x y assume"A ∩ B ⊆ {1}""x ∈ A""y ∈ B""x ⊗ inv y = 1" thenhave"y = x" using group.inv_equality group_l_invI by fastforce thenshow"x = 1∧ inv y = 1" using‹A ∩ B ⊆ {1}›‹x ∈ A›‹y ∈ B›by fastforce next assume"∀x∈A. ∀y∈B. x ⊗ inv y = 1⟶ x = 1∧ inv y = 1" thenshow"A ∩ B ⊆ {1}" by auto qed alsohave"… = ?rhs" by (metis BG.mem_carrier BG.subgroup_axioms inv_inv subgroup_def) finallyshow ?thesis . qed
lemma cancel: "A ∩ B ⊆ {1} ⟷ (∀x∈A. ∀y∈B. ∀x'∈A. ∀y'∈B. x ⊗ y = x' ⊗ y' ⟶ x = x' ∧ y = y')"
(is"?lhs = ?rhs") proof - have"(∀x∈A. ∀y∈B. x ⊗ y = 1⟶ x = 1∧ y = 1) = ?rhs"
(is"?med = _") proof (intro ballI iffI impI) fix x y x' y' assume * [rule_format]: "∀x∈A. ∀y∈B. x ⊗ y = 1⟶ x = 1∧ y = 1" and AB: "x ∈ A""y ∈ B""x' ∈ A""y' ∈ B"and eq: "x ⊗ y = x' ⊗ y'" thenhave carr: "x ∈ carrier G""x' ∈ carrier G""y ∈ carrier G""y' ∈ carrier G" using AG.subset BG.subset by auto thenhave"inv x' ⊗ x ⊗ (y ⊗ inv y') = inv x' ⊗ (x ⊗ y) ⊗ inv y'" by (simp add: m_assoc) alsohave"… = 1" using carr by (simp add: eq) (simp add: m_assoc) finallyhave 1: "inv x' ⊗ x ⊗ (y ⊗ inv y') = 1" . show"x = x' ∧ y = y'" using * [OF _ _ 1] AB by simp (metis carr inv_closed inv_inv local.inv_equality) next fix x y assume * [rule_format]: "∀x∈A. ∀y∈B. ∀x'∈A. ∀y'∈B. x ⊗ y = x' ⊗ y' ⟶ x = x' ∧ y = y'" and xy: "x ∈ A""y ∈ B""x ⊗ y = 1" show"x = 1∧ y = 1" by (rule *) (use xy in auto) qed thenshow ?thesis by (simp add: sub_id_iff) qed
lemma commuting_imp_normal1: assumes sub: "carrier G ⊆ A <#> B" and mult: "∧x y. [x ∈ A; y ∈ B]==> x ⊗ y = y ⊗ x" shows"A ⊲ G" proof - have AB: "A ⊆ carrier G ∧ B ⊆ carrier G" by (simp add: AG.subset BG.subset) have"A #> x = x <# A" if x: "x ∈ carrier G"for x proof - obtain a b where xeq: "x = a ⊗ b"and"a ∈ A""b ∈ B"and carr: "a ∈ carrier G""b ∈ carrier G" using x sub AB by (force simp: set_mult_def) have Ab: "A <#> {b} = {b} <#> A" using AB ‹a ∈ A›‹b ∈ B› mult by (force simp: set_mult_def m_assoc subset_iff) have"A #> x = A <#> {a ⊗ b}" by (auto simp: l_coset_eq_set_mult r_coset_eq_set_mult xeq) alsohave"… = A <#> {a} <#> {b}" using AB ‹a ∈ A›‹b ∈ B› by (auto simp: set_mult_def m_assoc subset_iff) alsohave"… = {a} <#> A <#> {b}" by (metis AG.rcos_const AG.subgroup_axioms ‹a ∈ A› coset_join3 is_group l_coset_eq_set_mult r_coset_eq_set_mult subgroup.mem_carrier) alsohave"… = {a} <#> {b} <#> A" by (simp add: is_group carr group.set_mult_assoc AB Ab) alsohave"… = {x} <#> A" by (auto simp: set_mult_def xeq) finallyshow"A #> x = x <# A" by (simp add: l_coset_eq_set_mult) qed thenshow ?thesis by (auto simp: normal_def normal_axioms_def AG.subgroup_axioms is_group) qed
lemma commuting_imp_normal2: assumes"carrier G ⊆ A <#> B""∧x y. [x ∈ A; y ∈ B]==> x ⊗ y = y ⊗ x" shows"B ⊲ G" proof (rule group_disjoint_sum.commuting_imp_normal1) show"group_disjoint_sum G B A" proofqed next show"carrier G ⊆ B <#> A" using BG.subgroup_axioms assms commut_normal commuting_imp_normal1 by blast qed (use assms in auto)
lemma (in group) normal_imp_commuting: assumes"A ⊲ G""B ⊲ G""A ∩ B ⊆ {1}""x ∈ A""y ∈ B" shows"x ⊗ y = y ⊗ x" proof - interpret AG: normal A G using assms by auto interpret BG: normal B G using assms by auto interpret group_disjoint_sum G A B proofqed have * [rule_format]: "(∀x∈A. ∀y∈B. ∀x'∈A. ∀y'∈B. x ⊗ y = x' ⊗ y' ⟶ x = x' ∧ y = y')" using cancel assms by (auto simp: normal_def) have carr: "x ∈ carrier G""y ∈ carrier G" using assms AG.subset BG.subset by auto thenshow ?thesis using * [of x _ _ y] AG.coset_eq [rule_format, of y] BG.coset_eq [rule_format, of x] by (clarsimp simp: l_coset_def r_coset_def set_eq_iff) (metis ‹x ∈ A›‹y ∈ B›) qed
lemma normal_eq_commuting: assumes"carrier G ⊆ A <#> B""A ∩ B ⊆ {1}" shows"A ⊲ G ∧ B ⊲ G ⟷ (∀x∈A. ∀y∈B. x ⊗ y = y ⊗ x)" by (metis assms commuting_imp_normal1 commuting_imp_normal2 normal_imp_commuting)
lemma (in group) hom_group_mul_rev: assumes"(λ(x,y). x ⊗ y) ∈ hom (subgroup_generated G A ×× subgroup_generated G B) G"
(is"?h ∈ hom ?P G") and"x ∈ carrier G""y ∈ carrier G""x ∈ A""y ∈ B" shows"x ⊗ y = y ⊗ x" proof - interpret P: group_hom ?P G ?h by (simp add: assms DirProd_group group_hom.intro group_hom_axioms.intro is_group) have xy: "(x,y) ∈ carrier ?P" by (auto simp: assms carrier_subgroup_generated generate.incl) have"x ⊗ (x ⊗ (y ⊗ y)) = x ⊗ (y ⊗ (x ⊗ y))" using P.hom_mult [OF xy xy] by (simp add: m_assoc assms) thenhave"x ⊗ (y ⊗ y) = y ⊗ (x ⊗ y)" using assms by simp thenshow ?thesis by (simp add: assms flip: m_assoc) qed
lemma hom_group_mul_eq: "(λ(x,y). x ⊗ y) ∈ hom (subgroup_generated G A ×× subgroup_generated G B) G ⟷ (∀x∈A. ∀y∈B. x ⊗ y = y ⊗ x)"
(is"?lhs = ?rhs") proof assume ?lhs thenshow ?rhs using hom_group_mul_rev AG.subset BG.subset by blast next assume R: ?rhs have subG: "generate G (carrier G ∩ A) ⊆ carrier G"for A by (simp add: generate_incl) have *: "x ⊗ u ⊗ (y ⊗ v) = x ⊗ y ⊗ (u ⊗ v)" if eq [rule_format]: "∀x∈A. ∀y∈B. x ⊗ y = y ⊗ x" and gen: "x ∈ generate G (carrier G ∩ A)""y ∈ generate G (carrier G ∩ B)" "u ∈ generate G (carrier G ∩ A)""v ∈ generate G (carrier G ∩ B)" for x y u v proof - have"u ⊗ y = y ⊗ u" by (metis AG.carrier_subgroup_generated_subgroup BG.carrier_subgroup_generated_subgroup carrier_subgroup_generated eq that(3) that(4)) thenhave"x ⊗ u ⊗ y = x ⊗ y ⊗ u" using gen by (simp add: m_assoc subsetD [OF subG]) thenshow ?thesis using gen by (simp add: subsetD [OF subG] flip: m_assoc) qed show ?lhs using R by (auto simp: hom_def carrier_subgroup_generated subsetD [OF subG] *) qed
lemma epi_group_mul_eq: "(λ(x,y). x ⊗ y) ∈ epi (subgroup_generated G A ×× subgroup_generated G B) G ⟷ A <#> B = carrier G ∧ (∀x∈A. ∀y∈B. x ⊗ y = y ⊗ x)" proof - have subGA: "generate G (carrier G ∩ A) ⊆ A" by (simp add: AG.subgroup_axioms generate_subgroup_incl) have subGB: "generate G (carrier G ∩ B) ⊆ B" by (simp add: BG.subgroup_axioms generate_subgroup_incl) have"(((λ(x, y). x ⊗ y) ` (generate G (carrier G ∩ A) × generate G (carrier G ∩ B)))) = ((A <#> B))" by (auto simp: set_mult_def generate.incl pair_imageI dest: subsetD [OF subGA] subsetD [OF subGB]) thenshow ?thesis by (auto simp: epi_def hom_group_mul_eq carrier_subgroup_generated) qed
lemma mon_group_mul_eq: "(λ(x,y). x ⊗ y) ∈ mon (subgroup_generated G A ×× subgroup_generated G B) G ⟷ A ∩ B = {1} ∧ (∀x∈A. ∀y∈B. x ⊗ y = y ⊗ x)" proof - have subGA: "generate G (carrier G ∩ A) ⊆ A" by (simp add: AG.subgroup_axioms generate_subgroup_incl) have subGB: "generate G (carrier G ∩ B) ⊆ B" by (simp add: BG.subgroup_axioms generate_subgroup_incl) show ?thesis apply (auto simp: mon_def hom_group_mul_eq simp flip: subset_one) apply (simp_all (no_asm_use) add: inj_on_def AG.carrier_subgroup_generated_subgroup BG.carrier_subgroup_generated_subgroup) using cancel apply blast+ done qed
lemma iso_group_mul_alt: "(λ(x,y). x ⊗ y) ∈ iso (subgroup_generated G A ×× subgroup_generated G B) G ⟷ A ∩ B = {1} ∧ A <#> B = carrier G ∧ (∀x∈A. ∀y∈B. x ⊗ y = y ⊗ x)" by (auto simp: iso_iff_mon_epi mon_group_mul_eq epi_group_mul_eq)
lemma iso_group_mul_eq: "(λ(x,y). x ⊗ y) ∈ iso (subgroup_generated G A ×× subgroup_generated G B) G ⟷ A ∩ B = {1} ∧ A <#> B = carrier G ∧ A ⊲ G ∧ B ⊲ G" by (simp add: iso_group_mul_alt normal_eq_commuting cong: conj_cong)
lemma (in group) iso_group_mul_gen: assumes"A ⊲ G""B ⊲ G" shows"(λ(x,y). x ⊗ y) ∈ iso (subgroup_generated G A ×× subgroup_generated G B) G ⟷ A ∩ B ⊆ {1} ∧ A <#> B = carrier G" proof - interpret group_disjoint_sum G A B using assms by (auto simp: group_disjoint_sum_def normal_def) show ?thesis by (simp add: subset_one iso_group_mul_eq assms) qed
lemma iso_group_mul: assumes"comm_group G" shows"((λ(x,y). x ⊗ y) ∈ iso (DirProd (subgroup_generated G A) (subgroup_generated G B)) G ⟷ A ∩ B ⊆ {1} ∧ A <#> B = carrier G)" proof (rule iso_group_mul_gen) interpret comm_group by (rule assms) show"A ⊲ G" by (simp add: AG.subgroup_axioms subgroup_imp_normal) show"B ⊲ G" by (simp add: BG.subgroup_axioms subgroup_imp_normal) qed
end
subsection‹The one-element group on a given object›
definition singleton_group :: "'a ==> 'a monoid" where"singleton_group a = (carrier = {a}, monoid.mult = (λx y. a), one = a)"
lemma isomorphic_group_triviality: assumes"G ≅ H""group G""group H" shows"trivial_group G ⟷ trivial_group H" by (meson assms group.iso_sym isomorphic_group_triviality1)
lemma (in group_hom) kernel_from_trivial_group: "trivial_group G ==> kernel G H h = carrier G" by (auto simp: trivial_group_def kernel_def)
lemma (in group_hom) image_from_trivial_group: "trivial_group G ==> h ` carrier G = {one H}" by (auto simp: trivial_group_def)
lemma (in group_hom) kernel_to_trivial_group: "trivial_group H ==> kernel G H h = carrier G" unfolding kernel_def trivial_group_def using hom_closed by blast
lemma group_nat_pow_integer_group [simp]: fixes n::nat and x::int shows"pow integer_group x n = int n * x" by (induction n) (auto simp: integer_group_def algebra_simps)
lemma group_int_pow_integer_group [simp]: fixes n::int and x::int shows"pow integer_group x n = n * x" by (simp add: int_pow_def2)
lemma (in group) hom_integer_group_pow: "x ∈ carrier G ==> pow G x ∈ hom integer_group G" by (rule homI) (auto simp: int_pow_mult)
subsection‹Additive group of integers modulo n (n = 0 gives just the integers)›
definition integer_mod_group :: "nat ==> int monoid" where "integer_mod_group n ≡ if n = 0 then integer_group else (carrier = {0..)"
lemma carrier_integer_mod_group: "carrier(integer_mod_group n) = (if n=0 then UNIV else {0.. by (simp add: integer_mod_group_def)
lemma one_integer_mod_group[simp]: "one(integer_mod_group n) = 0" by (simp add: integer_mod_group_def)
lemma mult_integer_mod_group[simp]: "monoid.mult(integer_mod_group n) = (λx y. (x + y) mod int n)" by (simp add: integer_mod_group_def integer_group_def)
lemma group_integer_mod_group [simp]: "group (integer_mod_group n)" proof - have *: "∃y≥0. y < int n ∧ (y + x) mod int n = 0"if"x < int n""0 ≤ x"for x proof (cases "x=0") case False with that show ?thesis by (rule_tac x="int n - x"in exI) auto qed (use that in auto) show ?thesis apply (rule groupI) apply (auto simp: integer_mod_group_def Bex_def *, presburger+) done qed
lemma inv_integer_mod_group[simp]: "x ∈ carrier (integer_mod_group n) ==> m_inv(integer_mod_group n) x = (-x) mod int n" by (rule group.inv_equality [OF group_integer_mod_group]) (auto simp: integer_mod_group_def add.commute mod_add_right_eq)
lemma pow_integer_mod_group [simp]: fixes m::nat shows"pow (integer_mod_group n) x m = (int m * x) mod int n" proof (cases "n=0") case False show ?thesis by (induction m) (auto simp: add.commute mod_add_right_eq distrib_left mult.commute) qed (simp add: integer_mod_group_def)
lemma int_pow_integer_mod_group: "pow (integer_mod_group n) x m = (m * x) mod int n" proof - have"inv🪙integer_mod_group n🪙 (- (m * x) mod int n) = m * x mod int n" by (simp add: carrier_integer_mod_group mod_minus_eq) thenshow ?thesis by (simp add: int_pow_def2) qed
lemma abelian_integer_mod_group [simp]: "comm_group(integer_mod_group n)" by (simp add: add.commute group.group_comm_groupI)
lemma (in group) carrier_subgroup_generated_by_singleton: assumes"x ∈ carrier G" shows"carrier(subgroup_generated G {x}) = (range (λn::int. x [^] n))" proof show"carrier (subgroup_generated G {x}) ⊆ range (λn::int. x [^] n)" proof (rule subgroup_generated_minimal) show"subgroup (range (λn::int. x [^] n)) G" using assms subgroup_of_powers by blast show"{x} ⊆ range (λn::int. x [^] n)" by clarify (metis assms int_pow_1 range_eqI) qed have x: "x ∈ carrier (subgroup_generated G {x})" using assms subgroup_generated_subset_carrier_subset by auto show"range (λn::int. x [^] n) ⊆ carrier (subgroup_generated G {x})" proof clarify fix n :: "int" show"x [^] n ∈ carrier (subgroup_generated G {x})" by (simp add: x subgroup_int_pow_closed subgroup_subgroup_generated) qed qed
definition cyclic_group where"cyclic_group G ≡∃x ∈ carrier G. subgroup_generated G {x} = G"
lemma (in group) cyclic_group: "cyclic_group G ⟷ (∃x ∈ carrier G. carrier G = range (λn::int. x [^] n))" proof - have"∧x. [x ∈ carrier G; carrier G = range (λn::int. x [^] n)] ==>∃x∈carrier G. subgroup_generated G {x} = G" by (rule_tac x=x in bexI) (auto simp: generate_pow subgroup_generated_def intro!: monoid.equality) thenshow ?thesis unfolding cyclic_group_def using carrier_subgroup_generated_by_singleton by fastforce qed
lemma cyclic_integer_group [simp]: "cyclic_group integer_group" proof - have *: "int n ∈ generate integer_group {1}"for n proof (induction n) case 0 thenshow ?case using generate.simps by force next case (Suc n) thenshow ?case by simp (metis generate.simps insert_subset integer_group_def monoid.simps(1) subsetI) qed have **: "i ∈ generate integer_group {1}"for i proof (cases i rule: int_cases) case (nonneg n) thenshow ?thesis by (simp add: *) next case (neg n) thenhave"-i ∈ generate integer_group {1}" by (metis "*" add.inverse_inverse) thenhave"- (-i) ∈ generate integer_group {1}" by (metis UNIV_I group.generate_m_inv_closed group_integer_group integer_group_def inv_integer_group partial_object.select_convs(1) subsetI) thenshow ?thesis by simp qed show ?thesis unfolding cyclic_group_def by (rule_tac x=1 in bexI)
(auto simp: carrier_subgroup_generated ** intro: monoid.equality) qed
lemma nontrivial_integer_group [simp]: "¬ trivial_group integer_group" using integer_mod_group_def trivial_integer_mod_group by presburger
lemma trivial_imp_cyclic_group: "trivial_group G ==> cyclic_group G" by (metis cyclic_group_def group.subgroup_generated_group_carrier insertI1 trivial_group_def)
lemma (in group) cyclic_group_alt: "cyclic_group G ⟷ (∃x. subgroup_generated G {x} = G)" proof safe fix x assume *: "subgroup_generated G {x} = G" show"cyclic_group G" proof (cases "x ∈ carrier G") case True thenshow ?thesis using‹subgroup_generated G {x} = G› cyclic_group_def by blast next case False thenshow ?thesis by (metis "*" Int_empty_right Int_insert_right_if0 carrier_subgroup_generated generate_empty trivial_group trivial_imp_cyclic_group) qed qed (auto simp: cyclic_group_def)
lemma (in group) cyclic_group_generated: "cyclic_group (subgroup_generated G {x})" using group.cyclic_group_alt group_subgroup_generated subgroup_generated2 by blast
lemma (in group) cyclic_group_epimorphic_image: assumes"h ∈ epi G H""cyclic_group G""group H" shows"cyclic_group H" proof - interpret h: group_hom using assms by (simp add: group_hom_def group_hom_axioms_def is_group epi_def) obtain x where"x ∈ carrier G"and x: "carrier G = range (λn::int. x [^] n)"and eq: "carrier H = h ` carrier G" using assms by (auto simp: cyclic_group epi_def) have"h ` carrier G = range (λn::int. h x [^]🪙H🪙 n)" by (metis (no_types, lifting) ‹x ∈ carrier G› h.hom_int_pow image_cong image_image x) thenshow ?thesis using‹x ∈ carrier G› eq h.cyclic_group by blast qed
lemma isomorphic_group_cyclicity: "[G ≅ H; group G; group H]==> cyclic_group G ⟷ cyclic_group H" by (meson ex_in_conv group.cyclic_group_epimorphic_image group.iso_sym is_iso_def iso_iff_mon_epi)
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-05-03)
¤
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.