Theory Generated_Rings
theory Generated_Rings
imports Subrings
begin
section‹Generated Rings›
inductive_set
generate_ring :: "('a, 'b) ring_scheme ⇒ 'a set ⇒ 'a set"
for R and H where
one: "𝟭⇘R⇙ ∈ generate_ring R H"
| incl: "h ∈ H ⟹ h ∈ generate_ring R H"
| a_inv: "h ∈ generate_ring R H ⟹ ⊖⇘R⇙ h ∈ generate_ring R H"
| eng_add : "⟦ h1 ∈ generate_ring R H; h2 ∈ generate_ring R H ⟧ ⟹ h1 ⊕⇘R⇙ h2 ∈ generate_ring R H"
| eng_mult: "⟦ h1 ∈ generate_ring R H; h2 ∈ generate_ring R H ⟧ ⟹ h1 ⊗⇘R⇙ h2 ∈ generate_ring R H"
subsection‹Basic Properties of Generated Rings - First Part›
lemma (in ring) generate_ring_in_carrier:
assumes "H ⊆ carrier R"
shows "h ∈ generate_ring R H ⟹ h ∈ carrier R"
apply (induction rule: generate_ring.induct) using assms
by blast+
lemma (in ring) generate_ring_incl:
assumes "H ⊆ carrier R"
shows "generate_ring R H ⊆ carrier R"
using generate_ring_in_carrier[OF assms] by auto
lemma (in ring) zero_in_generate: "𝟬⇘R⇙ ∈ generate_ring R H"
using one a_inv by (metis generate_ring.eng_add one_closed r_neg)
lemma (in ring) generate_ring_is_subring:
assumes "H ⊆ carrier R"
shows "subring (generate_ring R H) R"
by (auto intro!: subringI[of "generate_ring R H"]
simp add: generate_ring_in_carrier[OF assms] one a_inv eng_mult eng_add)
lemma (in ring) generate_ring_is_ring:
assumes "H ⊆ carrier R"
shows "ring (R ⦇ carrier := generate_ring R H ⦈)"
using subring_iff[OF generate_ring_incl[OF assms]] generate_ring_is_subring[OF assms] by simp
lemma (in ring) generate_ring_min_subring1:
assumes "H ⊆ carrier R" and "subring E R" "H ⊆ E"
shows "generate_ring R H ⊆ E"
proof
fix h assume h: "h ∈ generate_ring R H"
show "h ∈ E"
using h and assms(3)
by (induct rule: generate_ring.induct)
(auto simp add: subringE(3,5-7)[OF assms(2)])
qed
lemma (in ring) generate_ringI:
assumes "H ⊆ carrier R"
and "subring E R" "H ⊆ E"
and "⋀K. ⟦ subring K R; H ⊆ K ⟧ ⟹ E ⊆ K"
shows "E = generate_ring R H"
proof
show "E ⊆ generate_ring R H"
using assms generate_ring_is_subring generate_ring.incl by (metis subset_iff)
show "generate_ring R H ⊆ E"
using generate_ring_min_subring1[OF assms(1-3)] by simp
qed
lemma (in ring) generate_ringE:
assumes "H ⊆ carrier R" and "E = generate_ring R H"
shows "subring E R" and "H ⊆ E" and "⋀K. ⟦ subring K R; H ⊆ K ⟧ ⟹ E ⊆ K"
proof -
show "subring E R" using assms generate_ring_is_subring by simp
show "H ⊆ E" using assms(2) by (simp add: generate_ring.incl subsetI)
show "⋀K. subring K R ⟹ H ⊆ K ⟹ E ⊆ K"
using assms generate_ring_min_subring1 by auto
qed
lemma (in ring) generate_ring_min_subring2:
assumes "H ⊆ carrier R"
shows "generate_ring R H = ⋂{K. subring K R ∧ H ⊆ K}"
proof
have "subring (generate_ring R H) R ∧ H ⊆ generate_ring R H"
by (simp add: assms generate_ringE(2) generate_ring_is_subring)
thus "⋂{K. subring K R ∧ H ⊆ K} ⊆ generate_ring R H" by blast
next
have "⋀K. subring K R ∧ H ⊆ K ⟹ generate_ring R H ⊆ K"
by (simp add: assms generate_ring_min_subring1)
thus "generate_ring R H ⊆ ⋂{K. subring K R ∧ H ⊆ K}" by blast
qed
lemma (in ring) mono_generate_ring:
assumes "I ⊆ J" and "J ⊆ carrier R"
shows "generate_ring R I ⊆ generate_ring R J"
proof-
have "I ⊆ generate_ring R J "
using assms generate_ringE(2) by blast
thus "generate_ring R I ⊆ generate_ring R J"
using generate_ring_min_subring1[of I "generate_ring R J"] assms generate_ring_is_subring[OF assms(2)]
by blast
qed
lemma (in ring) subring_gen_incl :
assumes "subring H R"
and "subring K R"
and "I ⊆ H"
and "I ⊆ K"
shows "generate_ring (R⦇carrier := K⦈) I ⊆ generate_ring (R⦇carrier := H⦈) I"
proof
{fix J assume J_def : "subring J R" "I ⊆ J"
have "generate_ring (R ⦇ carrier := J ⦈) I ⊆ J"
using ring.mono_generate_ring[of "(R⦇carrier := J⦈)" I J ] subring_is_ring[OF J_def(1)]
ring.generate_ring_in_carrier[of "R⦇carrier := J⦈"] ring_axioms J_def(2)
by auto}
note incl_HK = this
{fix x have "x ∈ generate_ring (R⦇carrier := K⦈) I ⟹ x ∈ generate_ring (R⦇carrier := H⦈) I"
proof (induction rule : generate_ring.induct)
case one
have "𝟭⇘R⦇carrier := H⦈⇙ ⊗ 𝟭⇘R⦇carrier := K⦈⇙ = 𝟭⇘R⦇carrier := H⦈⇙" by simp
moreover have "𝟭⇘R⦇carrier := H⦈⇙ ⊗ 𝟭⇘R⦇carrier := K⦈⇙ = 𝟭⇘R⦇carrier := K⦈⇙" by simp
ultimately show ?case using assms generate_ring.one by metis
next
case (incl h) thus ?case using generate_ring.incl by force
next
case (a_inv h)
note hyp = this
have "a_inv (R⦇carrier := K⦈) h = a_inv R h"
using assms group.m_inv_consistent[of "add_monoid R" K] a_comm_group incl_HK[of K] hyp
unfolding subring_def comm_group_def a_inv_def by auto
moreover have "a_inv (R⦇carrier := H⦈) h = a_inv R h"
using assms group.m_inv_consistent[of "add_monoid R" H] a_comm_group incl_HK[of H] hyp
unfolding subring_def comm_group_def a_inv_def by auto
ultimately show ?case using generate_ring.a_inv a_inv.IH by fastforce
next
case (eng_add h1 h2)
thus ?case using incl_HK assms generate_ring.eng_add by force
next
case (eng_mult h1 h2)
thus ?case using generate_ring.eng_mult by force
qed}
thus "⋀x. x ∈ generate_ring (R⦇carrier := K⦈) I ⟹ x ∈ generate_ring (R⦇carrier := H⦈) I"
by auto
qed
lemma (in ring) subring_gen_equality:
assumes "subring H R" "K ⊆ H"
shows "generate_ring R K = generate_ring (R ⦇ carrier := H ⦈) K"
using subring_gen_incl[OF assms(1)carrier_is_subring assms(2)] assms subringE(1)
subring_gen_incl[OF carrier_is_subring assms(1) _ assms(2)]
by force
end