Theory Module_Exact_Sequence
section βΉExact sequences of modulesβΊ
theory Module_Exact_Sequence
imports Module_Complements
begin
locale composable_module_homomorphisms =
first: module_homomorphism R "(+)" "(β
)" π¬ π
M "(β)" "π¬β©M" "(β)" M' "(ββ©2)" "π¬β©2" "(ββ©2)" Ξ· +
second: module_homomorphism R "(+)" "(β
)" π¬ π
M' "(ββ©2)" "π¬β©2" "(ββ©2)" M'' "(ββ©3)" "π¬β©3" "(ββ©3)" ΞΈ
for R and addition (infixl βΉ+βΊ 65) and multiplication (infixl βΉβ
βΊ 70)
and zero (βΉπ¬βΊ) and unit (βΉπβΊ)
and M and madd (infixl βΉββΊ 65) and mzero (βΉπ¬β©MβΊ)
and scale (infixr βΉββΊ 75)
and M' and madd' (infixl βΉββ©2βΊ 65) and mzero' (βΉπ¬β©2βΊ)
and scale' (infixr βΉββ©2βΊ 75)
and M'' and madd'' (infixl βΉββ©3βΊ 65) and mzero'' (βΉπ¬β©3βΊ)
and scale'' (infixr βΉββ©3βΊ 75)
and Ξ· and ΞΈ
begin
definition exact :: bool
where "exact β· Ξ· ` M = second.Ker"
definition short_exact :: bool
where "short_exact β· inj_on Ξ· M β§ exact β§ ΞΈ ` M' = M''"
definition right_split :: bool
where "right_split β·
(βΟ. module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο β§
(βxβM''. ΞΈ (Ο x) = x))"
definition left_split :: bool
where "left_split β·
(βΟ. module_homomorphism R (+) (β
) π¬ π
M' (ββ©2) π¬β©2 (ββ©2) M (β) π¬β©M (β) Ο β§
(βxβM. Ο (Ξ· x) = x))"
lemma exact_iff: "exact β· Ξ· ` M = second.Ker"
by (rule exact_def)
lemma short_exact_iff:
"short_exact β· inj_on Ξ· M β§ Ξ· ` M = second.Ker β§ ΞΈ ` M' = M''"
by (simp add: short_exact_def exact_def)
lemma exact_imp_composition_zero:
assumes ex: exact and x: "x β M"
shows "ΞΈ (Ξ· x) = π¬β©3"
proof -
have "Ξ· x β Ξ· ` M" using x by (rule imageI)
then have "Ξ· x β second.Ker" using ex by (simp add: exact_def)
then show ?thesis by (rule second.Ker_image)
qed
lemma right_split_imp_surjective:
assumes split: right_split
shows "ΞΈ ` M' = M''"
proof
show "ΞΈ ` M' β M''" using second.hom_closed by blast
show "M'' β ΞΈ ` M'"
proof
fix x assume x: "x β M''"
obtain Ο where hom: "module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο"
and sec: "βxβM''. ΞΈ (Ο x) = x"
using split unfolding right_split_def by blast
interpret S: module_homomorphism R "(+)" "(β
)" π¬ π
M'' "(ββ©3)" "π¬β©3" "(ββ©3)" M' "(ββ©2)" "π¬β©2" "(ββ©2)" Ο
by (rule hom)
have sx: "Ο x β M'" by (rule S.hom_closed[OF x])
have eq: "ΞΈ (Ο x) = x" using sec x by blast
have "ΞΈ (Ο x) β ΞΈ ` M'" by (rule imageI[OF sx])
then show "x β ΞΈ ` M'" using eq by simp
qed
qed
text βΉThe image of an explicit right section is complementary to the
kernel of the split map. The composite βΉΟ β ΞΈβΊ is the
corresponding idempotent projection on the middle module.βΊ
theorem right_section_image_kernel_complementary:
assumes section_hom: "module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο"
and sec_eq: "βx. x β M'' βΉ ΞΈ (Ο x) = x"
shows "Ο ` M'' β© second.Ker = {π¬β©2}"
and "Module.submodule_sum (ββ©2) (Ο ` M'') second.Ker = M'"
proof -
interpret S: module_homomorphism R "(+)" "(β
)" π¬ π
M'' "(ββ©3)" "π¬β©3" "(ββ©3)"
M' "(ββ©2)" "π¬β©2" "(ββ©2)" Ο
by (rule section_hom)
define p where "p = compose M' Ο ΞΈ"
have p_hom: "module_homomorphism R (+) (β
) π¬ π
M' (ββ©2) π¬β©2 (ββ©2) M' (ββ©2) π¬β©2 (ββ©2) p"
unfolding p_def by (rule second.compose_module_homomorphism[OF section_hom])
interpret P: idempotent_module_endomorphism R "(+)" "(β
)" π¬ π
M' "(ββ©2)" "π¬β©2" "(ββ©2)" p
proof (rule idempotent_module_endomorphism.intro[OF p_hom])
show "idempotent_module_endomorphism_axioms M' p"
proof
fix x assume x: "x β M'"
have tx: "ΞΈ x β M''" by (rule second.hom_closed[OF x])
have stx: "Ο (ΞΈ x) β M'" by (rule S.hom_closed[OF tx])
show "p (p x) = p x"
unfolding p_def compose_def
using x tx stx sec_eq[OF tx] by simp
qed
qed
have image_p: "p ` M' = Ο ` M''"
proof (rule set_eqI, rule iffI)
fix y assume y: "y β p ` M'"
then obtain x where x: "x β M'" "y = p x" by blast
have tx: "ΞΈ x β M''" by (rule second.hom_closed[OF x(1)])
have value_eq: "y = Ο (ΞΈ x)" using x unfolding p_def compose_def by simp
have "Ο (ΞΈ x) β Ο ` M''" by (rule imageI[OF tx])
then show "y β Ο ` M''" using value_eq by simp
next
fix y assume y: "y β Ο ` M''"
then obtain z where z: "z β M''" "y = Ο z" by blast
have sz: "Ο z β M'" by (rule S.hom_closed[OF z(1)])
have value_eq: "p (Ο z) = Ο z"
unfolding p_def compose_def using z sz sec_eq[OF z(1)] by simp
have "p (Ο z) β p ` M'" by (rule imageI[OF sz])
then show "y β p ` M'" using z value_eq by simp
qed
have kernel_p: "P.Ker = second.Ker"
proof (rule set_eqI, rule iffI)
fix x assume x: "x β P.Ker"
have xM: "x β M'" by (rule P.Ker_mem[OF x])
have tx: "ΞΈ x β M''" by (rule second.hom_closed[OF xM])
have theta_p: "ΞΈ (p x) = ΞΈ x"
unfolding p_def compose_def using xM tx sec_eq[OF tx] by simp
have "ΞΈ (p x) = π¬β©3"
using P.Ker_image[OF x] second.hom_zero by simp
then have "ΞΈ x = π¬β©3" using theta_p by simp
then show "x β second.Ker" by (rule second.Ker_memI[OF _ xM])
next
fix x assume x: "x β second.Ker"
have xM: "x β M'" by (rule second.Ker_mem[OF x])
have "p x = π¬β©2"
unfolding p_def compose_def
using xM second.Ker_image[OF x] S.hom_zero by simp
then show "x β P.Ker" by (rule P.Ker_memI[OF _ xM])
qed
show "Ο ` M'' β© second.Ker = {π¬β©2}"
using P.image_kernel_complementary(1) image_p kernel_p by simp
show "Module.submodule_sum (ββ©2) (Ο ` M'') second.Ker = M'"
using P.image_kernel_complementary(2) image_p kernel_p by simp
qed
theorem right_split_obtains_image_kernel_complement:
assumes split: right_split
obtains Ο where
"module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο"
"βx. x β M'' βΉ ΞΈ (Ο x) = x"
"Ο ` M'' β© second.Ker = {π¬β©2}"
"Module.submodule_sum (ββ©2) (Ο ` M'') second.Ker = M'"
proof -
obtain Ο where hom: "module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο"
and sec: "βxβM''. ΞΈ (Ο x) = x"
using split unfolding right_split_def by blast
have sec_eq: "βx. x β M'' βΉ ΞΈ (Ο x) = x" using sec by blast
have complementary:
"Ο ` M'' β© second.Ker = {π¬β©2}"
"Module.submodule_sum (ββ©2) (Ο ` M'') second.Ker = M'"
proof -
show "Ο ` M'' β© second.Ker = {π¬β©2}"
by (rule right_section_image_kernel_complementary(1)[OF hom sec_eq])
show "Module.submodule_sum (ββ©2) (Ο ` M'') second.Ker = M'"
by (rule right_section_image_kernel_complementary(2)[OF hom sec_eq])
qed
show thesis by (rule that[OF hom sec_eq complementary])
qed
theorem short_exact_right_split_obtains_decomposition:
assumes short: short_exact and split: right_split
obtains Ο where
"module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο"
"βx. x β M'' βΉ ΞΈ (Ο x) = x"
"Ο ` M'' β© Ξ· ` M = {π¬β©2}"
"Module.submodule_sum (ββ©2) (Ο ` M'') (Ξ· ` M) = M'"
proof -
obtain Ο where hom: "module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο"
and sec_eq: "βx. x β M'' βΉ ΞΈ (Ο x) = x"
and disjoint: "Ο ` M'' β© second.Ker = {π¬β©2}"
and full: "Module.submodule_sum (ββ©2) (Ο ` M'') second.Ker = M'"
using right_split_obtains_image_kernel_complement[OF split] by blast
have exact: "Ξ· ` M = second.Ker" using short by (simp add: short_exact_iff)
show thesis
by (rule that[OF hom sec_eq]) (use disjoint full exact in simp_all)
qed
text βΉA right section yields a retraction of the injection. The projection onto the image of
@{term Ξ·} along the section image is followed by the inverse of @{term Ξ·} onto its image.βΊ
theorem short_exact_right_split_imp_left_split:
assumes short: short_exact and split: right_split
shows left_split
proof -
obtain Ο where section_hom: "module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3) M' (ββ©2) π¬β©2 (ββ©2) Ο"
and sec_eq: "βx. x β M'' βΉ ΞΈ (Ο x) = x"
and disjoint: "Ο ` M'' β© second.Ker = {π¬β©2}"
and full: "Module.submodule_sum (ββ©2) (Ο ` M'') second.Ker = M'"
using right_split_obtains_image_kernel_complement[OF split] by blast
have exact: "Ξ· ` M = second.Ker" using short by (simp add: short_exact_iff)
have eta_sub: "first.target.submodule (Ξ· ` M)" using first.image_submodule .
interpret S: module_homomorphism R "(+)" "(β
)" π¬ π
M'' "(ββ©3)" "π¬β©3" "(ββ©3)"
M' "(ββ©2)" "π¬β©2" "(ββ©2)" Ο
by (rule section_hom)
have sigma_sub: "first.target.submodule (Ο ` M'')" using S.image_submodule .
have eta_sub': "Module.submodule R (ββ©2) π¬β©2 M' (ββ©2) (Ξ· ` M)"
using eta_sub .
have sigma_sub': "Module.submodule R (ββ©2) π¬β©2 M' (ββ©2) (Ο ` M'')"
using sigma_sub .
have disjoint': "Ξ· ` M β© Ο ` M'' = {π¬β©2}"
using disjoint exact by (simp add: Int_commute)
have full': "Module.submodule_sum (ββ©2) (Ξ· ` M) (Ο ` M'') = M'"
using full exact first.target.submodule_sum_commute[OF eta_sub sigma_sub] by simp
interpret Kq: submodule_in_module R "(+)" "(β
)" π¬ π
"(ββ©2)" "π¬β©2" M' "(ββ©2)" "(Ο ` M'')"
using sigma_sub' by unfold_locales
interpret Q: module_homomorphism R "(+)" "(β
)" π¬ π
"(Ξ· ` M)" "(ββ©2)" "π¬β©2" "(ββ©2)"
Kq.Qcarrier Kq.qadd "Kq.Qclass π¬β©2" Kq.qscale
"first.target.proj_res (Ξ· ` M) (Ο ` M'')"
by (rule first.target.proj_res_hom[OF eta_sub' sigma_sub'])
have projection_bij:
"bij_betw (first.target.proj_res (Ξ· ` M) (Ο ` M''))
(Ξ· ` M) Kq.Qcarrier"
using first.target.complement_quotient_isomorphism
[OF eta_sub' sigma_sub' disjoint' full'] by blast
have inverse_projection:
"module_homomorphism R (+) (β
) π¬ π
Kq.Qcarrier Kq.qadd (Kq.Qclass π¬β©2) Kq.qscale
(Ξ· ` M) (ββ©2) π¬β©2 (ββ©2)
(restrict (inv_into (Ξ· ` M) (first.target.proj_res (Ξ· ` M) (Ο ` M''))) Kq.Qcarrier)"
by (rule Q.inverse_module_homomorphism[OF projection_bij])
interpret P: module_homomorphism R "(+)" "(β
)" π¬ π
M' "(ββ©2)" "π¬β©2" "(ββ©2)"
"(Ξ· ` M)" "(ββ©2)" "π¬β©2" "(ββ©2)"
"first.target.complement_projection (Ξ· ` M) (Ο ` M'')"
by (rule first.target.complement_projection_hom
[OF eta_sub' sigma_sub' disjoint' full'])
have eta_image_hom:
"module_homomorphism R (+) (β
) π¬ π
M (β) π¬β©M (β)
(Ξ· ` M) (ββ©2) π¬β©2 (ββ©2) Ξ·"
proof (intro module_homomorphism.intro map.intro module_homomorphism_axioms.intro)
show "Module R (+) (β
) π¬ π (β) π¬β©M M (β)"
by (rule first.source.Module_axioms)
show "Module R (+) (β
) π¬ π
(ββ©2) π¬β©2 (Ξ· ` M) (ββ©2)"
by (rule first.image_is_module)
show "Ξ· β M ββ©E (Ξ· ` M)"
using first.hom_closed by (auto simp: PiE_iff extensional_def)
next
fix u v assume uv: "u β M" "v β M"
then show "Ξ· (u β v) = Ξ· u ββ©2 Ξ· v"
by (rule first.hom_add)
next
fix a v assume av: "a β R" "v β M"
then show "Ξ· (a β v) = a ββ©2 Ξ· v"
by (rule first.hom_scale)
qed
interpret I: module_homomorphism R "(+)" "(β
)" π¬ π
M "(β)" "π¬β©M" "(β)"
"(Ξ· ` M)" "(ββ©2)" "π¬β©2" "(ββ©2)" Ξ·
by (rule eta_image_hom)
have inj_eta: "inj_on Ξ· M" using short by (simp add: short_exact_def)
have eta_bij: "bij_betw Ξ· M (Ξ· ` M)"
using inj_eta by (simp add: bij_betw_def)
have J_hom: "module_homomorphism R (+) (β
) π¬ π
(Ξ· ` M) (ββ©2) π¬β©2 (ββ©2)
M (β) π¬β©M (β)
(restrict (inv_into M Ξ·) (Ξ· ` M))"
by (rule I.inverse_module_homomorphism[OF eta_bij])
define Ο where
"Ο = compose M' (restrict (inv_into M Ξ·) (Ξ· ` M))
(first.target.complement_projection (Ξ· ` M) (Ο ` M''))"
have rho_hom:
"module_homomorphism R (+) (β
) π¬ π
M' (ββ©2) π¬β©2 (ββ©2)
M (β) π¬β©M (β) Ο"
unfolding Ο_def
by (rule P.compose_module_homomorphism[OF J_hom])
have retract: "βx. x β M βΉ Ο (Ξ· x) = x"
proof -
fix x assume x: "x β M"
have eta_x: "Ξ· x β Ξ· ` M" by (rule imageI[OF x])
have eta_xM': "Ξ· x β M'" by (rule first.hom_closed[OF x])
have projection: "first.target.complement_projection (Ξ· ` M) (Ο ` M'') (Ξ· x) = Ξ· x"
by (rule first.target.complement_projection_apply_left
[OF eta_sub sigma_sub disjoint' full' eta_x])
have inverse: "restrict (inv_into M Ξ·) (Ξ· ` M) (Ξ· x) = x"
by (rule I.inverse_module_homomorphism_left[OF eta_bij x])
show "Ο (Ξ· x) = x"
unfolding Ο_def compose_def
using projection inverse eta_x eta_xM' by (simp add: restrict_apply')
qed
show ?thesis unfolding left_split_def using rho_hom retract by blast
qed
text βΉA retraction of the injection makes its image a direct summand. Exactness then
identifies the complementary summand with the quotient, so the second map has a
carrier-restricted inverse that supplies a right section.βΊ
theorem short_exact_left_split_imp_right_split:
assumes short: short_exact and split: left_split
shows right_split
proof -
obtain Ο where rho_hom: "module_homomorphism R (+) (β
) π¬ π
M' (ββ©2) π¬β©2 (ββ©2) M (β) π¬β©M (β) Ο"
and retract: "βx. x β M βΉ Ο (Ξ· x) = x"
using split unfolding left_split_def by blast
interpret Rho: module_homomorphism R "(+)" "(β
)" π¬ π
M' "(ββ©2)" "π¬β©2" "(ββ©2)"
M "(β)" "π¬β©M" "(β)" Ο
by (rule rho_hom)
have eta_hom: "module_homomorphism R (+) (β
) π¬ π
M (β) π¬β©M (β)
M' (ββ©2) π¬β©2 (ββ©2) Ξ·"
by unfold_locales
define p where "p = compose M' Ξ· Ο"
have p_hom: "module_homomorphism R (+) (β
) π¬ π
M' (ββ©2) π¬β©2 (ββ©2)
M' (ββ©2) π¬β©2 (ββ©2) p"
unfolding p_def
by (rule Rho.compose_module_homomorphism[OF eta_hom])
interpret P: idempotent_module_endomorphism R "(+)" "(β
)" π¬ π
M' "(ββ©2)" "π¬β©2" "(ββ©2)" p
proof (rule idempotent_module_endomorphism.intro[OF p_hom])
show "idempotent_module_endomorphism_axioms M' p"
proof
fix x assume xM': "x β M'"
have rx: "Ο x β M" by (rule Rho.hom_closed[OF xM'])
have etarx: "Ξ· (Ο x) β M'" by (rule first.hom_closed[OF rx])
show "p (p x) = p x"
unfolding p_def compose_def
using xM' rx etarx retract[OF rx] by simp
qed
qed
have inj_eta: "inj_on Ξ· M" using short by (simp add: short_exact_def)
have image_p: "p ` M' = Ξ· ` M"
proof (rule set_eqI, rule iffI)
fix y assume y: "y β p ` M'"
then obtain x where x: "x β M'" "y = p x" by blast
have rx: "Ο x β M" by (rule Rho.hom_closed[OF x(1)])
have value_eq: "y = Ξ· (Ο x)"
using x unfolding p_def compose_def by simp
then show "y β Ξ· ` M" using rx by blast
next
fix y assume y: "y β Ξ· ` M"
then obtain x where x: "x β M" "y = Ξ· x" by blast
have etax: "Ξ· x β M'" by (rule first.hom_closed[OF x(1)])
have value_eq: "p (Ξ· x) = Ξ· x"
unfolding p_def compose_def using x retract[OF x(1)] by simp
have image_value: "p (Ξ· x) β p ` M'" by (rule imageI[OF etax])
then show "y β p ` M'" using value_eq x(2) by simp
qed
have Pker_sub: "first.target.submodule P.Ker" using P.Ker_submodule .
have eta_sub: "first.target.submodule (Ξ· ` M)" using first.image_submodule .
have disjoint_P: "P.Ker β© (Ξ· ` M) = {π¬β©2}"
using P.image_kernel_complementary(1) image_p by (simp add: Int_commute)
have full_eta_P: "Module.submodule_sum (ββ©2) (Ξ· ` M) P.Ker = M'"
using P.image_kernel_complementary(2) image_p by simp
have full_P_eta: "Module.submodule_sum (ββ©2) P.Ker (Ξ· ` M) = M'"
using full_eta_P first.target.submodule_sum_commute[OF Pker_sub eta_sub] by simp
have exact: "Ξ· ` M = second.Ker" using short by (simp add: short_exact_iff)
have theta_restrict_hom:
"module_homomorphism R (+) (β
) π¬ π
P.Ker (ββ©2) π¬β©2 (ββ©2)
M'' (ββ©3) π¬β©3 (ββ©3)
(restrict ΞΈ P.Ker)"
proof (intro module_homomorphism.intro map.intro module_homomorphism_axioms.intro)
show "Module R (+) (β
) π¬ π
(ββ©2) π¬β©2 P.Ker (ββ©2)"
by (rule first.target.submodule_is_module[OF Pker_sub])
show "Module R (+) (β
) π¬ π
(ββ©3) π¬β©3 M'' (ββ©3)"
by (rule second.target.Module_axioms)
show "restrict ΞΈ P.Ker β P.Ker ββ©E M''"
using first.target.submodule_subset[OF Pker_sub] second.hom_closed
by (auto simp: PiE_iff extensional_def)
next
fix u v assume uv: "u β P.Ker" "v β P.Ker"
have uM': "u β M'" and vM': "v β M'"
using uv first.target.submodule_subset[OF Pker_sub] by auto
have uvP: "u ββ©2 v β P.Ker"
by (rule first.target.submodule_add[OF Pker_sub uv(1) uv(2)])
show "restrict ΞΈ P.Ker (u ββ©2 v) =
restrict ΞΈ P.Ker u ββ©3 restrict ΞΈ P.Ker v"
using uv uvP uM' vM' by (simp add: restrict_apply' second.hom_add)
next
fix a v assume av: "a β R" "v β P.Ker"
have vM': "v β M'" using av(2) first.target.submodule_subset[OF Pker_sub] by blast
have avP: "a ββ©2 v β P.Ker"
by (rule first.target.submodule_scale[OF Pker_sub av(1) av(2)])
show "restrict ΞΈ P.Ker (a ββ©2 v) =
a ββ©3 restrict ΞΈ P.Ker v"
using av avP vM' by (simp add: restrict_apply' second.hom_scale)
qed
interpret T: module_homomorphism R "(+)" "(β
)" π¬ π
P.Ker "(ββ©2)" "π¬β©2" "(ββ©2)"
M'' "(ββ©3)" "π¬β©3" "(ββ©3)" "restrict ΞΈ P.Ker"
by (rule theta_restrict_hom)
have T_kernel: "T.Ker = {π¬β©2}"
proof (rule set_eqI, rule iffI)
fix x assume x: "x β T.Ker"
have xP: "x β P.Ker" by (rule T.Ker_mem[OF x])
have xM': "x β M'" using xP first.target.submodule_subset[OF Pker_sub] by blast
have theta_x: "ΞΈ x = π¬β©3"
using T.Ker_image[OF x] xP by (simp add: restrict_apply')
have xeta: "x β Ξ· ` M"
proof -
have xsecond: "x β second.Ker" by (rule second.Ker_memI[OF theta_x xM'])
then show ?thesis using exact by simp
qed
have "x β P.Ker β© (Ξ· ` M)" by (rule IntI[OF xP xeta])
then show "x β {π¬β©2}" using disjoint_P by simp
next
fix x assume x: "x β {π¬β©2}"
have zeroP: "π¬β©2 β P.Ker" by (rule first.target.submodule_zero[OF Pker_sub])
have zeroT: "restrict ΞΈ P.Ker π¬β©2 = π¬β©3" by (rule T.hom_zero)
show "x β T.Ker" using x zeroP zeroT by (simp add: T.Ker_def)
qed
have T_inj: "inj_on (restrict ΞΈ P.Ker) P.Ker"
using T.injective_iff_kernel_trivial T_kernel by blast
have T_image: "(restrict ΞΈ P.Ker) ` P.Ker = M''"
proof (rule set_eqI, rule iffI)
fix z assume z: "z β (restrict ΞΈ P.Ker) ` P.Ker"
then obtain u where u: "u β P.Ker" "z = restrict ΞΈ P.Ker u" by blast
have uM': "u β M'" using u(1) first.target.submodule_subset[OF Pker_sub] by blast
show "z β M''" using u(1) u(2) second.hom_closed[OF uM'] by (simp add: restrict_apply')
next
fix z assume z: "z β M''"
have theta_surj: "ΞΈ ` M' = M''" using short by (simp add: short_exact_iff)
have zimage: "z β ΞΈ ` M'" using z theta_surj by simp
then obtain y where y: "y β M'" "z = ΞΈ y" by blast
have ysum: "y β Module.submodule_sum (ββ©2) P.Ker (Ξ· ` M)"
using y(1) full_P_eta by simp
then obtain u v where uv: "u β P.Ker" "v β Ξ· ` M" "y = u ββ©2 v"
by (rule first.target.submodule_sum_memE)
have uM': "u β M'" using uv(1) first.target.submodule_subset[OF Pker_sub] by blast
have vM': "v β M'" using uv(2) first.target.submodule_subset[OF eta_sub] by blast
have theta_v: "ΞΈ v = π¬β©3"
proof -
have vker: "v β second.Ker" using uv(2) exact by simp
then show ?thesis by (rule second.Ker_image)
qed
have theta_u: "ΞΈ u = z"
using y uv(3) uM' vM' theta_v by (simp add: second.hom_add)
have image_u: "(restrict ΞΈ P.Ker) u β
(restrict ΞΈ P.Ker) ` P.Ker" by (rule imageI[OF uv(1)])
show "z β (restrict ΞΈ P.Ker) ` P.Ker"
using image_u theta_u uv(1) by (simp add: restrict_apply')
qed
have T_bij: "bij_betw (restrict ΞΈ P.Ker) P.Ker M''"
using T_inj T_image by (simp add: bij_betw_def)
have inverse_hom:
"module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3)
P.Ker (ββ©2) π¬β©2 (ββ©2)
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'')"
by (rule T.inverse_module_homomorphism[OF T_bij])
interpret U: module_homomorphism R "(+)" "(β
)" π¬ π
M'' "(ββ©3)" "π¬β©3" "(ββ©3)"
P.Ker "(ββ©2)" "π¬β©2" "(ββ©2)"
"restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M''"
by (rule inverse_hom)
have inclusion_hom:
"module_homomorphism R (+) (β
) π¬ π
P.Ker (ββ©2) π¬β©2 (ββ©2)
M' (ββ©2) π¬β©2 (ββ©2) (identity P.Ker)"
proof (intro module_homomorphism.intro map.intro module_homomorphism_axioms.intro)
show "Module R (+) (β
) π¬ π
(ββ©2) π¬β©2 P.Ker (ββ©2)"
by (rule first.target.submodule_is_module[OF Pker_sub])
show "Module R (+) (β
) π¬ π
(ββ©2) π¬β©2 M' (ββ©2)"
by (rule first.target.Module_axioms)
show "identity P.Ker β P.Ker ββ©E M'"
using first.target.submodule_subset[OF Pker_sub] by (auto simp: PiE_iff)
next
fix u v assume u: "u β P.Ker" and v: "v β P.Ker"
have uv: "u ββ©2 v β P.Ker"
by (rule first.target.submodule_add[OF Pker_sub u v])
then show "identity P.Ker (u ββ©2 v) =
identity P.Ker u ββ©2 identity P.Ker v"
using u v by simp
next
fix a v assume a: "a β R" and v: "v β P.Ker"
have av: "a ββ©2 v β P.Ker"
by (rule first.target.submodule_scale[OF Pker_sub a v])
then show "identity P.Ker (a ββ©2 v) =
a ββ©2 identity P.Ker v"
using v by simp
qed
define Ο where
"Ο = compose M'' (identity P.Ker)
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'')"
have section_hom:
"module_homomorphism R (+) (β
) π¬ π
M'' (ββ©3) π¬β©3 (ββ©3)
M' (ββ©2) π¬β©2 (ββ©2) Ο"
unfolding Ο_def
by (rule U.compose_module_homomorphism[OF inclusion_hom])
have section_eq: "βz. z β M'' βΉ ΞΈ (Ο z) = z"
proof -
fix z assume z: "z β M''"
have uz: "restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z β P.Ker"
by (rule U.hom_closed[OF z])
have inverse: "restrict ΞΈ P.Ker
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z) = z"
by (rule T.inverse_module_homomorphism_right[OF T_bij z])
have sigma_apply: "Ο z =
restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z"
unfolding Ο_def compose_def
using uz z by (simp add: restrict_apply')
have inverse_value: "ΞΈ
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z) =
restrict ΞΈ P.Ker
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z)"
by (rule sym, rule restrict_apply'[OF uz])
have theta_sigma: "ΞΈ (Ο z) = ΞΈ
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z)"
by (simp only: sigma_apply)
have theta_restrict: "ΞΈ
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z) =
restrict ΞΈ P.Ker
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z)"
by (rule inverse_value)
have theta_intermediate: "ΞΈ (Ο z) =
restrict ΞΈ P.Ker
(restrict (inv_into P.Ker (restrict ΞΈ P.Ker)) M'' z)"
by (rule trans[OF theta_sigma theta_restrict])
show "ΞΈ (Ο z) = z"
by (rule trans[OF theta_intermediate inverse])
qed
show ?thesis unfolding right_split_def using section_hom section_eq by blast
qed
theorem short_exact_right_split_iff_left_split:
assumes short: short_exact
shows "right_split β· left_split"
using short_exact_right_split_imp_left_split[OF short]
short_exact_left_split_imp_right_split[OF short] by blast
end
context Module
begin
text βΉThe carrier-restricted identity on a submodule is its inclusion into the
ambient module.βΊ
theorem submodule_inclusion_hom:
assumes N: "submodule N"
shows "module_homomorphism R (+) (β
) π¬ π
N (β) π¬β©M (β) M (β) π¬β©M (β) (identity N)"
proof (intro module_homomorphism.intro map.intro module_homomorphism_axioms.intro)
show "Module R (+) (β
) π¬ π (β) π¬β©M N (β)"
by (rule submodule_is_module[OF N])
show "Module R (+) (β
) π¬ π (β) π¬β©M M (β)"
by (rule Module_axioms)
show "identity N β N ββ©E M"
using submodule_subset[OF N] by (auto simp: PiE_iff)
next
fix u v assume u: "u β N" and v: "v β N"
have uv: "u β v β N" using N u v by (rule submodule_add)
then show "identity N (u β v) = identity N u β identity N v"
using u v by simp
next
fix a v assume a: "a β R" and v: "v β N"
have av: "a β v β N" using N a v by (rule submodule_scale)
then show "identity N (a β v) = a β identity N v"
using v by simp
qed
text βΉComplementary submodules give the canonical split short exact sequence
βΉ0 βΆ K βΆ M βΆ N βΆ 0βΊ. The inclusion of βΉNβΊ
is a section of the complementary projection.βΊ
theorem complementary_submodules_split_short_exact:
assumes N: "submodule N" and K: "submodule K"
and disjoint: "N β© K = {π¬β©M}"
and full: "N ββ©S K = M"
shows "composable_module_homomorphisms.short_exact
K M N π¬β©M (identity K) (complement_projection N K)
β§ composable_module_homomorphisms.right_split
R (+) (β
) π¬ π
M (β) π¬β©M (β) N (β) π¬β©M (β)
(complement_projection N K)"
proof -
interpret I: module_homomorphism R "(+)" "(β
)" π¬ π
K "(β)" "π¬β©M" "(β)" M "(β)" "π¬β©M" "(β)" "identity K"
by (rule submodule_inclusion_hom[OF K])
interpret P: module_homomorphism R "(+)" "(β
)" π¬ π
M "(β)" "π¬β©M" "(β)" N "(β)" "π¬β©M" "(β)" "complement_projection N K"
by (rule complement_projection_hom[OF N K disjoint full])
interpret E: composable_module_homomorphisms R "(+)" "(β
)" π¬ π
K "(β)" "π¬β©M" "(β)" M "(β)" "π¬β©M" "(β)"
N "(β)" "π¬β©M" "(β)" "identity K" "complement_projection N K"
by unfold_locales
have image_I: "identity K ` K = K" by auto
have ker_P: "P.Ker = K"
using complement_projection_Ker[OF N K disjoint full]
by (simp add: P.Ker_def)
have image_P: "complement_projection N K ` M = N"
by (rule complement_projection_image[OF N K disjoint full])
have short: "E.short_exact"
by (simp add: E.short_exact_def E.exact_def image_I ker_P image_P)
have section_hom: "module_homomorphism R (+) (β
) π¬ π
N (β) π¬β©M (β) M (β) π¬β©M (β) (identity N)"
by (rule submodule_inclusion_hom[OF N])
have sec: "βxβN. complement_projection N K (identity N x) = x"
using complement_projection_apply_left[OF N K disjoint full] by simp
have split: "E.right_split"
unfolding E.right_split_def using section_hom sec by blast
show ?thesis using short split by simp
qed
end
end