diff -r 1b9462304e1d -r c64319959bab src/HOL/Algebra/Subrings.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Algebra/Subrings.thy Mon Jul 02 14:41:35 2018 +0100 @@ -0,0 +1,428 @@ +(* ************************************************************************** *) +(* Title: Subrings.thy *) +(* Authors: Martin Baillon and Paulo Emílio de Vilhena *) +(* ************************************************************************** *) + +theory Subrings + imports Ring RingHom QuotRing Multiplicative_Group + +begin + +section \Subrings\ + +subsection \Definitions\ + +locale subring = + subgroup H "add_monoid R" + submonoid H R for H and R (structure) + +locale subcring = subring + + assumes sub_m_comm: "\ h1 \ H; h2 \ H \ \ h1 \ h2 = h2 \ h1" + +locale subdomain = subcring + + assumes sub_one_not_zero [simp]: "\ \ \" + assumes subintegral: "\ h1 \ H; h2 \ H \ \ h1 \ h2 = \ \ h1 = \ \ h2 = \" + +locale subfield = subdomain K R for K and R (structure) + + assumes subfield_Units: "Units (R \ carrier := K \) = K - { \ }" + + +subsection \Basic Properties\ + +subsubsection \Subrings\ + +lemma (in ring) subringI: + assumes "H \ carrier R" + and "\ \ H" + and "\h. h \ H \ \ h \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \ h2 \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \ h2 \ H" + shows "subring H R" + using add.subgroupI[OF assms(1) _ assms(3, 5)] assms(2) + submonoid.intro[OF assms(1, 4, 2)] + unfolding subring_def by auto + +lemma subringE: + assumes "subring H R" + shows "H \ carrier R" + and "\\<^bsub>R\<^esub> \ H" + and "\\<^bsub>R\<^esub> \ H" + and "H \ {}" + and "\h. h \ H \ \\<^bsub>R\<^esub> h \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 \ H" + using subring.axioms[OF assms] + unfolding submonoid_def subgroup_def a_inv_def by auto + +lemma (in ring) carrier_is_subring: "subring (carrier R) R" + by (simp add: subringI) + +lemma (in ring) subring_inter: + assumes "subring I R" and "subring J R" + shows "subring (I \ J) R" + using subringE[OF assms(1)] subringE[OF assms(2)] subringI[of "I \ J"] by auto + +lemma (in ring) subring_Inter: + assumes "\I. I \ S \ subring I R" and "S \ {}" + shows "subring (\S) R" +proof (rule subringI, auto simp add: assms subringE[of _ R]) + fix x assume "\I \ S. x \ I" thus "x \ carrier R" + using assms subringE(1)[of _ R] by blast +qed + +lemma (in subring) subring_is_ring: + assumes "ring R" + shows "ring (R \ carrier := H \)" + apply unfold_locales + using assms subring_axioms submonoid.one_closed[OF subgroup_is_submonoid] subgroup_is_group + by (simp_all add: subringE ring.ring_simprules abelian_group.a_group group.Units_eq ring_def) + +lemma (in ring) ring_incl_imp_subring: + assumes "H \ carrier R" + and "ring (R \ carrier := H \)" + shows "subring H R" + using group.group_incl_imp_subgroup[OF add.group_axioms, of H] assms(1) + monoid.monoid_incl_imp_submonoid[OF monoid_axioms assms(1)] + ring.axioms(1, 2)[OF assms(2)] abelian_group.a_group[of "R \ carrier := H \"] + unfolding subring_def by auto + +lemma (in ring) subring_iff: + assumes "H \ carrier R" + shows "subring H R \ ring (R \ carrier := H \)" + using subring.subring_is_ring[OF _ ring_axioms] ring_incl_imp_subring[OF assms] by auto + + +subsubsection \Subcrings\ + +lemma (in ring) subcringI: + assumes "subring H R" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \ h2 = h2 \ h1" + shows "subcring H R" + unfolding subcring_def subcring_axioms_def using assms by simp+ + +lemma (in cring) subcringI': + assumes "subring H R" + shows "subcring H R" + using subcringI[OF assms] subringE(1)[OF assms] m_comm by auto + +lemma subcringE: + assumes "subcring H R" + shows "H \ carrier R" + and "\\<^bsub>R\<^esub> \ H" + and "\\<^bsub>R\<^esub> \ H" + and "H \ {}" + and "\h. h \ H \ \\<^bsub>R\<^esub> h \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 = h2 \\<^bsub>R\<^esub> h1" + using subringE[OF subcring.axioms(1)[OF assms]] subcring.sub_m_comm[OF assms] by simp+ + +lemma (in cring) carrier_is_subcring: "subcring (carrier R) R" + by (simp add: subcringI' carrier_is_subring) + +lemma (in ring) subcring_inter: + assumes "subcring I R" and "subcring J R" + shows "subcring (I \ J) R" + using subcringE[OF assms(1)] subcringE[OF assms(2)] + subcringI[of "I \ J"] subringI[of "I \ J"] by auto + +lemma (in ring) subcring_Inter: + assumes "\I. I \ S \ subcring I R" and "S \ {}" + shows "subcring (\S) R" +proof (rule subcringI) + show "subring (\S) R" + using subcring.axioms(1)[of _ R] subring_Inter[of S] assms by auto +next + fix h1 h2 assume h1: "h1 \ \S" and h2: "h2 \ \S" + obtain S' where S': "S' \ S" + using assms(2) by blast + hence "h1 \ S'" "h2 \ S'" + using h1 h2 by blast+ + thus "h1 \ h2 = h2 \ h1" + using subcring.sub_m_comm[OF assms(1)[OF S']] by simp +qed + +lemma (in ring) subcring_iff: + assumes "H \ carrier R" + shows "subcring H R \ cring (R \ carrier := H \)" +proof + assume A: "subcring H R" + hence ring: "ring (R \ carrier := H \)" + using subring_iff[OF assms] subcring.axioms(1)[OF A] by simp + moreover have "comm_monoid (R \ carrier := H \)" + using monoid.monoid_comm_monoidI[OF ring.is_monoid[OF ring]] + subcring.sub_m_comm[OF A] by auto + ultimately show "cring (R \ carrier := H \)" + using cring_def by blast +next + assume A: "cring (R \ carrier := H \)" + hence "subring H R" + using cring.axioms(1) subring_iff[OF assms] by simp + moreover have "comm_monoid (R \ carrier := H \)" + using A unfolding cring_def by simp + hence"\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \ h2 = h2 \ h1" + using comm_monoid.m_comm[of "R \ carrier := H \"] by auto + ultimately show "subcring H R" + unfolding subcring_def subcring_axioms_def by auto +qed + + +subsubsection \Subdomains\ + +lemma (in ring) subdomainI: + assumes "subcring H R" + and "\ \ \" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \ h2 = \ \ h1 = \ \ h2 = \" + shows "subdomain H R" + unfolding subdomain_def subdomain_axioms_def using assms by simp+ + +lemma (in domain) subdomainI': + assumes "subring H R" + shows "subdomain H R" +proof (rule subdomainI[OF subcringI[OF assms]], simp_all) + show "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \ h2 = h2 \ h1" + using m_comm subringE(1)[OF assms] by auto + show "\h1 h2. \ h1 \ H; h2 \ H; h1 \ h2 = \ \ \ (h1 = \) \ (h2 = \)" + using integral subringE(1)[OF assms] by auto +qed + +lemma subdomainE: + assumes "subdomain H R" + shows "H \ carrier R" + and "\\<^bsub>R\<^esub> \ H" + and "\\<^bsub>R\<^esub> \ H" + and "H \ {}" + and "\h. h \ H \ \\<^bsub>R\<^esub> h \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 \ H" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 = h2 \\<^bsub>R\<^esub> h1" + and "\h1 h2. \ h1 \ H; h2 \ H \ \ h1 \\<^bsub>R\<^esub> h2 = \\<^bsub>R\<^esub> \ h1 = \\<^bsub>R\<^esub> \ h2 = \\<^bsub>R\<^esub>" + and "\\<^bsub>R\<^esub> \ \\<^bsub>R\<^esub>" + using subcringE[OF subdomain.axioms(1)[OF assms]] assms + unfolding subdomain_def subdomain_axioms_def by auto + +lemma (in ring) subdomain_iff: + assumes "H \ carrier R" + shows "subdomain H R \ domain (R \ carrier := H \)" +proof + assume A: "subdomain H R" + hence cring: "cring (R \ carrier := H \)" + using subcring_iff[OF assms] subdomain.axioms(1)[OF A] by simp + thus "domain (R \ carrier := H \)" + using domain.intro[OF cring] subdomain.subintegral[OF A] subdomain.sub_one_not_zero[OF A] + unfolding domain_axioms_def by auto +next + assume A: "domain (R \ carrier := H \)" + hence subcring: "subcring H R" + using subcring_iff[OF assms] unfolding domain_def by simp + thus "subdomain H R" + using subdomain.intro[OF subcring] domain.integral[OF A] domain.one_not_zero[OF A] + unfolding subdomain_axioms_def by auto +qed + + +subsubsection \Subfields\ + +lemma (in ring) subfieldI: + assumes "subcring K R" and "Units (R \ carrier := K \) = K - { \ }" + shows "subfield K R" +proof (rule subfield.intro) + show "subfield_axioms K R" + using assms(2) unfolding subfield_axioms_def . + show "subdomain K R" + proof (rule subdomainI[OF assms(1)], auto) + have subM: "submonoid K R" + using subring.axioms(2)[OF subcring.axioms(1)[OF assms(1)]] . + + show contr: "\ = \ \ False" + proof - + assume one_eq_zero: "\ = \" + have "\ \ K" and "\ \ \ = \" + using submonoid.one_closed[OF subM] by simp+ + hence "\ \ Units (R \ carrier := K \)" + unfolding Units_def by (simp, blast) + hence "\ \ \" + using assms(2) by simp + thus False + using one_eq_zero by simp + qed + + fix k1 k2 assume k1: "k1 \ K" and k2: "k2 \ K" "k2 \ \" and k12: "k1 \ k2 = \" + obtain k2' where k2': "k2' \ K" "k2' \ k2 = \" "k2 \ k2' = \" + using assms(2) k2 unfolding Units_def by auto + have "\ = (k1 \ k2) \ k2'" + using k12 k2'(1) submonoid.mem_carrier[OF subM] by fastforce + also have "... = k1" + using k1 k2(1) k2'(1,3) submonoid.mem_carrier[OF subM] by (simp add: m_assoc) + finally have "\ = k1" . + thus "k1 = \" by simp + qed +qed + +lemma (in field) subfieldI': + assumes "subring K R" and "\k. k \ K - { \ } \ inv k \ K" + shows "subfield K R" +proof (rule subfieldI) + show "subcring K R" + using subcringI[OF assms(1)] m_comm subringE(1)[OF assms(1)] by auto + show "Units (R \ carrier := K \) = K - { \ }" + proof + show "K - { \ } \ Units (R \ carrier := K \)" + proof + fix k assume k: "k \ K - { \ }" + hence inv_k: "inv k \ K" + using assms(2) by simp + moreover have "k \ carrier R - { \ }" + using subringE(1)[OF assms(1)] k by auto + ultimately have "k \ inv k = \" "inv k \ k = \" + by (simp add: field_Units)+ + thus "k \ Units (R \ carrier := K \)" + unfolding Units_def using k inv_k by auto + qed + next + show "Units (R \ carrier := K \) \ K - { \ }" + proof + fix k assume k: "k \ Units (R \ carrier := K \)" + then obtain k' where k': "k' \ K" "k \ k' = \" + unfolding Units_def by auto + hence "k \ carrier R" and "k' \ carrier R" + using k subringE(1)[OF assms(1)] unfolding Units_def by auto + hence "\ = \" if "k = \" + using that k'(2) by auto + thus "k \ K - { \ }" + using k unfolding Units_def by auto + qed + qed +qed + +lemma (in field) carrier_is_subfield: "subfield (carrier R) R" + by (auto intro: subfieldI[OF carrier_is_subcring] simp add: field_Units) + +lemma subfieldE: + assumes "subfield K R" + shows "subring K R" and "subcring K R" + and "K \ carrier R" + and "\k1 k2. \ k1 \ K; k2 \ K \ \ k1 \\<^bsub>R\<^esub> k2 = k2 \\<^bsub>R\<^esub> k1" + and "\k1 k2. \ k1 \ K; k2 \ K \ \ k1 \\<^bsub>R\<^esub> k2 = \\<^bsub>R\<^esub> \ k1 = \\<^bsub>R\<^esub> \ k2 = \\<^bsub>R\<^esub>" + and "\\<^bsub>R\<^esub> \ \\<^bsub>R\<^esub>" + using subdomain.axioms(1)[OF subfield.axioms(1)[OF assms]] subcring_def + subdomainE(1, 8, 9, 10)[OF subfield.axioms(1)[OF assms]] by auto + +lemma (in ring) subfield_m_inv: + assumes "subfield K R" and "k \ K - { \ }" + shows "inv k \ K - { \ }" and "k \ inv k = \" and "inv k \ k = \" +proof - + have K: "subring K R" "submonoid K R" + using subfieldE(1)[OF assms(1)] subring.axioms(2) by auto + have monoid: "monoid (R \ carrier := K \)" + using submonoid.submonoid_is_monoid[OF subring.axioms(2)[OF K(1)] is_monoid] . + + have "monoid R" + by (simp add: monoid_axioms) + + hence k: "k \ Units (R \ carrier := K \)" + using subfield.subfield_Units[OF assms(1)] assms(2) by blast + hence unit_of_R: "k \ Units R" + using assms(2) subringE(1)[OF subfieldE(1)[OF assms(1)]] unfolding Units_def by auto + have "inv\<^bsub>(R \ carrier := K \)\<^esub> k \ Units (R \ carrier := K \)" + by (simp add: k monoid monoid.Units_inv_Units) + hence "inv\<^bsub>(R \ carrier := K \)\<^esub> k \ K - { \ }" + using subfield.subfield_Units[OF assms(1)] by blast + thus "inv k \ K - { \ }" and "k \ inv k = \" and "inv k \ k = \" + using Units_l_inv[OF unit_of_R] Units_r_inv[OF unit_of_R] + using monoid.m_inv_monoid_consistent[OF monoid_axioms k K(2)] by auto +qed + +lemma (in ring) subfield_iff: + shows "\ field (R \ carrier := K \); K \ carrier R \ \ subfield K R" + and "subfield K R \ field (R \ carrier := K \)" +proof- + assume A: "field (R \ carrier := K \)" "K \ carrier R" + have "\k1 k2. \ k1 \ K; k2 \ K \ \ k1 \ k2 = k2 \ k1" + using comm_monoid.m_comm[OF cring.axioms(2)[OF fieldE(1)[OF A(1)]]] by simp + moreover have "subring K R" + using ring_incl_imp_subring[OF A(2) cring.axioms(1)[OF fieldE(1)[OF A(1)]]] . + ultimately have "subcring K R" + using subcringI by simp + thus "subfield K R" + using field.field_Units[OF A(1)] subfieldI by auto +next + assume A: "subfield K R" + have cring: "cring (R \ carrier := K \)" + using subcring_iff[OF subringE(1)[OF subfieldE(1)[OF A]]] subfieldE(2)[OF A] by simp + thus "field (R \ carrier := K \)" + using cring.cring_fieldI[OF cring] subfield.subfield_Units[OF A] by simp +qed + +lemma (in field) subgroup_mult_of : + assumes "subfield K R" + shows "subgroup (K - {\}) (mult_of R)" +proof (intro group.group_incl_imp_subgroup[OF field_mult_group]) + show "K - {\} \ carrier (mult_of R)" + by (simp add: Diff_mono assms carrier_mult_of subfieldE(3)) + show "group ((mult_of R) \ carrier := K - {\} \)" + using field.field_mult_group[OF subfield_iff(2)[OF assms]] + unfolding mult_of_def by simp +qed + + +subsection \Subring Homomorphisms\ + +lemma (in ring) hom_imp_img_subring: + assumes "h \ ring_hom R S" and "subring K R" + shows "ring (S \ carrier := h ` K, one := h \, zero := h \ \)" +proof - + have "ring (R \ carrier := K \)" + using subring.subring_is_ring[OF assms(2) ring_axioms] by simp + moreover have "h \ ring_hom (R \ carrier := K \) S" + using assms subringE(1)[OF assms (2)] unfolding ring_hom_def + apply simp + apply blast + done + ultimately show ?thesis + using ring.ring_hom_imp_img_ring[of "R \ carrier := K \" h S] by simp +qed + +lemma (in ring_hom_ring) img_is_subring: + assumes "subring K R" shows "subring (h ` K) S" +proof - + have "ring (S \ carrier := h ` K \)" + using R.hom_imp_img_subring[OF homh assms] hom_zero hom_one by simp + moreover have "h ` K \ carrier S" + using ring_hom_memE(1)[OF homh] subringE(1)[OF assms] by auto + ultimately show ?thesis + using ring_incl_imp_subring by simp +qed + +lemma (in ring_hom_ring) img_is_subfield: + assumes "subfield K R" and "\\<^bsub>S\<^esub> \ \\<^bsub>S\<^esub>" + shows "inj_on h K" and "subfield (h ` K) S" +proof - + have K: "K \ carrier R" "subring K R" "subring (h ` K) S" + using subfieldE(1)[OF assms(1)] subringE(1) img_is_subring by auto + have field: "field (R \ carrier := K \)" + and ring: "ring (R \ carrier := K \)" "ring (S \ carrier := h ` K \)" + using R.subfield_iff assms(1) + subring.subring_is_ring[OF K(2) R.ring_axioms] + subring.subring_is_ring[OF K(3) S.ring_axioms] by auto + + hence h: "h \ ring_hom (R \ carrier := K \) (S \ carrier := h ` K \)" + unfolding ring_hom_def apply auto + using ring_hom_memE[OF homh] K + by (meson contra_subsetD)+ + hence ring_hom: "ring_hom_ring (R \ carrier := K \) (S \ carrier := h ` K \) h" + using ring_axioms ring ring_hom_ringI2 by blast + have "h ` K \ { \\<^bsub>S\<^esub> }" + using subfieldE(1, 5)[OF assms(1)] subringE(3) assms(2) + by (metis hom_one image_eqI singletonD) + thus "inj_on h K" + using ring_hom_ring.non_trivial_field_hom_imp_inj[OF ring_hom field] by auto + + hence "h \ ring_iso (R \ carrier := K \) (S \ carrier := h ` K \)" + using h unfolding ring_iso_def bij_betw_def by auto + hence "field (S \ carrier := h ` K \)" + using field.ring_iso_imp_img_field[OF field, of h "S \ carrier := h ` K \"] by auto + thus "subfield (h ` K) S" + using S.subfield_iff[of "h ` K"] K(1) ring_hom_memE(1)[OF homh] by blast +qed + +end \ No newline at end of file