src/HOL/Algebra/Generated_Groups.thy
changeset 69749 10e48c47a549
parent 69122 1b5178abaf97
child 70019 095dce9892e8
equal deleted inserted replaced
69748:7aafd0472661 69749:10e48c47a549
   135     using subgroup_int_pow_closed[OF generate_is_subgroup[of "{ a }"] incl[of a]] assms by auto
   135     using subgroup_int_pow_closed[OF generate_is_subgroup[of "{ a }"] incl[of a]] assms by auto
   136 next
   136 next
   137   show "generate G { a } \<subseteq> { a [^] (k :: int) | k. k \<in> UNIV }"
   137   show "generate G { a } \<subseteq> { a [^] (k :: int) | k. k \<in> UNIV }"
   138   proof
   138   proof
   139     fix h assume "h \<in> generate G { a }" hence "\<exists>k :: int. h = a [^] k"
   139     fix h assume "h \<in> generate G { a }" hence "\<exists>k :: int. h = a [^] k"
   140     proof (induction, metis int_pow_0[of a], metis singletonD int_pow_1[OF assms])
   140     proof (induction)
       
   141       case one
       
   142       then show ?case
       
   143         using int_pow_0 [of G] by metis
       
   144     next
       
   145       case (incl h)
       
   146       then show ?case
       
   147         by (metis assms int_pow_1 singletonD)
       
   148     next
   141       case (inv h)
   149       case (inv h)
   142       hence "inv h = a [^] ((- 1) :: int)"
   150       then show ?case
   143         using assms unfolding int_pow_def2 by simp
   151         by (metis assms int_pow_1 int_pow_neg singletonD)
   144       thus ?case
       
   145         by blast 
       
   146     next
   152     next
   147       case eng thus ?case
   153       case (eng h1 h2)
       
   154       then show ?case
   148         using assms by (metis int_pow_mult)
   155         using assms by (metis int_pow_mult)
   149     qed
   156     qed
   150     thus "h \<in> { a [^] (k :: int) | k. k \<in> UNIV }"
   157     then show "h \<in> { a [^] (k :: int) | k. k \<in> UNIV }"
   151       by blast
   158       by blast
   152   qed
   159   qed
   153 qed
   160 qed
   154 
   161 
   155 corollary (in group) generate_one: "generate G { \<one> } = { \<one> }"
   162 corollary (in group) generate_one: "generate G { \<one> } = { \<one> }"
   434 
   441 
   435 lemma (in group_hom) exp_of_derived_img:
   442 lemma (in group_hom) exp_of_derived_img:
   436   assumes "K \<subseteq> carrier G" shows "(derived H ^^ n) (h ` K) = h ` ((derived G ^^ n) K)"
   443   assumes "K \<subseteq> carrier G" shows "(derived H ^^ n) (h ` K) = h ` ((derived G ^^ n) K)"
   437   using derived_img[OF G.exp_of_derived_in_carrier[OF assms]] by (induct n) (auto)
   444   using derived_img[OF G.exp_of_derived_in_carrier[OF assms]] by (induct n) (auto)
   438 
   445 
       
   446 
       
   447 subsection \<open>Generated subgroup of a group\<close>
       
   448 
       
   449 definition subgroup_generated :: "('a, 'b) monoid_scheme \<Rightarrow> 'a set \<Rightarrow> ('a, 'b) monoid_scheme"
       
   450   where "subgroup_generated G S = G\<lparr>carrier := generate G (carrier G \<inter> S)\<rparr>"
       
   451 
       
   452 lemma carrier_subgroup_generated: "carrier (subgroup_generated G S) = generate G (carrier G \<inter> S)"
       
   453   by (auto simp: subgroup_generated_def)
       
   454 
       
   455 lemma (in group) group_subgroup_generated [simp]: "group (subgroup_generated G S)"
       
   456     unfolding subgroup_generated_def
       
   457     by (simp add: generate_is_subgroup subgroup_imp_group)
       
   458 
       
   459 lemma (in group) abelian_subgroup_generated:
       
   460   assumes "comm_group G"
       
   461   shows "comm_group (subgroup_generated G S)" (is "comm_group ?GS")
       
   462 proof (rule group.group_comm_groupI)
       
   463   show "Group.group ?GS"
       
   464     by simp
       
   465 next
       
   466   fix x y
       
   467   assume "x \<in> carrier ?GS" "y \<in> carrier ?GS"
       
   468   with assms show "x \<otimes>\<^bsub>?GS\<^esub> y = y \<otimes>\<^bsub>?GS\<^esub> x"
       
   469     apply (simp add: subgroup_generated_def)
       
   470     by (meson Int_lower1 comm_groupE(4) generate_in_carrier)
       
   471 qed
       
   472 
       
   473 lemma (in group) subgroup_of_subgroup_generated:
       
   474   assumes "H \<subseteq> B" "subgroup H G"
       
   475     shows "subgroup H (subgroup_generated G B)"
       
   476 proof unfold_locales
       
   477   fix x
       
   478   assume "x \<in> H"
       
   479   with assms show "inv\<^bsub>subgroup_generated G B\<^esub> x \<in> H"
       
   480     unfolding subgroup_generated_def
       
   481     by (metis IntI Int_commute Int_lower2 generate.incl generate_is_subgroup m_inv_consistent subgroup_def subsetCE)
       
   482 next
       
   483   show "H \<subseteq> carrier (subgroup_generated G B)"
       
   484     using assms apply (auto simp: carrier_subgroup_generated)
       
   485     by (metis Int_iff generate.incl inf.orderE subgroup.mem_carrier)
       
   486 qed (use assms in \<open>auto simp: subgroup_generated_def subgroup_def\<close>)
       
   487 
       
   488 lemma carrier_subgroup_generated_alt:
       
   489   assumes "Group.group G" "S \<subseteq> carrier G"
       
   490   shows "carrier (subgroup_generated G S) = \<Inter>{H. subgroup H G \<and> carrier G \<inter> S \<subseteq> H}"
       
   491   using assms by (auto simp: group.generate_minimal subgroup_generated_def)
       
   492 
       
   493 lemma one_subgroup_generated [simp]: "\<one>\<^bsub>subgroup_generated G S\<^esub> = \<one>\<^bsub>G\<^esub>"
       
   494   by (auto simp: subgroup_generated_def)
       
   495 
       
   496 lemma mult_subgroup_generated [simp]: "mult (subgroup_generated G S) = mult G"
       
   497   by (auto simp: subgroup_generated_def)
       
   498 
       
   499 lemma (in group) inv_subgroup_generated [simp]:
       
   500   assumes "f \<in> carrier (subgroup_generated G S)"
       
   501   shows "inv\<^bsub>subgroup_generated G S\<^esub> f = inv f"
       
   502 proof (rule group.inv_equality)
       
   503   show "Group.group (subgroup_generated G S)"
       
   504     by simp
       
   505   have [simp]: "f \<in> carrier G"
       
   506     by (metis Int_lower1 assms carrier_subgroup_generated generate_in_carrier)
       
   507   show "inv f \<otimes>\<^bsub>subgroup_generated G S\<^esub> f = \<one>\<^bsub>subgroup_generated G S\<^esub>"
       
   508     by (simp add: assms)
       
   509   show "f \<in> carrier (subgroup_generated G S)"
       
   510     using assms by (simp add: generate.incl subgroup_generated_def)
       
   511   show "inv f \<in> carrier (subgroup_generated G S)"
       
   512     using assms by (simp add: subgroup_generated_def generate_m_inv_closed)
       
   513 qed
       
   514 
       
   515 lemma subgroup_generated_restrict [simp]:
       
   516    "subgroup_generated G (carrier G \<inter> S) = subgroup_generated G S"
       
   517   by (simp add: subgroup_generated_def)
       
   518 
       
   519 lemma (in subgroup) carrier_subgroup_generated_subgroup [simp]:
       
   520   "carrier (subgroup_generated G H) = H"
       
   521   by (auto simp: generate.incl carrier_subgroup_generated elim: generate.induct)
       
   522 
       
   523 
       
   524 lemma (in group) subgroup_subgroup_generated_iff:
       
   525    "subgroup H (subgroup_generated G B) \<longleftrightarrow> subgroup H G \<and> H \<subseteq> carrier(subgroup_generated G B)"
       
   526  (is "?lhs = ?rhs")
       
   527 proof
       
   528   assume L: ?lhs
       
   529   then have Hsub: "H \<subseteq> generate G (carrier G \<inter> B)"
       
   530     by (simp add: subgroup_def subgroup_generated_def)
       
   531   then have H: "H \<subseteq> carrier G" "H \<subseteq> carrier(subgroup_generated G B)"
       
   532     unfolding carrier_subgroup_generated
       
   533     using generate_incl by blast+
       
   534   with Hsub have "subgroup H G"
       
   535     by (metis Int_commute Int_lower2 L carrier_subgroup_generated generate_consistent
       
   536         generate_is_subgroup inf.orderE subgroup.carrier_subgroup_generated_subgroup subgroup_generated_def)
       
   537   with H show ?rhs
       
   538     by blast
       
   539 next
       
   540   assume ?rhs
       
   541   then show ?lhs
       
   542     by (simp add: generate_is_subgroup subgroup_generated_def subgroup_incl)
       
   543 qed
       
   544 
       
   545 
       
   546 lemma pow_subgroup_generated:
       
   547    "pow (subgroup_generated G S) = (pow G :: 'a \<Rightarrow> nat \<Rightarrow> 'a)"
       
   548 proof -
       
   549   have "x [^]\<^bsub>subgroup_generated G S\<^esub> n = x [^]\<^bsub>G\<^esub> n" for x and n::nat
       
   550     by (induction n) auto
       
   551   then show ?thesis
       
   552     by force
       
   553 qed
       
   554 
       
   555 lemma (in group) int_pow_subgroup_generated:
       
   556   fixes n::int
       
   557   assumes "x \<in> carrier (subgroup_generated G S)"
       
   558   shows "x [^]\<^bsub>subgroup_generated G S\<^esub> n = x [^]\<^bsub>G\<^esub> n"
       
   559 proof -
       
   560   have "x [^] nat (- n) \<in> carrier (subgroup_generated G S)"
       
   561     by (metis assms group.is_monoid group_subgroup_generated monoid.nat_pow_closed pow_subgroup_generated)
       
   562   then show ?thesis
       
   563     by (simp add: int_pow_def2 pow_subgroup_generated)
       
   564 qed
       
   565 
   439 end
   566 end