588 by (simp add: monoid_axioms submonoid.intro submonoid.submonoid_is_monoid subset) |
588 by (simp add: monoid_axioms submonoid.intro submonoid.submonoid_is_monoid subset) |
589 then show ?thesis |
589 then show ?thesis |
590 by (rule monoid.group_l_invI) (auto intro: l_inv mem_carrier) |
590 by (rule monoid.group_l_invI) (auto intro: l_inv mem_carrier) |
591 qed |
591 qed |
592 |
592 |
593 lemma (in group) subgroup_inv_equality: |
593 lemma subgroup_is_submonoid: |
|
594 assumes "subgroup H G" shows "submonoid H G" |
|
595 using assms by (auto intro: submonoid.intro simp add: subgroup_def) |
|
596 |
|
597 lemma (in group) subgroup_Units: |
|
598 assumes "subgroup H G" shows "H \<subseteq> Units (G \<lparr> carrier := H \<rparr>)" |
|
599 using group.Units[OF subgroup.subgroup_is_group[OF assms group_axioms]] by simp |
|
600 |
|
601 lemma (in group) m_inv_consistent: |
594 assumes "subgroup H G" "x \<in> H" |
602 assumes "subgroup H G" "x \<in> H" |
595 shows "m_inv (G \<lparr>carrier := H\<rparr>) x = inv x" |
603 shows "inv\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> x = inv x" |
596 unfolding m_inv_def apply auto |
604 using assms m_inv_monoid_consistent[OF _ subgroup_is_submonoid] subgroup_Units[of H] by auto |
597 using subgroup.m_inv_closed[OF assms] inv_equality |
|
598 by (metis (no_types, hide_lams) assms subgroup.mem_carrier) |
|
599 |
605 |
600 lemma (in group) int_pow_consistent: (* by Paulo *) |
606 lemma (in group) int_pow_consistent: (* by Paulo *) |
601 assumes "subgroup H G" "x \<in> H" |
607 assumes "subgroup H G" "x \<in> H" |
602 shows "x [^] (n :: int) = x [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> n" |
608 shows "x [^] (n :: int) = x [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> n" |
603 proof (cases) |
609 proof (cases) |
614 hence "x [^] n = inv (x [^] (nat (- n)))" |
620 hence "x [^] n = inv (x [^] (nat (- n)))" |
615 using int_pow_def2 by auto |
621 using int_pow_def2 by auto |
616 also have " ... = (inv x) [^] (nat (- n))" |
622 also have " ... = (inv x) [^] (nat (- n))" |
617 by (metis assms nat_pow_inv subgroup.mem_carrier) |
623 by (metis assms nat_pow_inv subgroup.mem_carrier) |
618 also have " ... = (inv\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> x) [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> (nat (- n))" |
624 also have " ... = (inv\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> x) [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> (nat (- n))" |
619 using subgroup_inv_equality[OF assms] nat_pow_consistent by auto |
625 using m_inv_consistent[OF assms] nat_pow_consistent by auto |
620 also have " ... = inv\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> (x [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> (nat (- n)))" |
626 also have " ... = inv\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> (x [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> (nat (- n)))" |
621 using group.nat_pow_inv[OF subgroup.subgroup_is_group[OF assms(1) is_group]] assms(2) by auto |
627 using group.nat_pow_inv[OF subgroup.subgroup_is_group[OF assms(1) is_group]] assms(2) by auto |
622 also have " ... = x [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> n" |
628 also have " ... = x [^]\<^bsub>(G \<lparr> carrier := H \<rparr>)\<^esub> n" |
623 using group.int_pow_def2[OF subgroup.subgroup_is_group[OF assms(1) is_group]] lt by auto |
629 using group.int_pow_def2[OF subgroup.subgroup_is_group[OF assms(1) is_group]] lt by auto |
624 finally show ?thesis . |
630 finally show ?thesis . |
1288 finally have H: "I \<subseteq> carrier G" by simp |
1294 finally have H: "I \<subseteq> carrier G" by simp |
1289 have "(\<And>x y. \<lbrakk>x \<in> I ; y \<in> I\<rbrakk> \<Longrightarrow> x \<otimes> y \<in> I)" using assms(2) by (auto simp add: subgroup_def) |
1295 have "(\<And>x y. \<lbrakk>x \<in> I ; y \<in> I\<rbrakk> \<Longrightarrow> x \<otimes> y \<in> I)" using assms(2) by (auto simp add: subgroup_def) |
1290 thus "I \<subseteq> carrier G \<and> (\<forall>x y. x \<in> I \<longrightarrow> y \<in> I \<longrightarrow> x \<otimes> y \<in> I)" using H by blast |
1296 thus "I \<subseteq> carrier G \<and> (\<forall>x y. x \<in> I \<longrightarrow> y \<in> I \<longrightarrow> x \<otimes> y \<in> I)" using H by blast |
1291 have K: "\<one> \<in> I" using assms(2) by (auto simp add: subgroup_def) |
1297 have K: "\<one> \<in> I" using assms(2) by (auto simp add: subgroup_def) |
1292 have "(\<And>x. x \<in> I \<Longrightarrow> inv x \<in> I)" using assms subgroup.m_inv_closed H |
1298 have "(\<And>x. x \<in> I \<Longrightarrow> inv x \<in> I)" using assms subgroup.m_inv_closed H |
1293 by (metis H1 H2 subgroup_inv_equality subsetCE) |
1299 by (metis H1 H2 m_inv_consistent subsetCE) |
1294 thus "\<one> \<in> I \<and> (\<forall>x. x \<in> I \<longrightarrow> inv x \<in> I)" using K by blast |
1300 thus "\<one> \<in> I \<and> (\<forall>x. x \<in> I \<longrightarrow> inv x \<in> I)" using K by blast |
1295 qed |
1301 qed |
1296 |
1302 |
1297 (*A subgroup included in another subgroup is a subgroup of the subgroup*) |
1303 (*A subgroup included in another subgroup is a subgroup of the subgroup*) |
1298 lemma (in group) subgroup_incl: |
1304 lemma (in group) subgroup_incl: |
1299 assumes "subgroup I G" |
1305 assumes "subgroup I G" and "subgroup J G" and "I \<subseteq> J" |
1300 and "subgroup J G" |
1306 shows "subgroup I (G \<lparr> carrier := J \<rparr>)" |
1301 and "I\<subseteq>J" |
1307 using group.group_incl_imp_subgroup[of "G \<lparr> carrier := J \<rparr>" I] |
1302 shows "subgroup I (G\<lparr>carrier:=J\<rparr>)"using assms subgroup_inv_equality |
1308 assms(1-2)[THEN subgroup.subgroup_is_group[OF _ group_axioms]] assms(3) by auto |
1303 by (auto simp add: subgroup_def) |
|
1304 |
|
1305 |
1309 |
1306 |
1310 |
1307 subsection \<open>The Lattice of Subgroups of a Group\<close> |
1311 subsection \<open>The Lattice of Subgroups of a Group\<close> |
1308 |
1312 |
1309 text_raw \<open>\label{sec:subgroup-lattice}\<close> |
1313 text_raw \<open>\label{sec:subgroup-lattice}\<close> |
1431 by (auto simp: units_of_def) |
1435 by (auto simp: units_of_def) |
1432 |
1436 |
1433 lemma units_of_one: "one (units_of G) = one G" |
1437 lemma units_of_one: "one (units_of G) = one G" |
1434 by (auto simp: units_of_def) |
1438 by (auto simp: units_of_def) |
1435 |
1439 |
1436 lemma (in monoid) units_of_inv: |
1440 lemma (in monoid) units_of_inv: |
1437 assumes "x \<in> Units G" |
1441 assumes "x \<in> Units G" |
1438 shows "m_inv (units_of G) x = m_inv G x" |
1442 shows "m_inv (units_of G) x = m_inv G x" |
1439 by (simp add: assms group.inv_equality units_group units_of_carrier units_of_mult units_of_one) |
1443 by (simp add: assms group.inv_equality units_group units_of_carrier units_of_mult units_of_one) |
1440 |
1444 |
1441 lemma units_of_units [simp] : "Units (units_of G) = Units G" |
1445 lemma units_of_units [simp] : "Units (units_of G) = Units G" |