src/HOL/Algebra/Group.thy
changeset 68555 22d51874f37d
parent 68551 b680e74eb6f2
child 68605 440aa6b7d99a
equal deleted inserted replaced
68552:391e89e03eef 68555:22d51874f37d
   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"