Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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. Local Open Scope mc_scope. Local Open 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.) *) Definition abses_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]. *) Definition abses_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))
apply abses_pushout_pullback_reorder'. Defined.
H: Univalence

Is0Bifunctor (AbSES' : AbGroup^op -> AbGroup -> Type)
H: Univalence

Is0Bifunctor (AbSES' : AbGroup^op -> AbGroup -> Type)
rapply Build_Is0Bifunctor''. Defined.
H: Univalence

Is1Bifunctor (AbSES' : AbGroup^op -> AbGroup -> Type)
H: Univalence

Is1Bifunctor (AbSES' : AbGroup^op -> AbGroup -> Type)
H: Univalence

forall a : AbGroup^op, Is1Functor (AbSES' a)
H: Univalence
forall b : AbGroup, Is1Functor (flip AbSES' b)
H: Univalence
forall (a0 a1 : AbGroup^op) (f : a0 $-> a1) (b0 b1 : AbGroup) (g : b0 $-> b1), fmap01 AbSES' a1 g $o fmap10 AbSES' f b0 $== fmap10 AbSES' f b1 $o fmap01 AbSES' a0 g
H: Univalence

forall (a0 a1 : AbGroup^op) (f : a0 $-> a1) (b0 b1 : AbGroup) (g : b0 $-> b1), fmap01 AbSES' a1 g $o fmap10 AbSES' f b0 $== fmap10 AbSES' f b1 $o fmap01 AbSES' a0 g
H: Univalence
a0, a1: AbGroup^op
g: a0 $-> a1
b0, b1: AbGroup
f: b0 $-> b1
E: AbSES' a0 b0

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. *) Definition baer_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 mon_unit E = point (AbSES B A)
symmetry; apply abses_pullback_const. Defined. (** The right inverse law follows by commutativity. *) Definition baer_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. *) Definition abses_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
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pullback ab_diagonal (abses_pushout ab_codiagonal (abses_direct_sum (abses_pullback ab_diagonal (abses_pushout ab_codiagonal (abses_direct_sum E F))) G)) = abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id $o ab_diagonal) (abses_pushout (ab_codiagonal $o functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

?Goal = abses_direct_sum (abses_pullback ab_diagonal (abses_pushout ab_codiagonal (abses_direct_sum E F))) G
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A
abses_pullback ab_diagonal (abses_pushout ab_codiagonal ?Goal) = abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id $o ab_diagonal) (abses_pushout (ab_codiagonal $o functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

?Goal = abses_direct_sum (abses_pullback ab_diagonal (abses_pushout ab_codiagonal (abses_direct_sum E F))) G
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

?Goal = abses_direct_sum (abses_pullback ab_diagonal (abses_pushout ab_codiagonal (abses_direct_sum E F))) (abses_pullback grp_homo_id G)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

?Goal = abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id) (abses_direct_sum (abses_pushout ab_codiagonal (abses_direct_sum E F)) G)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

?Goal0 = abses_direct_sum (abses_pushout ab_codiagonal (abses_direct_sum E F)) G
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

?Goal0 = abses_direct_sum (abses_pushout ab_codiagonal (abses_direct_sum E F)) (abses_pushout grp_homo_id G)
apply abses_directsum_distributive_pushouts.
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pullback ab_diagonal (abses_pushout ab_codiagonal (abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id) (abses_pushout (functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G)))) = abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id $o ab_diagonal) (abses_pushout (ab_codiagonal $o functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pullback ab_diagonal (abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id) (abses_pushout ab_codiagonal (abses_pushout (functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G)))) = abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id $o ab_diagonal) (abses_pushout (ab_codiagonal $o functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id $o ab_diagonal) (abses_pushout ab_codiagonal (abses_pushout (functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G))) = abses_pullback (functor_ab_biprod ab_diagonal grp_homo_id $o ab_diagonal) (abses_pushout (ab_codiagonal $o functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pushout (ab_codiagonal $o functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G) = abses_pushout ab_codiagonal (abses_pushout (functor_ab_biprod ab_codiagonal grp_homo_id) (abses_direct_sum (abses_direct_sum E F) G))
apply abses_pushout_compose. Defined. (** For [E, F, G : AbSES B A], we can "twist" the order of the trinary Baer sum as follows. *)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_trinary_baer_sum E F G = abses_trinary_baer_sum G F E
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_trinary_baer_sum E F G = abses_trinary_baer_sum G F E
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pullback ab_triagonal (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum E F) G)) = abses_pullback ab_triagonal (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum G F) E))
(* The next line uses the fact that [ab_triagonal] is definitionally equal to [ab_biprod_twist $o ab_triagonal]: *)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pullback ab_triagonal (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum E F) G)) = abses_pullback ab_triagonal (abses_pullback ab_biprod_twist (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum G F) E)))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum E F) G) = abses_pullback ab_biprod_twist (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum G F) E))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pushout (ab_cotriagonal $o ab_biprod_twist) (abses_direct_sum (abses_direct_sum E F) G) = abses_pullback ab_biprod_twist (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum G F) E))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pushout ab_cotriagonal (abses_pushout ab_biprod_twist (abses_direct_sum (abses_direct_sum E F) G)) = abses_pullback ab_biprod_twist (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum G F) E))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pushout ab_cotriagonal (abses_pullback (component3 (abses_twist_directsum E F G)) (abses_direct_sum (abses_direct_sum G F) E)) = abses_pullback ab_biprod_twist (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum G F) E))
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_pushout ab_cotriagonal (abses_pullback ab_biprod_twist (abses_direct_sum (abses_direct_sum G F) E)) = abses_pullback ab_biprod_twist (abses_pushout ab_cotriagonal (abses_direct_sum (abses_direct_sum G F) E))
exact (abses_pushout_pullback_reorder _ _ _). Defined. (** It now follows that we can twist the order of the summands in the Baer sum. *)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_baer_sum (abses_baer_sum E F) G = abses_baer_sum (abses_baer_sum G F) E
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_baer_sum (abses_baer_sum E F) G = abses_baer_sum (abses_baer_sum G F) E
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_trinary_baer_sum E F G = abses_trinary_baer_sum G F E
apply twist_trinary_baer_sum. Defined. (** From these results, it finally follows that the Baer sum is associative. *)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_baer_sum (abses_baer_sum E F) G = abses_baer_sum E (abses_baer_sum F G)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_baer_sum (abses_baer_sum E F) G = abses_baer_sum E (abses_baer_sum F G)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_baer_sum (abses_baer_sum G F) E = abses_baer_sum E (abses_baer_sum F G)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_baer_sum E (abses_baer_sum G F) = abses_baer_sum E (abses_baer_sum F G)
H: Univalence
A, B: AbGroup
E, F, G: AbSES B A

abses_baer_sum G F = abses_baer_sum F G
apply baer_sum_commutative. Defined. (** The Baer sum makes [AbSES B A] into an H-space. (In fact, a coherent H-space, but we leave that for now.) *)
H: Univalence
B, A: AbGroup

IsHSpace (AbSES B A)
H: Univalence
B, A: AbGroup

IsHSpace (AbSES B A)
H: Univalence
B, A: AbGroup

SgOp (AbSES B A)
H: Univalence
B, A: AbGroup
LeftIdentity ?hspace_op (point (AbSES B A))
H: Univalence
B, A: AbGroup
RightIdentity ?hspace_op (point (AbSES B A))
H: Univalence
B, A: AbGroup

SgOp (AbSES B A)
exact abses_baer_sum.
H: Univalence
B, A: AbGroup

LeftIdentity abses_baer_sum (point (AbSES B A))
intro; apply baer_sum_unit_l.
H: Univalence
B, A: AbGroup

RightIdentity abses_baer_sum (point (AbSES B A))
intro; apply baer_sum_unit_r. Defined.
H: Univalence

Is0Bifunctor (AbSES : AbGroup^op -> AbGroup -> pType)
H: Univalence

Is0Bifunctor (AbSES : AbGroup^op -> AbGroup -> pType)
rapply Build_Is0Bifunctor''. Defined.
H: Univalence

Is1Bifunctor (AbSES : AbGroup^op -> AbGroup -> pType)
H: Univalence

Is1Bifunctor (AbSES : AbGroup^op -> AbGroup -> pType)
H: Univalence

forall a : AbGroup^op, Is1Functor (AbSES a)
H: Univalence
forall b : AbGroup, Is1Functor (flip AbSES b)
H: Univalence
forall (a0 a1 : AbGroup^op) (f : a0 $-> a1) (b0 b1 : AbGroup) (g : b0 $-> b1), fmap01 AbSES a1 g $o fmap10 AbSES f b0 $== fmap10 AbSES f b1 $o fmap01 AbSES a0 g
H: Univalence

forall (a0 a1 : AbGroup^op) (f : a0 $-> a1) (b0 b1 : AbGroup) (g : b0 $-> b1), fmap01 AbSES a1 g $o fmap10 AbSES f b0 $== fmap10 AbSES f b1 $o fmap01 AbSES a0 g
H: Univalence
a0, a1: AbGroup^op
f: a0 $-> a1
b0, b1: AbGroup
g: b0 $-> b1

fmap01 AbSES a1 g $o fmap10 AbSES f b0 $== fmap10 AbSES f b1 $o fmap01 AbSES a0 g
H: Univalence
a0, a1: AbGroup^op
f: a0 $-> a1
b0, b1: AbGroup
g: b0 $-> b1

IsHSpace (AbSES a1 b1)
H: Univalence
a0, a1: AbGroup^op
f: a0 $-> a1
b0, b1: AbGroup
g: b0 $-> b1
fmap01 AbSES a1 g $o fmap10 AbSES f b0 == fmap10 AbSES f b1 $o fmap01 AbSES a0 g
H: Univalence
a0, a1: AbGroup^op
f: a0 $-> a1
b0, b1: AbGroup
g: b0 $-> b1

fmap01 AbSES a1 g $o fmap10 AbSES f b0 == fmap10 AbSES f b1 $o fmap01 AbSES a0 g
H: Univalence
a0, a1: AbGroup^op
f: a0 $-> a1
b0, b1: AbGroup
g: b0 $-> b1
E: AbSES a0 b0

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)
apply abses_directsum_distributive_pushouts. Defined.
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)
apply abses_directsum_distributive_pullbacks. Defined.