# HG changeset patch # User paulson # Date 1530811644 -3600 # Node ID d32d40d03e0a012d8f186eea33826d52915815bb # Parent 9258f16d68b411c7acd03681c7c0827d9eaef2a3# Parent 6366129107adeeeb9b771ecf6fd0f8d1ec7c2ef3 merged diff -r 9258f16d68b4 -r d32d40d03e0a src/HOL/Algebra/Module.thy --- a/src/HOL/Algebra/Module.thy Wed Jul 04 22:44:24 2018 +0200 +++ b/src/HOL/Algebra/Module.thy Thu Jul 05 18:27:24 2018 +0100 @@ -167,4 +167,85 @@ by (simp add: Pi_def smult_r_distr) qed + + +subsection \Submodules\ + +locale submodule = subgroup H "add_monoid M" for H and R :: "('a, 'b) ring_scheme" and M (structure) ++ assumes smult_closed [simp, intro]: + "\a \ carrier R; x \ H\ \ a \\<^bsub>M\<^esub> x \ H" + + +lemma (in module) submoduleI : + assumes subset: "H \ carrier M" + and zero: "\\<^bsub>M\<^esub> \ H" + and a_inv: "!!a. a \ H \ \\<^bsub>M\<^esub> a \ H" + and add : "\ a b. \a \ H ; b \ H\ \ a \\<^bsub>M\<^esub> b \ H" + and smult_closed : "\ a x. \a \ carrier R; x \ H\ \ a \\<^bsub>M\<^esub> x \ H" + shows "submodule H R M" + apply (intro submodule.intro subgroup.intro) + using assms unfolding submodule_axioms_def + by (simp_all add : a_inv_def) + + +lemma (in module) submoduleE : + assumes "submodule H R M" + shows "H \ carrier M" + and "H \ {}" + and "\a. a \ H \ \\<^bsub>M\<^esub> a \ H" + and "\a b. \a \ carrier R; b \ H\ \ a \\<^bsub>M\<^esub> b \ H" + and "\ a b. \a \ H ; b \ H\ \ a \\<^bsub>M\<^esub> b \ H" + and "\ x. x \ H \ (a_inv M x) \ H" + using group.subgroupE[of "add_monoid M" H, OF _ submodule.axioms(1)[OF assms]] a_comm_group + submodule.smult_closed[OF assms] + unfolding comm_group_def a_inv_def + by auto + + +lemma (in module) carrier_is_submodule : +"submodule (carrier M) R M" + apply (intro submoduleI) + using a_comm_group group.inv_closed unfolding comm_group_def a_inv_def group_def monoid_def + by auto + +lemma (in submodule) submodule_is_module : + assumes "module R M" + shows "module R (M\carrier := H\)" +proof (auto intro! : moduleI abelian_group.intro) + show "cring (R)" using assms unfolding module_def by auto + show "abelian_monoid (M\carrier := H\)" + using comm_monoid.submonoid_is_comm_monoid[OF _ subgroup_is_submonoid] assms + unfolding abelian_monoid_def module_def abelian_group_def + by auto + thus "abelian_group_axioms (M\carrier := H\)" + using subgroup_is_group assms + unfolding abelian_group_axioms_def comm_group_def abelian_monoid_def module_def abelian_group_def + by auto + show "\z. z \ H \ \\<^bsub>R\<^esub> \ z = z" + using subgroup_imp_subset[OF subgroup_axioms] module.smult_one[OF assms] + by auto + fix a b x y assume a : "a \ carrier R" and b : "b \ carrier R" and x : "x \ H" and y : "y \ H" + show "(a \\<^bsub>R\<^esub> b) \ x = a \ x \ b \ x" + using a b x module.smult_l_distr[OF assms] subgroup_imp_subset[OF subgroup_axioms] + by auto + show "a \ (x \ y) = a \ x \ a \ y" + using a x y module.smult_r_distr[OF assms] subgroup_imp_subset[OF subgroup_axioms] + by auto + show "a \\<^bsub>R\<^esub> b \ x = a \ (b \ x)" + using a b x module.smult_assoc1[OF assms] subgroup_imp_subset[OF subgroup_axioms] + by auto +qed + + +lemma (in module) module_incl_imp_submodule : + assumes "H \ carrier M" + and "module R (M\carrier := H\)" + shows "submodule H R M" + apply (intro submodule.intro) + using add.group_incl_imp_subgroup[OF assms(1)] assms module.axioms(2)[OF assms(2)] + module.smult_closed[OF assms(2)] + unfolding abelian_group_def abelian_group_axioms_def comm_group_def submodule_axioms_def + by simp_all + + end