Up to index of Isabelle/HOL/HOL-Algebra/BPL
theory lemma_2_2_18_local_nilpot(* Title: bpl/lemma_2_2_18_local_nilpot.thy
ID: $Id: lemma_2_2_18.thy $
Author: Jesus Aransay
Comments: The set of lemmas proving the equational part of the BPL
*)
header{*Lemma 2.2.18 in Aransay's memoir*}
theory lemma_2_2_18_local_nilpot imports lemma_2_2_17_local_nilpot
begin
text{*Lemma 2.2.18 is generic, in the sense that the previous definitions and premises from locales @{text lemma_2_2_11} to
@{text lemma_2_2_17} are not needed. Only the notion of differential groups and isomorphism of abelian groups are introduced.*}
text{*As far as we are in a generic setting, with homomorphisms instead of endomorphisms,
the automation of the ring of endomorphisms is lost, and proofs become a bit more obscure*}
text{*Composition of completions is again a completion*}
lemma hom_completion_comp_closed: includes group A + group B + group C
assumes f: "f ∈ hom_completion A B" and g: "g ∈ hom_completion B C"
shows "g o f ∈ hom_completion A C"
using f g
apply (unfold hom_completion_def hom_def Pi_def, auto)
apply (unfold completion_fun2_def completion_def, simp)
apply (intro exI [of _ "g o f"], auto simp add: expand_fun_eq)
apply (rule group_hom.hom_one, unfold group_hom_def group_hom_axioms_def hom_def Pi_def, simp add: prems)
done
lemma iso_inv_compl_coherent_iso_inv_diff: assumes fg: "(f, g) ∈ (F ≅invcompl G)" and f_coherent: "f o diff F = diff G o f"
and g_coherent: "g o diff G = diff F o g" shows "(f, g) ∈ (F ≅invdiff G)"
using fg and f_coherent and g_coherent by (unfold iso_inv_diff_def iso_inv_compl_def iso_diff_def iso_compl_def hom_diff_def, simp)
subsection{*Lemma 2.2.18*}
text{*The following lemma corresponds to @{text "Lemma 2.2.18"} in the memoir*}
text{*It illustrates quite precisely the difficulties of proving facts about homomorphisms and endomorphisms
when we loose the automation supplied in the previous lemmas*}
text{*The difficulties are due to the neccesity of operating with endomorphisms and homomorphisms between different domains, @{term A} and
@{term B}*}
text{*A suitable environment would be the one defined by the ring @{text "End (A)"}, the ring @{text "End (B)"}, the commutative group
@{text "hom (A, B)"} and the commutative group @{text "hom (A, B)"}, but then the question would be how to supply this structure with any
automation*}
text{*In my opinion, the definition @{thm [locale=group] "comm_group_def"} should be relaxed;
in its actual version, when unfolded, the characterization @{term [locale=group] "group G ∧ comm_monoid G"} is obtained,
which unfolded again produces @{term [locale=group] "group_axioms G ∧ monoid G ∧ comm_monoid_axioms G ∧ monoid G"}, which is redundant.
Two possible solutions would be to define @{term [locale=group] "comm_group G = group G ∧ comm_monoid_axioms G"} or also
@{term [locale=group] "comm_group G = group_axioms G ∧ comm_monoid G"}*}
lemma lemma_2_2_18: assumes A: "diff_group A" and B: "comm_group B" and F_F': "(F, F') ∈ (A ≅invcompl B)"
shows "diff_group (|carrier = carrier B, mult = mult B, one = one B, diff = F o (diff A) o F'|)),"
(is "diff_group ?B'")
and "(F, F') ∈ (A ≅invdiff (|carrier = carrier B, mult = mult B, one = one B, diff = F o (diff A) o F'|)),)"
(is "_ ∈ A ≅invdiff ?B'")
proof -
show "diff_group ?B'"
proof (unfold diff_group_def diff_group_axioms_def comm_group_def group_def comm_monoid_def, intro conjI)
from B show "monoid ?B'" by (unfold comm_group_def group_def monoid_def, simp)
from B show "monoid ?B'" by (unfold comm_group_def group_def monoid_def, simp)
from B show "comm_monoid_axioms ?B'" by (unfold comm_group_def comm_monoid_def comm_monoid_axioms_def, simp)
from B show "group_axioms ?B'" by (unfold comm_group_def group_def group_axioms_def Units_def, simp)
next
from F_F' have F'_hom: "F' ∈ hom_completion B A" by (unfold iso_inv_compl_def iso_compl_def, simp)
from diff_group.diff_hom [OF A] have diff: "differA ∈ hom_completion A A" by simp
from hom_completion_comp_closed [OF _ _ _ F'_hom diff ] and A and B have diff_F': "differA o F' ∈ hom_completion B A"
by (unfold diff_group_def comm_group_def group_def, simp)
from F_F' have F_hom: "F ∈ hom_completion A B" by (unfold iso_inv_compl_def iso_compl_def, simp)
from hom_completion_comp_closed [OF _ _ _ diff_F' F_hom] and A and B have "differ?B' ∈ hom_completion B B"
by (unfold diff_group_def comm_group_def group_def, simp add: o_assoc)
then show "differ?B' ∈ hom_completion ?B' ?B'"
by (unfold hom_completion_def completion_fun2_def completion_def hom_def Pi_def expand_fun_eq, auto)
next
from sym [OF o_assoc [of " F o differA" F' "F o differA o F'"]] and sym [OF o_assoc [of F "differA" F']]
and o_assoc [of F' F "(differA o F')"]
have "differ?B' o differ?B' = F o differA o ((F' o F) o (differA o F'))" by simp
also from iso_inv_compl_id [OF F_F'] have "… = F o differA o ((λx. if x ∈ carrier A then id x else \<one>A) o (differA o F'))"
by (unfold iso_inv_compl_def completion_def, simp)
also from o_assoc [of "(λx. if x ∈ carrier A then id x else \<one>A)" "differA" "F'"] have "… = F o differA o (differA o F')"
proof -
from diff_group.diff_hom [OF A] have "(λx. if x ∈ carrier A then id x else \<one>A) o (differA) = (differA)"
by (unfold hom_completion_def completion_fun2_def completion_def hom_def Pi_def expand_fun_eq, auto)
with o_assoc [of "(λx. if x ∈ carrier A then id x else \<one>A)" "differA" "F'"] show ?thesis by simp
qed
also from sym [OF o_assoc [of F "differA" "differA o F'"]] and o_assoc [of "differA" "differA" F']
have "… = F o ((differA o differA) o F')" by simp
also from diff_group.diff_nilpot [OF A] have "… = F o ((λx. \<one>A) o F')" by simp
also have "… = F o (λx. \<one>A)" by (simp add: expand_fun_eq)
also from F_F' A B have "… = (λx. \<one>B)" by (unfold iso_inv_compl_def iso_compl_def expand_fun_eq, auto)
(intro hom_completion_one, unfold group_def diff_group_def comm_group_def, simp_all)
also have "… = (λx. \<one>?B')" by simp
finally show "differ?B' o differ?B' = (λx. \<one>?B')" by simp
qed
next
from F_F' have F_F'_iso_compl: "(F, F') ∈ A ≅invcompl ?B'"
by (unfold iso_inv_compl_def iso_compl_def completion_def expand_fun_eq hom_completion_def hom_def Pi_def completion_fun2_def, auto)
moreover have F_coherent: "F o diff A = diff ?B' o F"
proof -
have "diff A = diff A o completion A A id"
proof (rule ext)
fix x
show "(differA) x = (differA o completion A A id) x"
proof (cases "x ∈ carrier A")
case True with diff_group.diff_hom [OF A] show "(differA) x = (differA o completion A A id) x"
by (unfold hom_completion_def completion_fun2_def completion_def, simp)
next
case False with diff_group.diff_hom [OF A]
have l_h_s: "(differA) x = \<one>A" by (unfold hom_completion_def completion_fun2_def completion_def, auto)
from False have "(completion A A id) x = \<one>A" by (unfold completion_def, simp)
with hom_completion_one [OF _ _ diff_group.diff_hom [OF A]] and A have r_h_s: "(differA o completion A A id) x = \<one>A"
by (unfold diff_group_def comm_group_def group_def, simp)
from r_h_s and l_h_s show "(differA) x = (differA o completion A A id) x" by simp
qed
qed
also from iso_inv_compl_id [OF F_F'] and o_assoc [of "diff A" F' F] have "… = diff A o F' o F" by simp
finally have "diff A = diff A o F' o F" by simp
with o_assoc [of F "diff A o F'" F] and o_assoc [of F "diff A" F'] show ?thesis by simp
qed
moreover have F'_coherent: "F' o diff ?B' = diff A o F'"
proof -
have "diff A = completion A A id o diff A"
proof (rule ext)
fix x
show "(differA) x = (completion A A id o differA) x"
proof (cases "x ∈ carrier A")
case True with diff_group.diff_hom [OF A] and diff_group.diff_hom [OF A]
and hom_completion_closed [of "diff A" A A x] show "(differA) x = (completion A A id o differA) x"
by (unfold hom_completion_def completion_fun2_def completion_def, simp)
next
case False with diff_group.diff_hom [OF A] have l_h_s: "(differA) x = \<one>A"
by (unfold hom_completion_def completion_fun2_def completion_def, auto)
with l_h_s have r_h_s: "(completion A A id o differA) x = \<one>A" by (unfold completion_def, simp)
from r_h_s and l_h_s show "(differA) x = (completion A A id o differA) x" by simp
qed
qed
also from iso_inv_compl_id [OF F_F'] and sym [OF o_assoc [of F' F "diff A"]] have "… = F' o F o diff A" by simp
finally have "diff A = F' o F o diff A" by simp
then show ?thesis by (auto simp add: o_assoc)
qed
ultimately show "(F, F') ∈ A ≅invdiff ?B'" by (intro iso_inv_compl_coherent_iso_inv_diff)
qed
end
lemma hom_completion_comp_closed:
[| group A; group B; group C; f ∈ hom_completion A B; g ∈ hom_completion B C |]
==> g o f ∈ hom_completion A C
lemma iso_inv_compl_coherent_iso_inv_diff:
[| (f, g) ∈ F ≅invcompl G; f o differF = differG o f;
g o differG = differF o g |]
==> (f, g) ∈ F ≅invdiff G
lemma lemma_2_2_18(1):
[| diff_group A; comm_group B; (F, F') ∈ A ≅invcompl B |]
==> diff_group
(| carrier = carrier B, mult = op ⊗B, one = \<one>B,
diff = F o differA o F', ... = () |)
and lemma_2_2_18(2):
[| diff_group A; comm_group B; (F, F') ∈ A ≅invcompl B |]
==> (F, F')
∈ A ≅invdiff
(| carrier = carrier B, mult = op ⊗B, one = \<one>B,
diff = F o differA o F', ... = () |)