Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import WildCat Pointed.Core.Require Import AbGroups.AbelianGroup AbGroups.Biproduct AbGroups.AbHom.Require Import AbSES.Core AbSES.Pullback AbSES.Pushout AbSES.DirectSum.Require Import Homotopy.HSpace.Core.LocalOpen Scope mc_scope.LocalOpen Scope mc_add_scope.(** * The Baer sum of two short exact sequences, lemmas and consequences. *)(** The Baer sum of two short exact sequences is obtained from the pointwise direct sum by pushing forward along the codiagonal and then pulling back along the diagonal. (Swapping the order of pushing forward and pulling back produces an isomorphic short exact sequence.) *)Definitionabses_baer_sum `{Univalence} {B A : AbGroup@{u}} (E F : AbSES B A)
: AbSES B A
:= abses_pullback ab_diagonal (abses_pushout ab_codiagonal (abses_direct_sum E F)).(** ** [AbSES'] is a bifunctor *)(** Given a morphism [f] of short exact sequences, the pushout of the domain along [f_1] equals the pullback of the codomain along [f_3]. *)
H: Univalence A, A', B, B': AbGroup E: AbSES B A E': AbSES B' A' f: AbSESMorphism E E'
abses_pushout (component1 f) E $==
abses_pullback (component3 f) E'
H: Univalence A, A', B, B': AbGroup E: AbSES B A E': AbSES B' A' f: AbSESMorphism E E'
abses_pushout (component1 f) E $==
abses_pullback (component3 f) E'
(* The morphism [f : E -> E'] factors as [E -> f_1 E -> E'], where the first map is the map defining the pushout [f_1 E] and the second map is denoted [abses_pushout_morphism_rec f] below. This second map is the identity on the first component, so it presents its domain as the pullback of [E'] along [f_3]. *)exact (abses_pullback_component1_id' (abses_pushout_morphism_rec f) (fun_ => idpath)).Defined.(** Given a morphism [f] of short exact sequences, the pushout of the domain along [f_1] equals the pullback of the codomain along [f_3]. *)Definitionabses_pushout_is_pullback `{Univalence} {A A' B B' : AbGroup}
{E : AbSES B A} {E' : AbSES B' A'} (f : AbSESMorphism E E')
: abses_pushout (component1 f) E = abses_pullback (component3 f) E'
:= equiv_path_abses_iso (abses_pushout_is_pullback' f).
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B
abses_pushout f (abses_pullback g E) $==
abses_pullback g (abses_pushout f E)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B
abses_pushout f (abses_pullback g E) $==
abses_pullback g (abses_pushout f E)
(* There are morphisms [Eg -> E] and [E -> fE] by definition of the pullback and pushout. We define [F : Eg -> fE] to be the composite. Its first and third components are [f o id] and [id o g]. *)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B F:= absesmorphism_compose (abses_pushout_morphism E f)
(abses_pullback_morphism E g): AbSESMorphism (abses_pullback g E)
(abses_pushout f E)
abses_pushout f (abses_pullback g E) $==
abses_pullback g (abses_pushout f E)
(* We change [F] to a morphism that is the same except that the first and third components are [f] and [g]. Then [abses_pushout_is_pullback] shows that the pushout of [Eg] along [f] is equal to the pullback of [fE] along [g]. *)refine (abses_pushout_is_pullback' (Build_AbSESMorphism f (component2 F) g _ _)); apply F.Defined.(** This is the statement that [AbSES'] is a bifunctor, but we state it separately because Coq is slow to unify [IsBifunctor AbSES'] against goals written in this form. *)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B
abses_pushout f (abses_pullback g E) =
abses_pullback g (abses_pushout f E)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B
abses_pushout f (abses_pullback g E) =
abses_pullback g (abses_pushout f E)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B
abses_path_data_iso
(abses_pushout f (abses_pullback g E))
(abses_pullback g (abses_pushout f E))
abses_pushout f (abses_pullback g E) =
abses_pullback g (abses_pushout f E)
exact (abses_pushout_pullback_reorder E f g).Defined.(** Given a short exact sequence [A -> E -> B] and maps [f : A -> A'], [g : B' -> B], we can change the order of pushing out along [f] and pulling back along [g]. *)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B
abses_pushout f (abses_pullback g E) =
abses_pullback g (abses_pushout f E)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B
abses_pushout f (abses_pullback g E) =
abses_pullback g (abses_pushout f E)
(* There are morphisms [Eg -> E] and [E -> fE] by definition of the pullback and pushout. We define [F : Eg -> fE] to be the composite. Its first and third components are [f o id] and [id o g]. *)
H: Univalence A, A', B, B': AbGroup E: AbSES B A f: A $-> A' g: B' $-> B F:= absesmorphism_compose (abses_pushout_morphism E f)
(abses_pullback_morphism E g): AbSESMorphism (abses_pullback g E)
(abses_pushout f E)
abses_pushout f (abses_pullback g E) =
abses_pullback g (abses_pushout f E)
(* We change [F] to a morphism that is the same except that the first and third components are [f] and [g]. Then [abses_pushout_is_pullback] shows that the pushout of [Eg] along [f] is equal to the pullback of [fE] along [g]. *)refine (abses_pushout_is_pullback (Build_AbSESMorphism f (component2 F) g _ _)); apply F.Defined.(** The Baer sum distributes over pullbacks. *)
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (f + g) E =
abses_baer_sum (abses_pullback f E)
(abses_pullback g E)
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (f + g) E =
abses_baer_sum (abses_pullback f E)
(abses_pullback g E)
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (f + g) E =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E)))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (grp_prod_corec f g)
(abses_pullback ab_codiagonal E) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E)))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (grp_prod_corec f g)
(abses_pushout (component1 (abses_codiagonal E))
(abses_direct_sum E E)) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E)))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (grp_prod_corec f g)
(abses_pushout ab_codiagonal (abses_direct_sum E E)) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E)))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
?Goal0 =
abses_pullback (grp_prod_corec f g)
(abses_pushout ab_codiagonal (abses_direct_sum E E))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
?Goal0 = ?Goal
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
?Goal =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E)))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pushout ab_codiagonal
(abses_pullback (grp_prod_corec f g)
(abses_direct_sum E E)) =
abses_pushout ab_codiagonal
(abses_pullback ab_diagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E)))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (grp_prod_corec f g)
(abses_direct_sum E E) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback (functor_ab_biprod f g $o ab_diagonal)
(abses_direct_sum E E) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E))
H: Univalence A, B, B': AbGroup E: AbSES B A f, g: ab_hom B' B
abses_pullback ab_diagonal
(abses_pullback (functor_ab_biprod f g)
(abses_direct_sum E E)) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback g E))
exact (ap (abses_pullback _) (abses_directsum_distributive_pullbacks f g)).Defined.(** The Baer sum is commutative. *)
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_baer_sum E F = abses_baer_sum F E
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_baer_sum E F = abses_baer_sum F E
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal (abses_direct_sum E F)) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal (abses_direct_sum F E))
(* The next line uses that [direct_sum_swap $o ab_diagonal] is definitionally equal to [ab_diagonal]: *)
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal (abses_direct_sum E F)) =
abses_pullback ab_diagonal
(abses_pullback direct_sum_swap
(abses_pushout ab_codiagonal
(abses_direct_sum F E)))
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_pushout ab_codiagonal (abses_direct_sum E F) =
abses_pullback direct_sum_swap
(abses_pushout ab_codiagonal (abses_direct_sum F E))
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_pushout (ab_codiagonal $o direct_sum_swap)
(abses_direct_sum E F) =
abses_pullback direct_sum_swap
(abses_pushout ab_codiagonal (abses_direct_sum F E))
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_pushout ab_codiagonal
(abses_pushout direct_sum_swap
(abses_direct_sum E F)) =
abses_pullback direct_sum_swap
(abses_pushout ab_codiagonal (abses_direct_sum F E))
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_pushout ab_codiagonal
(abses_pullback
(component3 (abses_swap_morphism E F))
(abses_direct_sum F E)) =
abses_pullback direct_sum_swap
(abses_pushout ab_codiagonal (abses_direct_sum F E))
H: Univalence A, B: AbGroup E, F: AbSES B A
abses_pushout ab_codiagonal
(abses_pullback direct_sum_swap
(abses_direct_sum F E)) =
abses_pullback direct_sum_swap
(abses_pushout ab_codiagonal (abses_direct_sum F E))
apply abses_pushout_pullback_reorder.Defined.(** The right unit law for the Baer sum says that for all [E : AbSES B A], [E + E_0 = E], where [E_0] is the split short exact sequence. *)
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum E (point (AbSES B A)) = E
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum E (point (AbSES B A)) = E
H: Univalence A, B: AbGroup E: AbSES B A
point (AbSES B A) = ?Goal
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum E ?Goal = E
H: Univalence A, B: AbGroup E: AbSES B A
point (AbSES B A) = ?Goal
exact (abses_pullback_const E).
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum E (abses_pullback grp_homo_const E) = E
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum (abses_pullback grp_homo_id E)
(abses_pullback grp_homo_const E) = E
H: Univalence A, B: AbGroup E: AbSES B A
abses_pullback (grp_homo_id + grp_homo_const) E = E
H: Univalence A, B: AbGroup E: AbSES B A
abses_pullback grp_homo_id E = E
apply abses_pullback_id.Defined.(** The left unit law for the Baer sum is analogous. *)Definitionbaer_sum_unit_l `{Univalence} {A B : AbGroup} (E : AbSES B A)
: abses_baer_sum (point (AbSES B A)) E = E
:= baer_sum_commutative _ _ @ baer_sum_unit_r _.(** For any [E : AbSES B A], the pullback of [E] along [-id_B] acts as an additive inverse for [E] with respect to the Baer sum. *)
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum E (abses_pullback (- grp_homo_id) E) =
point (AbSES B A)
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum E (abses_pullback (- grp_homo_id) E) =
point (AbSES B A)
H: Univalence A, B: AbGroup E: AbSES B A
abses_baer_sum (abses_pullback grp_homo_id E)
(abses_pullback (- grp_homo_id) E) =
point (AbSES B A)
H: Univalence A, B: AbGroup E: AbSES B A
abses_pullback (grp_homo_id - grp_homo_id) E =
point (AbSES B A)
H: Univalence A, B: AbGroup E: AbSES B A
abses_pullback 0 E = point (AbSES B A)
symmetry; apply abses_pullback_const.Defined.(** The right inverse law follows by commutativity. *)Definitionbaer_sum_inverse_r `{Univalence} {A B : AbGroup} (E : AbSES B A)
: abses_baer_sum (abses_pullback (-grp_homo_id) E) E = point (AbSES B A)
:= baer_sum_commutative _ _ @ baer_sum_inverse_l _.(** The Baer sum distributes over pushouts. *)
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout (f + g) E =
abses_baer_sum (abses_pushout f E) (abses_pushout g E)
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout (f + g) E =
abses_baer_sum (abses_pushout f E) (abses_pushout g E)
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout (f + g) E =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E)))
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout ab_codiagonal
(abses_pushout (grp_prod_corec f g) E) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E)))
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout ab_codiagonal
(abses_pushout (grp_prod_corec f g) E) =
abses_pushout ab_codiagonal
(abses_pullback ab_diagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E)))
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout (grp_prod_corec f g) E =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E))
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout (functor_ab_biprod f g $o ab_diagonal) E =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E))
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout (functor_ab_biprod f g)
(abses_pushout ab_diagonal E) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E))
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pushout (functor_ab_biprod f g)
(abses_pullback (component3 (abses_diagonal E))
(abses_direct_sum E E)) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E))
H: Univalence A, A', B: AbGroup E: AbSES B A' f, g: ab_hom A' A
abses_pullback (component3 (abses_diagonal E))
(abses_pushout (functor_ab_biprod f g)
(abses_direct_sum E E)) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout g E))
exact (ap (abses_pullback _) (abses_directsum_distributive_pushouts f g)).Defined.(** Our next goal is to prove that the Baer sum is associative. Rather than showing this directly, we first prove [baer_sum_twist], which says that [abses_baer_sum (abses_baer_sum E F) G = abses_baer_sum (abses_baer_sum G F) E]. The proof of this mimics the proof of commutativity above. Then we prove associativity by combining this with commutativity. *)(** The trinary Baer sum of three short exact sequences. *)Definitionabses_trinary_baer_sum `{Univalence}
{A B : AbGroup@{u}} (E F G : AbSES B A)
: AbSES B A
:= abses_pullback ab_triagonal
(abses_pushout ab_cotriagonal
(abses_direct_sum (abses_direct_sum E F) G)).(** For [E, F, G : AbSES B A], the Baer sum of [E], [F] and [G] (associated left) is equal to the trinary Baer sum of [E], [F] and [G]. *)
H: Univalence A, B: AbGroup E, F, G: AbSES B A
abses_baer_sum (abses_baer_sum E F) G =
abses_trinary_baer_sum E F G
H: Univalence A, B: AbGroup E, F, G: AbSES B A
abses_baer_sum (abses_baer_sum E F) G =
abses_trinary_baer_sum E F G
abses_pushout g (abses_pullback f E) =
abses_pullback f (abses_pushout g E)
apply abses_pushout_pullback_reorder.Defined.(** ** Pushouts and pullbacks respect the Baer sum *)
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout f (abses_baer_sum E F) =
abses_baer_sum (abses_pushout f E) (abses_pushout f F)
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout f (abses_baer_sum E F) =
abses_baer_sum (abses_pushout f E) (abses_pushout f F)
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout f
(abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum E F))) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout f F)))
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout f
(abses_pushout ab_codiagonal (abses_direct_sum E F)) =
abses_pushout ab_codiagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout f F))
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout (f $o ab_codiagonal)
(abses_direct_sum E F) =
abses_pushout ab_codiagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout f F))
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
f $o ab_codiagonal == ?Goal
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout ?Goal (abses_direct_sum E F) =
abses_pushout ab_codiagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout f F))
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout (ab_codiagonal $o functor_ab_biprod f f)
(abses_direct_sum E F) =
abses_pushout ab_codiagonal
(abses_direct_sum (abses_pushout f E)
(abses_pushout f F))
H: Univalence A, A', B: AbGroup f: A $-> A' E, F: AbSES B A
abses_pushout (functor_ab_biprod f f)
(abses_direct_sum E F) =
abses_direct_sum (abses_pushout f E)
(abses_pushout f F)
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback f (abses_baer_sum E F) =
abses_baer_sum (abses_pullback f E)
(abses_pullback f F)
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback f (abses_baer_sum E F) =
abses_baer_sum (abses_pullback f E)
(abses_pullback f F)
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback f
(abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum E F))) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback f F)))
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback (ab_diagonal $o f)
(abses_pushout ab_codiagonal (abses_direct_sum E F)) =
abses_pullback ab_diagonal
(abses_pushout ab_codiagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback f F)))
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback (ab_diagonal $o f)
(abses_direct_sum E F) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback f F))
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
ab_diagonal $o f ==
functor_ab_biprod f f $o ab_diagonal
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback (functor_ab_biprod f f $o ab_diagonal)
(abses_direct_sum E F) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback f F))
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback (functor_ab_biprod f f $o ab_diagonal)
(abses_direct_sum E F) =
abses_pullback ab_diagonal
(abses_direct_sum (abses_pullback f E)
(abses_pullback f F))
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A
abses_pullback (functor_ab_biprod f f)
(abses_direct_sum E F) =
abses_direct_sum (abses_pullback f E)
(abses_pullback f F)