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 |