# HG changeset patch # User paulson # Date 1530369844 -3600 # Node ID b680e74eb6f2699c312d1dbe19c08c56681f5dd2 # Parent 516e81f7595742c86bbdaebf41bef3bc8ded3a15 More on Algebra by Paulo and Martin diff -r 516e81f75957 -r b680e74eb6f2 src/HOL/Algebra/Divisibility.thy --- a/src/HOL/Algebra/Divisibility.thy Fri Jun 29 23:04:36 2018 +0200 +++ b/src/HOL/Algebra/Divisibility.thy Sat Jun 30 15:44:04 2018 +0100 @@ -763,6 +763,27 @@ apply (metis pp' associated_sym divides_cong_l) done +(*by Paulo Emílio de Vilhena*) +lemma (in comm_monoid_cancel) prime_irreducible: + assumes "prime G p" + shows "irreducible G p" +proof (rule irreducibleI) + show "p \ Units G" + using assms unfolding prime_def by simp +next + fix b assume A: "b \ carrier G" "properfactor G b p" + then obtain c where c: "c \ carrier G" "p = b \ c" + unfolding properfactor_def factor_def by auto + hence "p divides c" + using A assms unfolding prime_def properfactor_def by auto + then obtain b' where b': "b' \ carrier G" "c = p \ b'" + unfolding factor_def by auto + hence "\ = b \ b'" + by (metis A(1) l_cancel m_closed m_lcomm one_closed r_one c) + thus "b \ Units G" + using A(1) Units_one_closed b'(1) unit_factor by presburger +qed + subsection \Factorization and Factorial Monoids\ diff -r 516e81f75957 -r b680e74eb6f2 src/HOL/Algebra/Group.thy --- a/src/HOL/Algebra/Group.thy Fri Jun 29 23:04:36 2018 +0200 +++ b/src/HOL/Algebra/Group.thy Sat Jun 30 15:44:04 2018 +0100 @@ -1438,6 +1438,9 @@ shows "m_inv (units_of G) x = m_inv G x" by (simp add: assms group.inv_equality units_group units_of_carrier units_of_mult units_of_one) +lemma units_of_units [simp] : "Units (units_of G) = Units G" + unfolding units_of_def Units_def by force + lemma (in group) surj_const_mult: "a \ carrier G \ (\x. a \ x) ` carrier G = carrier G" apply (auto simp add: image_def) by (metis inv_closed inv_solve_left m_closed) diff -r 516e81f75957 -r b680e74eb6f2 src/HOL/Algebra/Module.thy --- a/src/HOL/Algebra/Module.thy Fri Jun 29 23:04:36 2018 +0200 +++ b/src/HOL/Algebra/Module.thy Sat Jun 30 15:44:04 2018 +0100 @@ -76,87 +76,95 @@ "!!a x y. [| a \ carrier R; x \ carrier M; y \ carrier M |] ==> (a \\<^bsub>M\<^esub> x) \\<^bsub>M\<^esub> y = a \\<^bsub>M\<^esub> (x \\<^bsub>M\<^esub> y)" shows "algebra R M" -apply intro_locales -apply (rule cring.axioms ring.axioms abelian_group.axioms comm_monoid.axioms assms)+ -apply (rule module_axioms.intro) - apply (simp add: smult_closed) - apply (simp add: smult_l_distr) - apply (simp add: smult_r_distr) - apply (simp add: smult_assoc1) - apply (simp add: smult_one) -apply (rule cring.axioms ring.axioms abelian_group.axioms comm_monoid.axioms assms)+ -apply (rule algebra_axioms.intro) - apply (simp add: smult_assoc2) -done + apply intro_locales + apply (rule cring.axioms ring.axioms abelian_group.axioms comm_monoid.axioms assms)+ + apply (rule module_axioms.intro) + apply (simp add: smult_closed) + apply (simp add: smult_l_distr) + apply (simp add: smult_r_distr) + apply (simp add: smult_assoc1) + apply (simp add: smult_one) + apply (rule cring.axioms ring.axioms abelian_group.axioms comm_monoid.axioms assms)+ + apply (rule algebra_axioms.intro) + apply (simp add: smult_assoc2) + done -lemma (in algebra) R_cring: - "cring R" - .. +lemma (in algebra) R_cring: "cring R" .. -lemma (in algebra) M_cring: - "cring M" - .. +lemma (in algebra) M_cring: "cring M" .. -lemma (in algebra) module: - "module R M" - by (auto intro: moduleI R_cring is_abelian_group - smult_l_distr smult_r_distr smult_assoc1) +lemma (in algebra) module: "module R M" + by (auto intro: moduleI R_cring is_abelian_group smult_l_distr smult_r_distr smult_assoc1) -subsection \Basic Properties of Algebras\ +subsection \Basic Properties of Modules\ -lemma (in algebra) smult_l_null [simp]: - "x \ carrier M ==> \ \\<^bsub>M\<^esub> x = \\<^bsub>M\<^esub>" -proof - - assume M: "x \ carrier M" +lemma (in module) smult_l_null [simp]: + "x \ carrier M ==> \ \\<^bsub>M\<^esub> x = \\<^bsub>M\<^esub>" +proof- + assume M : "x \ carrier M" note facts = M smult_closed [OF R.zero_closed] - from facts have "\ \\<^bsub>M\<^esub> x = (\ \\<^bsub>M\<^esub> x \\<^bsub>M\<^esub> \ \\<^bsub>M\<^esub> x) \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> (\ \\<^bsub>M\<^esub> x)" by algebra - also from M have "... = (\ \ \) \\<^bsub>M\<^esub> x \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> (\ \\<^bsub>M\<^esub> x)" - by (simp add: smult_l_distr del: R.l_zero R.r_zero) - also from facts have "... = \\<^bsub>M\<^esub>" apply algebra apply algebra done - finally show ?thesis . + from facts have "\ \\<^bsub>M\<^esub> x = (\ \ \) \\<^bsub>M\<^esub> x " + using smult_l_distr by auto + also have "... = \ \\<^bsub>M\<^esub> x \\<^bsub>M\<^esub> \ \\<^bsub>M\<^esub> x" + using smult_l_distr[of \ \ x] facts by auto + finally show "\ \\<^bsub>M\<^esub> x = \\<^bsub>M\<^esub>" using facts + by (metis M.add.r_cancel_one') qed -lemma (in algebra) smult_r_null [simp]: +lemma (in module) smult_r_null [simp]: "a \ carrier R ==> a \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> = \\<^bsub>M\<^esub>" proof - assume R: "a \ carrier R" note facts = R smult_closed from facts have "a \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> = (a \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> a \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>) \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> (a \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>)" - by algebra + by (simp add: M.add.inv_solve_right) also from R have "... = a \\<^bsub>M\<^esub> (\\<^bsub>M\<^esub> \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>) \\<^bsub>M\<^esub> \\<^bsub>M\<^esub> (a \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>)" by (simp add: smult_r_distr del: M.l_zero M.r_zero) - also from facts have "... = \\<^bsub>M\<^esub>" by algebra + also from facts have "... = \\<^bsub>M\<^esub>" + by (simp add: M.r_neg) finally show ?thesis . qed -lemma (in algebra) smult_l_minus: - "[| a \ carrier R; x \ carrier M |] ==> (\a) \\<^bsub>M\<^esub> x = \\<^bsub>M\<^esub> (a \\<^bsub>M\<^esub> x)" -proof - +lemma (in module) smult_l_minus: +"\ a \ carrier R; x \ carrier M \ \ (\a) \\<^bsub>M\<^esub> x = \\<^bsub>M\<^esub> (a \\<^bsub>M\<^esub> x)" +proof- assume RM: "a \ carrier R" "x \ carrier M" from RM have a_smult: "a \\<^bsub>M\<^esub> x \ carrier M" by simp from RM have ma_smult: "\a \\<^bsub>M\<^esub> x \ carrier M" by simp note facts = RM a_smult ma_smult from facts have "(\a) \\<^bsub>M\<^esub> x = (\a \\<^bsub>M\<^esub> x \\<^bsub>M\<^esub> a \\<^bsub>M\<^esub> x) \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>(a \\<^bsub>M\<^esub> x)" - by algebra + by (simp add: M.add.inv_solve_right) also from RM have "... = (\a \ a) \\<^bsub>M\<^esub> x \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>(a \\<^bsub>M\<^esub> x)" by (simp add: smult_l_distr) also from facts smult_l_null have "... = \\<^bsub>M\<^esub>(a \\<^bsub>M\<^esub> x)" - apply algebra apply algebra done + by (simp add: R.l_neg) finally show ?thesis . qed -lemma (in algebra) smult_r_minus: +lemma (in module) smult_r_minus: "[| a \ carrier R; x \ carrier M |] ==> a \\<^bsub>M\<^esub> (\\<^bsub>M\<^esub>x) = \\<^bsub>M\<^esub> (a \\<^bsub>M\<^esub> x)" proof - assume RM: "a \ carrier R" "x \ carrier M" note facts = RM smult_closed from facts have "a \\<^bsub>M\<^esub> (\\<^bsub>M\<^esub>x) = (a \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>x \\<^bsub>M\<^esub> a \\<^bsub>M\<^esub> x) \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>(a \\<^bsub>M\<^esub> x)" - by algebra + by (simp add: M.add.inv_solve_right) also from RM have "... = a \\<^bsub>M\<^esub> (\\<^bsub>M\<^esub>x \\<^bsub>M\<^esub> x) \\<^bsub>M\<^esub> \\<^bsub>M\<^esub>(a \\<^bsub>M\<^esub> x)" by (simp add: smult_r_distr) - also from facts smult_r_null have "... = \\<^bsub>M\<^esub>(a \\<^bsub>M\<^esub> x)" by algebra + also from facts smult_l_null have "... = \\<^bsub>M\<^esub>(a \\<^bsub>M\<^esub> x)" + by (metis M.add.inv_closed M.add.inv_solve_right M.l_neg R.zero_closed r_null smult_assoc1) finally show ?thesis . qed +lemma (in module) finsum_smult_ldistr: + "\ finite A; a \ carrier R; f: A \ carrier M \ \ + a \\<^bsub>M\<^esub> (\\<^bsub>M\<^esub> i \ A. (f i)) = (\\<^bsub>M\<^esub> i \ A. ( a \\<^bsub>M\<^esub> (f i)))" +proof (induct set: finite) + case empty then show ?case + by (metis M.finsum_empty M.zero_closed R.zero_closed r_null smult_assoc1 smult_l_null) +next + case (insert x F) then show ?case + by (simp add: Pi_def smult_r_distr) +qed + end diff -r 516e81f75957 -r b680e74eb6f2 src/HOL/Algebra/Multiplicative_Group.thy --- a/src/HOL/Algebra/Multiplicative_Group.thy Fri Jun 29 23:04:36 2018 +0200 +++ b/src/HOL/Algebra/Multiplicative_Group.thy Sat Jun 30 15:44:04 2018 +0100 @@ -590,7 +590,11 @@ lemmas mult_of_simps = carrier_mult_of mult_mult_of nat_pow_mult_of one_mult_of -context field begin +context field +begin + +lemma mult_of_is_Units: "mult_of R = units_of R" + unfolding mult_of_def units_of_def using field_Units by auto lemma field_mult_group : shows "group (mult_of R)" diff -r 516e81f75957 -r b680e74eb6f2 src/HOL/Algebra/QuotRing.thy --- a/src/HOL/Algebra/QuotRing.thy Fri Jun 29 23:04:36 2018 +0200 +++ b/src/HOL/Algebra/QuotRing.thy Sat Jun 30 15:44:04 2018 +0100 @@ -1,5 +1,7 @@ (* Title: HOL/Algebra/QuotRing.thy Author: Stephan Hohe + Author: Paulo Emílio de Vilhena + *) theory QuotRing @@ -306,4 +308,831 @@ qed qed + +lemma (in ring_hom_ring) trivial_hom_iff: + "(h ` (carrier R) = { \\<^bsub>S\<^esub> }) = (a_kernel R S h = carrier R)" + using group_hom.trivial_hom_iff[OF a_group_hom] by (simp add: a_kernel_def) + +lemma (in ring_hom_ring) trivial_ker_imp_inj: + assumes "a_kernel R S h = { \ }" + shows "inj_on h (carrier R)" + using group_hom.trivial_ker_imp_inj[OF a_group_hom] assms a_kernel_def[of R S h] by simp + +lemma (in ring_hom_ring) non_trivial_field_hom_imp_inj: + assumes "field R" + shows "h ` (carrier R) \ { \\<^bsub>S\<^esub> } \ inj_on h (carrier R)" +proof - + assume "h ` (carrier R) \ { \\<^bsub>S\<^esub> }" + hence "a_kernel R S h \ carrier R" + using trivial_hom_iff by linarith + hence "a_kernel R S h = { \ }" + using field.all_ideals[OF assms] kernel_is_ideal by blast + thus "inj_on h (carrier R)" + using trivial_ker_imp_inj by blast +qed + +lemma (in ring_hom_ring) img_is_add_subgroup: + assumes "subgroup H (add_monoid R)" + shows "subgroup (h ` H) (add_monoid S)" +proof - + have "group ((add_monoid R) \ carrier := H \)" + using assms R.add.subgroup_imp_group by blast + moreover have "H \ carrier R" by (simp add: R.add.subgroupE(1) assms) + hence "h \ hom ((add_monoid R) \ carrier := H \) (add_monoid S)" + unfolding hom_def by (auto simp add: subsetD) + ultimately have "subgroup (h ` carrier ((add_monoid R) \ carrier := H \)) (add_monoid S)" + using group_hom.img_is_subgroup[of "(add_monoid R) \ carrier := H \" "add_monoid S" h] + using a_group_hom group_hom_axioms.intro group_hom_def by blast + thus "subgroup (h ` H) (add_monoid S)" by simp +qed + +lemma (in ring) ring_ideal_imp_quot_ideal: + assumes "ideal I R" + shows "ideal J R \ ideal ((+>) I ` J) (R Quot I)" +proof - + assume A: "ideal J R" show "ideal (((+>) I) ` J) (R Quot I)" + proof (rule idealI) + show "ring (R Quot I)" + by (simp add: assms(1) ideal.quotient_is_ring) + next + have "subgroup J (add_monoid R)" + by (simp add: additive_subgroup.a_subgroup A ideal.axioms(1)) + moreover have "((+>) I) \ ring_hom R (R Quot I)" + by (simp add: assms(1) ideal.rcos_ring_hom) + ultimately show "subgroup ((+>) I ` J) (add_monoid (R Quot I))" + using assms(1) ideal.rcos_ring_hom_ring ring_hom_ring.img_is_add_subgroup by blast + next + fix a x assume "a \ (+>) I ` J" "x \ carrier (R Quot I)" + then obtain i j where i: "i \ carrier R" "x = I +> i" + and j: "j \ J" "a = I +> j" + unfolding FactRing_def using A_RCOSETS_def'[of R I] by auto + hence "a \\<^bsub>R Quot I\<^esub> x = [mod I:] (I +> j) \ (I +> i)" + unfolding FactRing_def by simp + hence "a \\<^bsub>R Quot I\<^esub> x = I +> (j \ i)" + using ideal.rcoset_mult_add[OF assms(1), of j i] i(1) j(1) A ideal.Icarr by force + thus "a \\<^bsub>R Quot I\<^esub> x \ (+>) I ` J" + using A i(1) j(1) by (simp add: ideal.I_r_closed) + + have "x \\<^bsub>R Quot I\<^esub> a = [mod I:] (I +> i) \ (I +> j)" + unfolding FactRing_def i j by simp + hence "x \\<^bsub>R Quot I\<^esub> a = I +> (i \ j)" + using ideal.rcoset_mult_add[OF assms(1), of i j] i(1) j(1) A ideal.Icarr by force + thus "x \\<^bsub>R Quot I\<^esub> a \ (+>) I ` J" + using A i(1) j(1) by (simp add: ideal.I_l_closed) + qed +qed + +lemma (in ring_hom_ring) ideal_vimage: + assumes "ideal I S" + shows "ideal { r \ carrier R. h r \ I } R" (* or (carrier R) \ (h -` I) *) +proof + show "{ r \ carrier R. h r \ I } \ carrier (add_monoid R)" by auto +next + show "\\<^bsub>add_monoid R\<^esub> \ { r \ carrier R. h r \ I }" + by (simp add: additive_subgroup.zero_closed assms ideal.axioms(1)) +next + fix a b + assume "a \ { r \ carrier R. h r \ I }" + and "b \ { r \ carrier R. h r \ I }" + hence a: "a \ carrier R" "h a \ I" + and b: "b \ carrier R" "h b \ I" by auto + hence "h (a \ b) = (h a) \\<^bsub>S\<^esub> (h b)" using hom_add by blast + moreover have "(h a) \\<^bsub>S\<^esub> (h b) \ I" using a b assms + by (simp add: additive_subgroup.a_closed ideal.axioms(1)) + ultimately show "a \\<^bsub>add_monoid R\<^esub> b \ { r \ carrier R. h r \ I }" + using a(1) b (1) by auto + + have "h (\ a) = \\<^bsub>S\<^esub> (h a)" by (simp add: a) + moreover have "\\<^bsub>S\<^esub> (h a) \ I" + by (simp add: a(2) additive_subgroup.a_inv_closed assms ideal.axioms(1)) + ultimately show "inv\<^bsub>add_monoid R\<^esub> a \ { r \ carrier R. h r \ I }" + using a by (simp add: a_inv_def) +next + fix a r + assume "a \ { r \ carrier R. h r \ I }" and r: "r \ carrier R" + hence a: "a \ carrier R" "h a \ I" by auto + + have "h a \\<^bsub>S\<^esub> h r \ I" + using assms a r by (simp add: ideal.I_r_closed) + thus "a \ r \ { r \ carrier R. h r \ I }" by (simp add: a(1) r) + + have "h r \\<^bsub>S\<^esub> h a \ I" + using assms a r by (simp add: ideal.I_l_closed) + thus "r \ a \ { r \ carrier R. h r \ I }" by (simp add: a(1) r) +qed + +lemma (in ring) canonical_proj_vimage_in_carrier: + assumes "ideal I R" + shows "J \ carrier (R Quot I) \ \ J \ carrier R" +proof - + assume A: "J \ carrier (R Quot I)" show "\ J \ carrier R" + proof + fix j assume j: "j \ \ J" + then obtain j' where j': "j' \ J" "j \ j'" by blast + then obtain r where r: "r \ carrier R" "j' = I +> r" + using A j' unfolding FactRing_def using A_RCOSETS_def'[of R I] by auto + thus "j \ carrier R" using j' assms + by (meson a_r_coset_subset_G additive_subgroup.a_subset contra_subsetD ideal.axioms(1)) + qed +qed + +lemma (in ring) canonical_proj_vimage_mem_iff: + assumes "ideal I R" "J \ carrier (R Quot I)" + shows "\a. a \ carrier R \ (a \ (\ J)) = (I +> a \ J)" +proof - + fix a assume a: "a \ carrier R" show "(a \ (\ J)) = (I +> a \ J)" + proof + assume "a \ \ J" + then obtain j where j: "j \ J" "a \ j" by blast + then obtain r where r: "r \ carrier R" "j = I +> r" + using assms j unfolding FactRing_def using A_RCOSETS_def'[of R I] by auto + hence "I +> r = I +> a" + using add.repr_independence[of a I r] j r + by (metis a_r_coset_def additive_subgroup.a_subgroup assms(1) ideal.axioms(1)) + thus "I +> a \ J" using r j by simp + next + assume "I +> a \ J" + hence "\ \ a \ I +> a" + using additive_subgroup.zero_closed[OF ideal.axioms(1)[OF assms(1)]] + a_r_coset_def'[of R I a] by blast + thus "a \ \ J" using a \I +> a \ J\ by auto + qed +qed + +corollary (in ring) quot_ideal_imp_ring_ideal: + assumes "ideal I R" + shows "ideal J (R Quot I) \ ideal (\ J) R" +proof - + assume A: "ideal J (R Quot I)" + have "\ J = { r \ carrier R. I +> r \ J }" + using canonical_proj_vimage_in_carrier[OF assms, of J] + canonical_proj_vimage_mem_iff[OF assms, of J] + additive_subgroup.a_subset[OF ideal.axioms(1)[OF A]] by blast + thus "ideal (\ J) R" + using ring_hom_ring.ideal_vimage[OF ideal.rcos_ring_hom_ring[OF assms] A] by simp +qed + +lemma (in ring) ideal_incl_iff: + assumes "ideal I R" "ideal J R" + shows "(I \ J) = (J = (\ j \ J. I +> j))" +proof + assume A: "J = (\ j \ J. I +> j)" hence "I +> \ \ J" + using additive_subgroup.zero_closed[OF ideal.axioms(1)[OF assms(2)]] by blast + thus "I \ J" using additive_subgroup.a_subset[OF ideal.axioms(1)[OF assms(1)]] by simp +next + assume A: "I \ J" show "J = (\j\J. I +> j)" + proof + show "J \ (\ j \ J. I +> j)" + proof + fix j assume j: "j \ J" + have "\ \ I" by (simp add: additive_subgroup.zero_closed assms(1) ideal.axioms(1)) + hence "\ \ j \ I +> j" + using a_r_coset_def'[of R I j] by blast + thus "j \ (\j\J. I +> j)" + using assms(2) j additive_subgroup.a_Hcarr ideal.axioms(1) by fastforce + qed + next + show "(\ j \ J. I +> j) \ J" + proof + fix x assume "x \ (\ j \ J. I +> j)" + then obtain j where j: "j \ J" "x \ I +> j" by blast + then obtain i where i: "i \ I" "x = i \ j" + using a_r_coset_def'[of R I j] by blast + thus "x \ J" + using assms(2) j A additive_subgroup.a_closed[OF ideal.axioms(1)[OF assms(2)]] by blast + qed + qed +qed + +theorem (in ring) quot_ideal_correspondence: + assumes "ideal I R" + shows "bij_betw (\J. (+>) I ` J) { J. ideal J R \ I \ J } { J . ideal J (R Quot I) }" +proof (rule bij_betw_byWitness[where ?f' = "\X. \ X"]) + show "\J \ { J. ideal J R \ I \ J }. (\X. \ X) ((+>) I ` J) = J" + using assms ideal_incl_iff by blast +next + show "(\J. (+>) I ` J) ` { J. ideal J R \ I \ J } \ { J. ideal J (R Quot I) }" + using assms ring_ideal_imp_quot_ideal by auto +next + show "(\X. \ X) ` { J. ideal J (R Quot I) } \ { J. ideal J R \ I \ J }" + proof + fix J assume "J \ ((\X. \ X) ` { J. ideal J (R Quot I) })" + then obtain J' where J': "ideal J' (R Quot I)" "J = \ J'" by blast + hence "ideal J R" + using assms quot_ideal_imp_ring_ideal by auto + moreover have "I \ J'" + using additive_subgroup.zero_closed[OF ideal.axioms(1)[OF J'(1)]] unfolding FactRing_def by simp + ultimately show "J \ { J. ideal J R \ I \ J }" using J'(2) by auto + qed +next + show "\J' \ { J. ideal J (R Quot I) }. ((+>) I ` (\ J')) = J'" + proof + fix J' assume "J' \ { J. ideal J (R Quot I) }" + hence subset: "J' \ carrier (R Quot I) \ ideal J' (R Quot I)" + using additive_subgroup.a_subset ideal_def by blast + hence "((+>) I ` (\ J')) \ J'" + using canonical_proj_vimage_in_carrier canonical_proj_vimage_mem_iff + by (meson assms contra_subsetD image_subsetI) + moreover have "J' \ ((+>) I ` (\ J'))" + proof + fix x assume "x \ J'" + then obtain r where r: "r \ carrier R" "x = I +> r" + using subset unfolding FactRing_def A_RCOSETS_def'[of R I] by auto + hence "r \ (\ J')" + using \x \ J'\ assms canonical_proj_vimage_mem_iff subset by blast + thus "x \ ((+>) I ` (\ J'))" using r(2) by blast + qed + ultimately show "((+>) I ` (\ J')) = J'" by blast + qed +qed + +lemma (in cring) quot_domain_imp_primeideal: + assumes "ideal P R" + shows "domain (R Quot P) \ primeideal P R" +proof - + assume A: "domain (R Quot P)" show "primeideal P R" + proof (rule primeidealI) + show "ideal P R" using assms . + show "cring R" using is_cring . + next + show "carrier R \ P" + proof (rule ccontr) + assume "\ carrier R \ P" hence "carrier R = P" by simp + hence "\I. I \ carrier (R Quot P) \ I = P" + unfolding FactRing_def A_RCOSETS_def' apply simp + using a_coset_join2 additive_subgroup.a_subgroup assms ideal.axioms(1) by blast + hence "\\<^bsub>(R Quot P)\<^esub> = \\<^bsub>(R Quot P)\<^esub>" + by (metis assms ideal.quotient_is_ring ring.ring_simprules(2) ring.ring_simprules(6)) + thus False using domain.one_not_zero[OF A] by simp + qed + next + fix a b assume a: "a \ carrier R" and b: "b \ carrier R" and ab: "a \ b \ P" + hence "P +> (a \ b) = \\<^bsub>(R Quot P)\<^esub>" unfolding FactRing_def + by (simp add: a_coset_join2 additive_subgroup.a_subgroup assms ideal.axioms(1)) + moreover have "(P +> a) \\<^bsub>(R Quot P)\<^esub> (P +> b) = P +> (a \ b)" unfolding FactRing_def + using a b by (simp add: assms ideal.rcoset_mult_add) + moreover have "P +> a \ carrier (R Quot P) \ P +> b \ carrier (R Quot P)" + by (simp add: a b FactRing_def a_rcosetsI additive_subgroup.a_subset assms ideal.axioms(1)) + ultimately have "P +> a = \\<^bsub>(R Quot P)\<^esub> \ P +> b = \\<^bsub>(R Quot P)\<^esub>" + using domain.integral[OF A, of "P +> a" "P +> b"] by auto + thus "a \ P \ b \ P" unfolding FactRing_def apply simp + using a b assms a_coset_join1 additive_subgroup.a_subgroup ideal.axioms(1) by blast + qed +qed + +lemma (in cring) quot_domain_iff_primeideal: + assumes "ideal P R" + shows "domain (R Quot P) = primeideal P R" + using quot_domain_imp_primeideal[OF assms] primeideal.quotient_is_domain[of P R] by auto + + +subsection \Isomorphism\ + +definition + ring_iso :: "_ \ _ \ ('a \ 'b) set" + where "ring_iso R S = { h. h \ ring_hom R S \ bij_betw h (carrier R) (carrier S) }" + +definition + is_ring_iso :: "_ \ _ \ bool" (infixr "\" 60) + where "R \ S = (ring_iso R S \ {})" + +definition + morphic_prop :: "_ \ ('a \ bool) \ bool" + where "morphic_prop R P = + ((P \\<^bsub>R\<^esub>) \ + (\r \ carrier R. P r) \ + (\r1 \ carrier R. \r2 \ carrier R. P (r1 \\<^bsub>R\<^esub> r2)) \ + (\r1 \ carrier R. \r2 \ carrier R. P (r1 \\<^bsub>R\<^esub> r2)))" + +lemma ring_iso_memI: + fixes R (structure) and S (structure) + assumes "\x. x \ carrier R \ h x \ carrier S" + and "\x y. \ x \ carrier R; y \ carrier R \ \ h (x \ y) = h x \\<^bsub>S\<^esub> h y" + and "\x y. \ x \ carrier R; y \ carrier R \ \ h (x \ y) = h x \\<^bsub>S\<^esub> h y" + and "h \ = \\<^bsub>S\<^esub>" + and "bij_betw h (carrier R) (carrier S)" + shows "h \ ring_iso R S" + by (auto simp add: ring_hom_memI assms ring_iso_def) + +lemma ring_iso_memE: + fixes R (structure) and S (structure) + assumes "h \ ring_iso R S" + shows "\x. x \ carrier R \ h x \ carrier S" + and "\x y. \ x \ carrier R; y \ carrier R \ \ h (x \ y) = h x \\<^bsub>S\<^esub> h y" + and "\x y. \ x \ carrier R; y \ carrier R \ \ h (x \ y) = h x \\<^bsub>S\<^esub> h y" + and "h \ = \\<^bsub>S\<^esub>" + and "bij_betw h (carrier R) (carrier S)" + using assms unfolding ring_iso_def ring_hom_def by auto + +lemma morphic_propI: + fixes R (structure) + assumes "P \" + and "\r. r \ carrier R \ P r" + and "\r1 r2. \ r1 \ carrier R; r2 \ carrier R \ \ P (r1 \ r2)" + and "\r1 r2. \ r1 \ carrier R; r2 \ carrier R \ \ P (r1 \ r2)" + shows "morphic_prop R P" + unfolding morphic_prop_def using assms by auto + +lemma morphic_propE: + fixes R (structure) + assumes "morphic_prop R P" + shows "P \" + and "\r. r \ carrier R \ P r" + and "\r1 r2. \ r1 \ carrier R; r2 \ carrier R \ \ P (r1 \ r2)" + and "\r1 r2. \ r1 \ carrier R; r2 \ carrier R \ \ P (r1 \ r2)" + using assms unfolding morphic_prop_def by auto + +lemma ring_iso_restrict: + assumes "f \ ring_iso R S" + and "\r. r \ carrier R \ f r = g r" + and "ring R" + shows "g \ ring_iso R S" +proof (rule ring_iso_memI) + show "bij_betw g (carrier R) (carrier S)" + using assms(1-2) bij_betw_cong ring_iso_memE(5) by blast + show "g \\<^bsub>R\<^esub> = \\<^bsub>S\<^esub>" + using assms ring.ring_simprules(6) ring_iso_memE(4) by force +next + fix x y assume x: "x \ carrier R" and y: "y \ carrier R" + show "g x \ carrier S" + using assms(1-2) ring_iso_memE(1) x by fastforce + show "g (x \\<^bsub>R\<^esub> y) = g x \\<^bsub>S\<^esub> g y" + by (metis assms ring.ring_simprules(5) ring_iso_memE(2) x y) + show "g (x \\<^bsub>R\<^esub> y) = g x \\<^bsub>S\<^esub> g y" + by (metis assms ring.ring_simprules(1) ring_iso_memE(3) x y) +qed + +lemma ring_iso_morphic_prop: + assumes "f \ ring_iso R S" + and "morphic_prop R P" + and "\r. P r \ f r = g r" + shows "g \ ring_iso R S" +proof - + have eq0: "\r. r \ carrier R \ f r = g r" + and eq1: "f \\<^bsub>R\<^esub> = g \\<^bsub>R\<^esub>" + and eq2: "\r1 r2. \ r1 \ carrier R; r2 \ carrier R \ \ f (r1 \\<^bsub>R\<^esub> r2) = g (r1 \\<^bsub>R\<^esub> r2)" + and eq3: "\r1 r2. \ r1 \ carrier R; r2 \ carrier R \ \ f (r1 \\<^bsub>R\<^esub> r2) = g (r1 \\<^bsub>R\<^esub> r2)" + using assms(2-3) unfolding morphic_prop_def by auto + show ?thesis + apply (rule ring_iso_memI) + using assms(1) eq0 ring_iso_memE(1) apply fastforce + apply (metis assms(1) eq0 eq2 ring_iso_memE(2)) + apply (metis assms(1) eq0 eq3 ring_iso_memE(3)) + using assms(1) eq1 ring_iso_memE(4) apply fastforce + using assms(1) bij_betw_cong eq0 ring_iso_memE(5) by blast +qed + +lemma (in ring) ring_hom_imp_img_ring: + assumes "h \ ring_hom R S" + shows "ring (S \ carrier := h ` (carrier R), one := h \, zero := h \ \)" (is "ring ?h_img") +proof - + have "h \ hom (add_monoid R) (add_monoid S)" + using assms unfolding hom_def ring_hom_def by auto + hence "comm_group ((add_monoid S) \ carrier := h ` (carrier R), one := h \ \)" + using add.hom_imp_img_comm_group[of h "add_monoid S"] by simp + hence comm_group: "comm_group (add_monoid ?h_img)" + by (auto intro: comm_monoidI simp add: monoid.defs) + + moreover have "h \ hom R S" + using assms unfolding ring_hom_def hom_def by auto + hence "monoid (S \ carrier := h ` (carrier R), one := h \ \)" + using hom_imp_img_monoid[of h S] by simp + hence monoid: "monoid ?h_img" + unfolding monoid_def by (simp add: monoid.defs) + + show ?thesis + proof (rule ringI, simp_all add: comm_group_abelian_groupI[OF comm_group] monoid) + fix x y z assume "x \ h ` carrier R" "y \ h ` carrier R" "z \ h ` carrier R" + then obtain r1 r2 r3 + where r1: "r1 \ carrier R" "x = h r1" + and r2: "r2 \ carrier R" "y = h r2" + and r3: "r3 \ carrier R" "z = h r3" by blast + hence "(x \\<^bsub>S\<^esub> y) \\<^bsub>S\<^esub> z = h ((r1 \ r2) \ r3)" + using ring_hom_memE[OF assms] by auto + also have " ... = h ((r1 \ r3) \ (r2 \ r3))" + using l_distr[OF r1(1) r2(1) r3(1)] by simp + also have " ... = (x \\<^bsub>S\<^esub> z) \\<^bsub>S\<^esub> (y \\<^bsub>S\<^esub> z)" + using ring_hom_memE[OF assms] r1 r2 r3 by auto + finally show "(x \\<^bsub>S\<^esub> y) \\<^bsub>S\<^esub> z = (x \\<^bsub>S\<^esub> z) \\<^bsub>S\<^esub> (y \\<^bsub>S\<^esub> z)" . + + have "z \\<^bsub>S\<^esub> (x \\<^bsub>S\<^esub> y) = h (r3 \ (r1 \ r2))" + using ring_hom_memE[OF assms] r1 r2 r3 by auto + also have " ... = h ((r3 \ r1) \ (r3 \ r2))" + using r_distr[OF r1(1) r2(1) r3(1)] by simp + also have " ... = (z \\<^bsub>S\<^esub> x) \\<^bsub>S\<^esub> (z \\<^bsub>S\<^esub> y)" + using ring_hom_memE[OF assms] r1 r2 r3 by auto + finally show "z \\<^bsub>S\<^esub> (x \\<^bsub>S\<^esub> y) = (z \\<^bsub>S\<^esub> x) \\<^bsub>S\<^esub> (z \\<^bsub>S\<^esub> y)" . + qed +qed + +lemma (in ring) ring_iso_imp_img_ring: + assumes "h \ ring_iso R S" + shows "ring (S \ one := h \, zero := h \ \)" +proof - + have "ring (S \ carrier := h ` (carrier R), one := h \, zero := h \ \)" + using ring_hom_imp_img_ring[of h S] assms unfolding ring_iso_def by auto + moreover have "h ` (carrier R) = carrier S" + using assms unfolding ring_iso_def bij_betw_def by auto + ultimately show ?thesis by simp +qed + +lemma (in cring) ring_iso_imp_img_cring: + assumes "h \ ring_iso R S" + shows "cring (S \ one := h \, zero := h \ \)" (is "cring ?h_img") +proof - + note m_comm + interpret h_img?: ring ?h_img + using ring_iso_imp_img_ring[OF assms] . + show ?thesis + proof (unfold_locales) + fix x y assume "x \ carrier ?h_img" "y \ carrier ?h_img" + then obtain r1 r2 + where r1: "r1 \ carrier R" "x = h r1" + and r2: "r2 \ carrier R" "y = h r2" + using assms image_iff[where ?f = h and ?A = "carrier R"] + unfolding ring_iso_def bij_betw_def by auto + have "x \\<^bsub>(?h_img)\<^esub> y = h (r1 \ r2)" + using assms r1 r2 unfolding ring_iso_def ring_hom_def by auto + also have " ... = h (r2 \ r1)" + using m_comm[OF r1(1) r2(1)] by simp + also have " ... = y \\<^bsub>(?h_img)\<^esub> x" + using assms r1 r2 unfolding ring_iso_def ring_hom_def by auto + finally show "x \\<^bsub>(?h_img)\<^esub> y = y \\<^bsub>(?h_img)\<^esub> x" . + qed +qed + +lemma (in domain) ring_iso_imp_img_domain: + assumes "h \ ring_iso R S" + shows "domain (S \ one := h \, zero := h \ \)" (is "domain ?h_img") +proof - + note aux = m_closed integral one_not_zero one_closed zero_closed + interpret h_img?: cring ?h_img + using ring_iso_imp_img_cring[OF assms] . + show ?thesis + proof (unfold_locales) + show "\\<^bsub>?h_img\<^esub> \ \\<^bsub>?h_img\<^esub>" + using ring_iso_memE(5)[OF assms] aux(3-4) + unfolding bij_betw_def inj_on_def by force + next + fix a b + assume A: "a \\<^bsub>?h_img\<^esub> b = \\<^bsub>?h_img\<^esub>" "a \ carrier ?h_img" "b \ carrier ?h_img" + then obtain r1 r2 + where r1: "r1 \ carrier R" "a = h r1" + and r2: "r2 \ carrier R" "b = h r2" + using assms image_iff[where ?f = h and ?A = "carrier R"] + unfolding ring_iso_def bij_betw_def by auto + hence "a \\<^bsub>?h_img\<^esub> b = h (r1 \ r2)" + using assms r1 r2 unfolding ring_iso_def ring_hom_def by auto + hence "h (r1 \ r2) = h \" + using A(1) by simp + hence "r1 \ r2 = \" + using ring_iso_memE(5)[OF assms] aux(1)[OF r1(1) r2(1)] aux(5) + unfolding bij_betw_def inj_on_def by force + hence "r1 = \ \ r2 = \" + using aux(2)[OF _ r1(1) r2(1)] by simp + thus "a = \\<^bsub>?h_img\<^esub> \ b = \\<^bsub>?h_img\<^esub>" + unfolding r1 r2 by auto + qed +qed + +lemma (in field) ring_iso_imp_img_field: + assumes "h \ ring_iso R S" + shows "field (S \ one := h \, zero := h \ \)" (is "field ?h_img") +proof - + interpret h_img?: domain ?h_img + using ring_iso_imp_img_domain[OF assms] . + show ?thesis + proof (unfold_locales, auto simp add: Units_def) + interpret field R using field_axioms . + fix a assume a: "a \ carrier S" "a \\<^bsub>S\<^esub> h \ = h \" + then obtain r where r: "r \ carrier R" "a = h r" + using assms image_iff[where ?f = h and ?A = "carrier R"] + unfolding ring_iso_def bij_betw_def by auto + have "a \\<^bsub>S\<^esub> h \ = h (r \ \)" unfolding r(2) + using ring_iso_memE(2)[OF assms r(1)] by simp + hence "h \ = h \" + using r(1) a(2) by simp + thus False + using ring_iso_memE(5)[OF assms] + unfolding bij_betw_def inj_on_def by force + next + interpret field R using field_axioms . + fix s assume s: "s \ carrier S" "s \ h \" + then obtain r where r: "r \ carrier R" "s = h r" + using assms image_iff[where ?f = h and ?A = "carrier R"] + unfolding ring_iso_def bij_betw_def by auto + hence "r \ \" using s(2) by auto + hence inv_r: "inv r \ carrier R" "inv r \ \" "r \ inv r = \" "inv r \ r = \" + using field_Units r(1) by auto + have "h (inv r) \\<^bsub>S\<^esub> h r = h \" and "h r \\<^bsub>S\<^esub> h (inv r) = h \" + using ring_iso_memE(2)[OF assms inv_r(1) r(1)] inv_r(3-4) + ring_iso_memE(2)[OF assms r(1) inv_r(1)] by auto + thus "\s' \ carrier S. s' \\<^bsub>S\<^esub> s = h \ \ s \\<^bsub>S\<^esub> s' = h \" + using ring_iso_memE(1)[OF assms inv_r(1)] r(2) by auto + qed +qed + +lemma ring_iso_same_card: "R \ S \ card (carrier R) = card (carrier S)" +proof - + assume "R \ S" + then obtain h where "bij_betw h (carrier R) (carrier S)" + unfolding is_ring_iso_def ring_iso_def by auto + thus "card (carrier R) = card (carrier S)" + using bij_betw_same_card[of h "carrier R" "carrier S"] by simp +qed + +lemma ring_iso_set_refl: "id \ ring_iso R R" + by (rule ring_iso_memI) (auto) + +corollary ring_iso_refl: "R \ R" + using is_ring_iso_def ring_iso_set_refl by auto + +lemma ring_iso_set_trans: + "\ f \ ring_iso R S; g \ ring_iso S Q \ \ (g \ f) \ ring_iso R Q" + unfolding ring_iso_def using bij_betw_trans ring_hom_trans by fastforce + +corollary ring_iso_trans: "\ R \ S; S \ Q \ \ R \ Q" + using ring_iso_set_trans unfolding is_ring_iso_def by blast + +lemma ring_iso_set_sym: + assumes "ring R" + shows "h \ ring_iso R S \ (inv_into (carrier R) h) \ ring_iso S R" +proof - + assume h: "h \ ring_iso R S" + hence h_hom: "h \ ring_hom R S" + and h_surj: "h ` (carrier R) = (carrier S)" + and h_inj: "\ x1 x2. \ x1 \ carrier R; x2 \ carrier R \ \ h x1 = h x2 \ x1 = x2" + unfolding ring_iso_def bij_betw_def inj_on_def by auto + + have h_inv_bij: "bij_betw (inv_into (carrier R) h) (carrier S) (carrier R)" + using bij_betw_inv_into h ring_iso_def by fastforce + + show "inv_into (carrier R) h \ ring_iso S R" + apply (rule ring_iso_memI) + apply (simp add: h_surj inv_into_into) + apply (auto simp add: h_inv_bij) + apply (smt assms f_inv_into_f h_hom h_inj h_surj inv_into_into + ring.ring_simprules(5) ring_hom_closed ring_hom_mult) + apply (smt assms f_inv_into_f h_hom h_inj h_surj inv_into_into + ring.ring_simprules(1) ring_hom_add ring_hom_closed) + by (metis (no_types, hide_lams) assms f_inv_into_f h_hom h_inj + imageI inv_into_into ring.ring_simprules(6) ring_hom_one) +qed + +corollary ring_iso_sym: + assumes "ring R" + shows "R \ S \ S \ R" + using assms ring_iso_set_sym unfolding is_ring_iso_def by auto + +lemma (in ring_hom_ring) the_elem_simp [simp]: + "\x. x \ carrier R \ the_elem (h ` ((a_kernel R S h) +> x)) = h x" +proof - + fix x assume x: "x \ carrier R" + hence "h x \ h ` ((a_kernel R S h) +> x)" + using homeq_imp_rcos by blast + thus "the_elem (h ` ((a_kernel R S h) +> x)) = h x" + by (metis (no_types, lifting) x empty_iff homeq_imp_rcos rcos_imp_homeq the_elem_image_unique) +qed + +lemma (in ring_hom_ring) the_elem_inj: + "\X Y. \ X \ carrier (R Quot (a_kernel R S h)); Y \ carrier (R Quot (a_kernel R S h)) \ \ + the_elem (h ` X) = the_elem (h ` Y) \ X = Y" +proof - + fix X Y + assume "X \ carrier (R Quot (a_kernel R S h))" + and "Y \ carrier (R Quot (a_kernel R S h))" + and Eq: "the_elem (h ` X) = the_elem (h ` Y)" + then obtain x y where x: "x \ carrier R" "X = (a_kernel R S h) +> x" + and y: "y \ carrier R" "Y = (a_kernel R S h) +> y" + unfolding FactRing_def A_RCOSETS_def' by auto + hence "h x = h y" using Eq by simp + hence "x \ y \ (a_kernel R S h)" + by (simp add: a_minus_def abelian_subgroup.a_rcos_module_imp + abelian_subgroup_a_kernel homeq_imp_rcos x(1) y(1)) + thus "X = Y" + by (metis R.a_coset_add_inv1 R.minus_eq abelian_subgroup.a_rcos_const + abelian_subgroup_a_kernel additive_subgroup.a_subset additive_subgroup_a_kernel x y) +qed + +lemma (in ring_hom_ring) quot_mem: + "\X. X \ carrier (R Quot (a_kernel R S h)) \ \x \ carrier R. X = (a_kernel R S h) +> x" +proof - + fix X assume "X \ carrier (R Quot (a_kernel R S h))" + thus "\x \ carrier R. X = (a_kernel R S h) +> x" + unfolding FactRing_def RCOSETS_def A_RCOSETS_def by (simp add: a_r_coset_def) +qed + +lemma (in ring_hom_ring) the_elem_wf: + "\X. X \ carrier (R Quot (a_kernel R S h)) \ \y \ carrier S. (h ` X) = { y }" +proof - + fix X assume "X \ carrier (R Quot (a_kernel R S h))" + then obtain x where x: "x \ carrier R" and X: "X = (a_kernel R S h) +> x" + using quot_mem by blast + hence "\x'. x' \ X \ h x' = h x" + proof - + fix x' assume "x' \ X" hence "x' \ (a_kernel R S h) +> x" using X by simp + then obtain k where k: "k \ a_kernel R S h" "x' = k \ x" + by (metis R.add.inv_closed R.add.m_assoc R.l_neg R.r_zero + abelian_subgroup.a_elemrcos_carrier + abelian_subgroup.a_rcos_module_imp abelian_subgroup_a_kernel x) + hence "h x' = h k \\<^bsub>S\<^esub> h x" + by (meson additive_subgroup.a_Hcarr additive_subgroup_a_kernel hom_add x) + also have " ... = h x" + using k by (auto simp add: x) + finally show "h x' = h x" . + qed + moreover have "h x \ h ` X" + by (simp add: X homeq_imp_rcos x) + ultimately have "(h ` X) = { h x }" + by blast + thus "\y \ carrier S. (h ` X) = { y }" using x by simp +qed + +corollary (in ring_hom_ring) the_elem_wf': + "\X. X \ carrier (R Quot (a_kernel R S h)) \ \r \ carrier R. (h ` X) = { h r }" + using the_elem_wf by (metis quot_mem the_elem_eq the_elem_simp) + +lemma (in ring_hom_ring) the_elem_hom: + "(\X. the_elem (h ` X)) \ ring_hom (R Quot (a_kernel R S h)) S" +proof (rule ring_hom_memI) + show "\x. x \ carrier (R Quot a_kernel R S h) \ the_elem (h ` x) \ carrier S" + using the_elem_wf by fastforce + + show "the_elem (h ` \\<^bsub>R Quot a_kernel R S h\<^esub>) = \\<^bsub>S\<^esub>" + unfolding FactRing_def using the_elem_simp[of "\\<^bsub>R\<^esub>"] by simp + + fix X Y + assume "X \ carrier (R Quot a_kernel R S h)" + and "Y \ carrier (R Quot a_kernel R S h)" + then obtain x y where x: "x \ carrier R" "X = (a_kernel R S h) +> x" + and y: "y \ carrier R" "Y = (a_kernel R S h) +> y" + using quot_mem by blast + + have "X \\<^bsub>R Quot a_kernel R S h\<^esub> Y = (a_kernel R S h) +> (x \ y)" + by (simp add: FactRing_def ideal.rcoset_mult_add kernel_is_ideal x y) + thus "the_elem (h ` (X \\<^bsub>R Quot a_kernel R S h\<^esub> Y)) = the_elem (h ` X) \\<^bsub>S\<^esub> the_elem (h ` Y)" + by (simp add: x y) + + have "X \\<^bsub>R Quot a_kernel R S h\<^esub> Y = (a_kernel R S h) +> (x \ y)" + using ideal.rcos_ring_hom kernel_is_ideal ring_hom_add x y by fastforce + thus "the_elem (h ` (X \\<^bsub>R Quot a_kernel R S h\<^esub> Y)) = the_elem (h ` X) \\<^bsub>S\<^esub> the_elem (h ` Y)" + by (simp add: x y) +qed + +lemma (in ring_hom_ring) the_elem_surj: + "(\X. (the_elem (h ` X))) ` carrier (R Quot (a_kernel R S h)) = (h ` (carrier R))" +proof + show "(\X. the_elem (h ` X)) ` carrier (R Quot a_kernel R S h) \ h ` carrier R" + using the_elem_wf' by fastforce +next + show "h ` carrier R \ (\X. the_elem (h ` X)) ` carrier (R Quot a_kernel R S h)" + proof + fix y assume "y \ h ` carrier R" + then obtain x where x: "x \ carrier R" "h x = y" + by (metis image_iff) + hence "the_elem (h ` ((a_kernel R S h) +> x)) = y" by simp + moreover have "(a_kernel R S h) +> x \ carrier (R Quot (a_kernel R S h))" + unfolding FactRing_def RCOSETS_def A_RCOSETS_def by (auto simp add: x a_r_coset_def) + ultimately show "y \ (\X. (the_elem (h ` X))) ` carrier (R Quot (a_kernel R S h))" by blast + qed +qed + +proposition (in ring_hom_ring) FactRing_iso_set_aux: + "(\X. the_elem (h ` X)) \ ring_iso (R Quot (a_kernel R S h)) (S \ carrier := h ` (carrier R) \)" +proof - + have "bij_betw (\X. the_elem (h ` X)) (carrier (R Quot a_kernel R S h)) (h ` (carrier R))" + unfolding bij_betw_def inj_on_def using the_elem_surj the_elem_inj by simp + + moreover + have "(\X. the_elem (h ` X)): carrier (R Quot (a_kernel R S h)) \ h ` (carrier R)" + using the_elem_wf' by fastforce + hence "(\X. the_elem (h ` X)) \ ring_hom (R Quot (a_kernel R S h)) (S \ carrier := h ` (carrier R) \)" + using the_elem_hom the_elem_wf' unfolding ring_hom_def by simp + + ultimately show ?thesis unfolding ring_iso_def using the_elem_hom by simp +qed + +theorem (in ring_hom_ring) FactRing_iso_set: + assumes "h ` carrier R = carrier S" + shows "(\X. the_elem (h ` X)) \ ring_iso (R Quot (a_kernel R S h)) S" + using FactRing_iso_set_aux assms by auto + +corollary (in ring_hom_ring) FactRing_iso: + assumes "h ` carrier R = carrier S" + shows "R Quot (a_kernel R S h) \ S" + using FactRing_iso_set assms is_ring_iso_def by auto + +lemma (in ring_hom_ring) img_is_ring: "ring (S \ carrier := h ` (carrier R) \)" +proof - + let ?the_elem = "\X. the_elem (h ` X)" + have FactRing_is_ring: "ring (R Quot (a_kernel R S h))" + by (simp add: ideal.quotient_is_ring kernel_is_ideal) + have "ring ((S \ carrier := ?the_elem ` (carrier (R Quot (a_kernel R S h))) \) + \ one := ?the_elem \\<^bsub>(R Quot (a_kernel R S h))\<^esub>, + zero := ?the_elem \\<^bsub>(R Quot (a_kernel R S h))\<^esub> \)" + using ring.ring_iso_imp_img_ring[OF FactRing_is_ring, of ?the_elem + "S \ carrier := ?the_elem ` (carrier (R Quot (a_kernel R S h))) \"] + FactRing_iso_set_aux the_elem_surj by auto + + moreover + have "\ \ (a_kernel R S h)" + using a_kernel_def'[of R S h] by auto + hence "\ \ (a_kernel R S h) +> \" + using a_r_coset_def'[of R "a_kernel R S h" \] by force + hence "\\<^bsub>S\<^esub> \ (h ` ((a_kernel R S h) +> \))" + using hom_one by force + hence "?the_elem \\<^bsub>(R Quot (a_kernel R S h))\<^esub> = \\<^bsub>S\<^esub>" + using the_elem_wf[of "(a_kernel R S h) +> \"] by (simp add: FactRing_def) + + moreover + have "\\<^bsub>S\<^esub> \ (h ` (a_kernel R S h))" + using a_kernel_def'[of R S h] hom_zero by force + hence "\\<^bsub>S\<^esub> \ (h ` \\<^bsub>(R Quot (a_kernel R S h))\<^esub>)" + by (simp add: FactRing_def) + hence "?the_elem \\<^bsub>(R Quot (a_kernel R S h))\<^esub> = \\<^bsub>S\<^esub>" + using the_elem_wf[OF ring.ring_simprules(2)[OF FactRing_is_ring]] + by (metis singletonD the_elem_eq) + + ultimately + have "ring ((S \ carrier := h ` (carrier R) \) \ one := \\<^bsub>S\<^esub>, zero := \\<^bsub>S\<^esub> \)" + using the_elem_surj by simp + thus ?thesis + by auto +qed + +lemma (in ring_hom_ring) img_is_cring: + assumes "cring S" + shows "cring (S \ carrier := h ` (carrier R) \)" +proof - + interpret ring "S \ carrier := h ` (carrier R) \" + using img_is_ring . + show ?thesis + apply unfold_locales + using assms unfolding cring_def comm_monoid_def comm_monoid_axioms_def by auto +qed + +lemma (in ring_hom_ring) img_is_domain: + assumes "domain S" + shows "domain (S \ carrier := h ` (carrier R) \)" +proof - + interpret cring "S \ carrier := h ` (carrier R) \" + using img_is_cring assms unfolding domain_def by simp + show ?thesis + apply unfold_locales + using assms unfolding domain_def domain_axioms_def apply auto + using hom_closed by blast +qed + +proposition (in ring_hom_ring) primeideal_vimage: + assumes "cring R" + shows "primeideal P S \ primeideal { r \ carrier R. h r \ P } R" +proof - + assume A: "primeideal P S" + hence is_ideal: "ideal P S" unfolding primeideal_def by simp + have "ring_hom_ring R (S Quot P) (((+>\<^bsub>S\<^esub>) P) \ h)" (is "ring_hom_ring ?A ?B ?h") + using ring_hom_trans[OF homh, of "(+>\<^bsub>S\<^esub>) P" "S Quot P"] + ideal.rcos_ring_hom_ring[OF is_ideal] assms + unfolding ring_hom_ring_def ring_hom_ring_axioms_def cring_def by simp + then interpret hom: ring_hom_ring R "S Quot P" "((+>\<^bsub>S\<^esub>) P) \ h" by simp + + have "inj_on (\X. the_elem (?h ` X)) (carrier (R Quot (a_kernel R (S Quot P) ?h)))" + using hom.the_elem_inj unfolding inj_on_def by simp + moreover + have "ideal (a_kernel R (S Quot P) ?h) R" + using hom.kernel_is_ideal by auto + have hom': "ring_hom_ring (R Quot (a_kernel R (S Quot P) ?h)) (S Quot P) (\X. the_elem (?h ` X))" + using hom.the_elem_hom hom.kernel_is_ideal + by (meson hom.ring_hom_ring_axioms ideal.rcos_ring_hom_ring ring_hom_ring_axioms_def ring_hom_ring_def) + + ultimately + have "primeideal (a_kernel R (S Quot P) ?h) R" + using ring_hom_ring.inj_on_domain[OF hom'] primeideal.quotient_is_domain[OF A] + cring.quot_domain_imp_primeideal[OF assms hom.kernel_is_ideal] by simp + + moreover have "a_kernel R (S Quot P) ?h = { r \ carrier R. h r \ P }" + proof + show "a_kernel R (S Quot P) ?h \ { r \ carrier R. h r \ P }" + proof + fix r assume "r \ a_kernel R (S Quot P) ?h" + hence r: "r \ carrier R" "P +>\<^bsub>S\<^esub> (h r) = P" + unfolding a_kernel_def kernel_def FactRing_def by auto + hence "h r \ P" + using S.a_rcosI R.l_zero S.l_zero additive_subgroup.a_subset[OF ideal.axioms(1)[OF is_ideal]] + additive_subgroup.zero_closed[OF ideal.axioms(1)[OF is_ideal]] hom_closed by metis + thus "r \ { r \ carrier R. h r \ P }" using r by simp + qed + next + show "{ r \ carrier R. h r \ P } \ a_kernel R (S Quot P) ?h" + proof + fix r assume "r \ { r \ carrier R. h r \ P }" + hence r: "r \ carrier R" "h r \ P" by simp_all + hence "?h r = P" + by (simp add: S.a_coset_join2 additive_subgroup.a_subgroup ideal.axioms(1) is_ideal) + thus "r \ a_kernel R (S Quot P) ?h" + unfolding a_kernel_def kernel_def FactRing_def using r(1) by auto + qed + qed + ultimately show "primeideal { r \ carrier R. h r \ P } R" by simp +qed + end diff -r 516e81f75957 -r b680e74eb6f2 src/HOL/Algebra/Ring.thy --- a/src/HOL/Algebra/Ring.thy Fri Jun 29 23:04:36 2018 +0200 +++ b/src/HOL/Algebra/Ring.thy Sat Jun 30 15:44:04 2018 +0100 @@ -333,11 +333,6 @@ and "\x y z. \ x \ carrier R; y \ carrier R; z \ carrier R \ \ (x \ y) \ z = x \ z \ y \ z" using assms cring_def apply auto by (simp add: assms cring.axioms(1) ringE(3)) -(* -lemma (in cring) is_comm_monoid: - "comm_monoid R" - by (auto intro!: comm_monoidI m_assoc m_comm) -*) lemma (in cring) is_cring: "cring R" by (rule cring_axioms) @@ -652,6 +647,15 @@ text \Field would not need to be derived from domain, the properties for domain follow from the assumptions of field\ +lemma fieldE : + fixes R (structure) + assumes "field R" + shows "cring R" + and one_not_zero : "\ \ \" + and integral: "\a b. \ a \ b = \; a \ carrier R; b \ carrier R \ \ a = \ \ b = \" + and field_Units: "Units R = carrier R - {\}" + using assms unfolding field_def field_axioms_def domain_def domain_axioms_def by simp_all + lemma (in cring) cring_fieldI: assumes field_Units: "Units R = carrier R - {\}" shows "field R" diff -r 516e81f75957 -r b680e74eb6f2 src/HOL/Algebra/RingHom.thy --- a/src/HOL/Algebra/RingHom.thy Fri Jun 29 23:04:36 2018 +0200 +++ b/src/HOL/Algebra/RingHom.thy Sat Jun 30 15:44:04 2018 +0100 @@ -203,4 +203,37 @@ show "x \ a_kernel R S h +> a" by (rule homeq_imp_rcos) qed +(*contributed by Paulo Emílio de Vilhena*) +lemma (in ring_hom_ring) inj_on_domain: + assumes "inj_on h (carrier R)" + shows "domain S \ domain R" +proof - + assume A: "domain S" show "domain R" + proof + have "h \ = \\<^bsub>S\<^esub> \ h \ = \\<^bsub>S\<^esub>" by simp + hence "h \ \ h \" + using domain.one_not_zero[OF A] by simp + thus "\ \ \" + using assms unfolding inj_on_def by fastforce + next + fix a b + assume a: "a \ carrier R" + and b: "b \ carrier R" + have "h (a \ b) = (h a) \\<^bsub>S\<^esub> (h b)" by (simp add: a b) + also have " ... = (h b) \\<^bsub>S\<^esub> (h a)" using a b A cringE(1)[of S] + by (simp add: cring.cring_simprules(14) domain_def) + also have " ... = h (b \ a)" by (simp add: a b) + finally have "h (a \ b) = h (b \ a)" . + thus "a \ b = b \ a" + using assms a b unfolding inj_on_def by simp + + assume ab: "a \ b = \" + hence "h (a \ b) = \\<^bsub>S\<^esub>" by simp + hence "(h a) \\<^bsub>S\<^esub> (h b) = \\<^bsub>S\<^esub>" using a b by simp + hence "h a = \\<^bsub>S\<^esub> \ h b = \\<^bsub>S\<^esub>" using a b domain.integral[OF A] by simp + thus "a = \ \ b = \" + using a b assms unfolding inj_on_def by force + qed +qed + end