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 HSet Limits.Pullback. Require Import WildCat Pointed.Core Homotopy.ExactSequence. Require Import Modalities.ReflectiveSubuniverse. Require Import AbGroups.AbelianGroup AbGroups.AbPullback AbGroups.Biproduct. Require Import AbSES.Core AbSES.DirectSum. Local Open Scope abses_scope. (** * Pullbacks of short exact sequences *) (** A short exact sequence [A -> E -> B] can be pulled back along a map [B' -> B]. We start by defining the underlying map, then the pointed version. *)
A, B, B': AbGroup
f: B' $-> B

AbSES B A -> AbSES B' A
A, B, B': AbGroup
f: B' $-> B

AbSES B A -> AbSES B' A
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

AbSES B' A
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

projection E o inclusion E == f o grp_homo_const
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
IsEmbedding (grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ?p)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
IsConnMap (Modality.modality_to_reflective_subuniverse (Core.Tr (-1))) (grp_pullback_pr2 (projection E) f)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
IsExact (Core.Tr (-1)) (grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ?p) (grp_pullback_pr2 (projection E) f)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

projection E o inclusion E == f o grp_homo_const
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
x: A

projection E (inclusion E x) = f (grp_homo_const x)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
x: A

projection E (inclusion E x) = mon_unit
apply isexact_inclusion_projection.
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsEmbedding (grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ((fun x : A => (let X := fun a : AbSES' B A => cx_isexact in let X0 := fun a : AbSES' B A => pointed_fun (X a) in X0 E x) @ (grp_homo_unit f)^) : projection E o inclusion E == f o grp_homo_const))
exact (cancelL_isembedding (g:= grp_pullback_pr1 _ _)).
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsConnMap (Modality.modality_to_reflective_subuniverse (Core.Tr (-1))) (grp_pullback_pr2 (projection E) f)
rapply conn_map_pullback'.
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsExact (Core.Tr (-1)) (grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ((fun x : A => (let X := fun a : AbSES' B A => cx_isexact in let X0 := fun a : AbSES' B A => pointed_fun (X a) in X0 E x) @ (grp_homo_unit f)^) : projection E o inclusion E == f o grp_homo_const)) (grp_pullback_pr2 (projection E) f)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsComplex (grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ((fun x : A => (let X := fun a : AbSES' B A => cx_isexact in let X0 := fun a : AbSES' B A => pointed_fun (X a) in X0 E x) @ (grp_homo_unit f)^) : projection E o inclusion E == f o grp_homo_const)) (grp_pullback_pr2 (projection E) f)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
IsConnMap (Modality.modality_to_reflective_subuniverse (Core.Tr (-1))) (cxfib ?cx_isexact)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsComplex (grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ((fun x : A => (let X := fun a : AbSES' B A => cx_isexact in let X0 := fun a : AbSES' B A => pointed_fun (X a) in X0 E x) @ (grp_homo_unit f)^) : projection E o inclusion E == f o grp_homo_const)) (grp_pullback_pr2 (projection E) f)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsHSet B'
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
grp_pullback_pr2 (projection E) f o* grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ((fun x : A => (let X := fun a : AbSES' B A => cx_isexact in let X0 := fun a : AbSES' B A => pointed_fun (X a) in X0 E x) @ (grp_homo_unit f)^) : projection E o inclusion E == f o grp_homo_const) == pconst
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsHSet B'
exact _.
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

grp_pullback_pr2 (projection E) f o* grp_pullback_corec (projection E) f (inclusion E) grp_homo_const ((fun x : A => (let X := fun a : AbSES' B A => cx_isexact in let X0 := fun a : AbSES' B A => pointed_fun (X a) in X0 E x) @ (grp_homo_unit f)^) : projection E o inclusion E == f o grp_homo_const) == pconst
reflexivity.
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsConnMap (Modality.modality_to_reflective_subuniverse (Core.Tr (-1))) (cxfib (phomotopy_homotopy_hset (fun x0 : A => 1)))
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

IsConnMap (Modality.modality_to_reflective_subuniverse (Core.Tr (-1))) (fun x : A => hfiber_pullback_along_pointed f (projection E) (grp_homo_unit f) (cxfib (phomotopy_homotopy_hset (fun x0 : A => 1)) x))
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

cxfib cx_isexact == (fun x : A => hfiber_pullback_along_pointed f (projection E) (grp_homo_unit f) (cxfib (phomotopy_homotopy_hset (fun x0 : A => 1)) x))
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
a: A

cxfib cx_isexact a = hfiber_pullback_along_pointed f (projection E) (grp_homo_unit f) (cxfib (phomotopy_homotopy_hset (fun x0 : A => 1)) a)
by apply path_sigma_hprop. Defined. (** ** The universal property of [abses_pullback_morphism] *) (** The natural map from the pulled back sequence. *)
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B

AbSESMorphism (abses_pullback f E) E
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B

AbSESMorphism (abses_pullback f E) E
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B

abses_pullback f E $-> E
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B
inclusion E $o grp_homo_id == ?component2 $o inclusion (abses_pullback f E)
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B
projection E $o ?component2 == f $o projection (abses_pullback f E)
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B

abses_pullback f E $-> E
apply grp_pullback_pr1.
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B

inclusion E $o grp_homo_id == grp_pullback_pr1 (projection E) f $o inclusion (abses_pullback f E)
reflexivity.
A, B, B': AbGroup
E: AbSES B A
f: B' $-> B

projection E $o grp_pullback_pr1 (projection E) f == f $o projection (abses_pullback f E)
apply pullback_commsq. Defined. (** Any map [f : E -> F] of short exact sequences factors (uniquely) through [abses_pullback F f3]. *)
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

AbSESMorphism E (abses_pullback (component3 f) F)
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

AbSESMorphism E (abses_pullback (component3 f) F)
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

E $-> abses_pullback (component3 f) F
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
inclusion (abses_pullback (component3 f) F) $o component1 f == ?component2 $o inclusion E
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
projection (abses_pullback (component3 f) F) $o ?component2 == grp_homo_id $o projection E
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

E $-> abses_pullback (component3 f) F
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

(fun x : E => projection F (component2 f x)) == (fun x : E => component3 f (projection E x))
apply right_square.
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

inclusion (abses_pullback (component3 f) F) $o component1 f == grp_pullback_corec (projection F) (component3 f) (component2 f) (projection E) (right_square f) $o inclusion E
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
x: A

(inclusion F (component1 f x); group_unit; cx_isexact (component1 f x) @ (grp_homo_unit (component3 f))^) = (component2 f (inclusion E x); projection E (inclusion E x); right_square f (inclusion E x))
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
x: A

inclusion F (component1 f x) = component2 f (inclusion E x)
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
x: A
group_unit = projection E (inclusion E x)
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
x: A

inclusion F (component1 f x) = component2 f (inclusion E x)
apply left_square.
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
x: A

group_unit = projection E (inclusion E x)
symmetry; apply iscomplex_abses.
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

projection (abses_pullback (component3 f) F) $o grp_pullback_corec (projection F) (component3 f) (component2 f) (projection E) (right_square f) == grp_homo_id $o projection E
reflexivity. Defined. (** The original map factors via the induced map. *)
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

f = absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f)
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

f = absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f)
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

issig_AbSESMorphism^-1 f = issig_AbSESMorphism^-1 (absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f))
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

(issig_AbSESMorphism^-1 f).1 = (issig_AbSESMorphism^-1 (absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f))).1
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

fst (issig_AbSESMorphism^-1 f).1 = fst (issig_AbSESMorphism^-1 (absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f))).1
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
snd (issig_AbSESMorphism^-1 f).1 = snd (issig_AbSESMorphism^-1 (absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f))).1
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F

fst (fst (issig_AbSESMorphism^-1 f).1) = fst (fst (issig_AbSESMorphism^-1 (absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f))).1)
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
snd (fst (issig_AbSESMorphism^-1 f).1) = snd (fst (issig_AbSESMorphism^-1 (absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f))).1)
H: Funext
A, B, X, Y: AbGroup
E: AbSES B A
F: AbSES Y X
f: AbSESMorphism E F
snd (issig_AbSESMorphism^-1 f).1 = snd (issig_AbSESMorphism^-1 (absesmorphism_compose (abses_pullback_morphism F (component3 f)) (abses_pullback_morphism_corec f))).1
all: by apply equiv_path_grouphomomorphism. Defined.
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id

E $== abses_pullback (component3 f) F
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id

E $== abses_pullback (component3 f) F
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id
g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)

E $== abses_pullback (component3 f) F
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id
g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)

abses_path_data E (abses_pullback (component3 f) F)
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id
g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)

component2 g $o inclusion E == inclusion (abses_pullback (component3 f) F)
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id
g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)
projection E == projection (abses_pullback (component3 f) F) $o component2 g
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id
g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)

component2 g $o inclusion E == inclusion (abses_pullback (component3 f) F)
exact (fun a => (left_square g a)^ @ ap _ (h a)).
A, B, B': AbGroup
E: AbSES B A
F: AbSES B' A
f: AbSESMorphism E F
h: component1 f == grp_homo_id
g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)

projection E == projection (abses_pullback (component3 f) F) $o component2 g
reflexivity. Defined. (** In particular, if [component1] of a morphism is the identity, then it exhibits the domain as the pullback of the codomain. *) Definition abses_pullback_component1_id `{Univalence} {A B B' : AbGroup} {E : AbSES B A} {F : AbSES B' A} (f : AbSESMorphism E F) (h : component1 f == grp_homo_id) : E = abses_pullback (component3 f) F := equiv_path_abses_iso (abses_pullback_component1_id' f h). (** For any two [E, F : AbSES B A] and [f, g : B' $-> B], there is a morphism [Ef + Fg -> E + F] induced by the universal properties of the pullbacks of E and F, respectively. *) Definition abses_directsum_pullback_morphism `{Funext} {A B B' C D D' : AbGroup@{u}} {E : AbSES B A} {F : AbSES D C} (f : B' $-> B) (g : D' $-> D) : AbSESMorphism (abses_direct_sum (abses_pullback f E) (abses_pullback g F)) (abses_direct_sum E F) := functor_abses_directsum (abses_pullback_morphism E f) (abses_pullback_morphism F g). (** For any two [E, F : AbSES B A] and [f, g : B' $-> B], we have (E + F)(f + g) = Ef + Eg, where + denotes the direct sum. *) Definition abses_directsum_distributive_pullbacks `{Univalence} {A B B' C D D' : AbGroup@{u}} {E : AbSES B A} {F : AbSES D C} (f : B' $-> B) (g : D' $-> D) : abses_pullback (functor_ab_biprod f g) (abses_direct_sum E F) = abses_direct_sum (abses_pullback f E) (abses_pullback g F) := (abses_pullback_component1_id (abses_directsum_pullback_morphism f g) (fun _ => idpath))^.
A, B, B': AbGroup
bt: B' $-> B
E: AbSES B A
F: AbSES B' A
p: abses_pullback bt E = F

{phi : F $-> E & projection E o phi == bt o projection F}
A, B, B': AbGroup
bt: B' $-> B
E: AbSES B A
F: AbSES B' A
p: abses_pullback bt E = F

{phi : F $-> E & projection E o phi == bt o projection F}
A, B, B': AbGroup
bt: B' $-> B
E: AbSES B A

{phi : abses_pullback bt E $-> E & (fun x : abses_pullback bt E => projection E (phi x)) == (fun x : abses_pullback bt E => bt (projection (abses_pullback bt E) x))}
A, B, B': AbGroup
bt: B' $-> B
E: AbSES B A
x: abses_pullback bt E

projection E (grp_pullback_pr1 (projection E) bt x) = bt (projection (abses_pullback bt E) x)
nrapply pullback_commsq. Defined. (** ** Functoriality of [abses_pullback f] for [f : B' $-> B] *) (** As any function, [abses_pullback f] acts on paths. By explicitly describing the analogous action on path data we get an action which computes, this turn out to be useful. *)
A, B, B': AbGroup
f: B' $-> B

Is0Functor (abses_pullback f)
A, B, B': AbGroup
f: B' $-> B

Is0Functor (abses_pullback f)
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

abses_pullback f E $-> abses_pullback f F
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

GroupIsomorphism (abses_pullback f E) (abses_pullback f F)
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
?proj1 $o inclusion (abses_pullback f E) == inclusion (abses_pullback f F)
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
projection (abses_pullback f E) == projection (abses_pullback f F) $o ?proj1
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

GroupIsomorphism (abses_pullback f E) (abses_pullback f F)
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

GroupIsomorphism B B
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
GroupIsomorphism E F
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
GroupIsomorphism B' B'
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
projection F o ?beta == ?alpha o projection E
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
?alpha o f == f o ?gamma
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

GroupIsomorphism E F
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
projection F o ?beta == grp_iso_id o projection E
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
grp_iso_id o f == f o grp_iso_id
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

projection F o p.1 == grp_iso_id o projection E
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
grp_iso_id o f == f o grp_iso_id
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

projection F o p.1 == grp_iso_id o projection E
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
x: E

projection F (p.1 x) = grp_iso_id (projection E x)
exact (snd p.2 x)^.
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

equiv_functor_grp_pullback (projection E) (projection F) f f grp_iso_id p.1 grp_iso_id ((fun x : E => (snd p.2 x)^) : projection F o p.1 == grp_iso_id o projection E) (fun x0 : B' => 1) $o inclusion (abses_pullback f E) == inclusion (abses_pullback f F)
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
x: A

(equiv_functor_grp_pullback (projection E) (projection F) f f grp_iso_id p.1 grp_iso_id (fun x : E => (snd p.2 x)^) (fun x0 : B' => 1) $o inclusion (abses_pullback f E)) x = inclusion (abses_pullback f F) x
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
x: A

p.1 (inclusion E x) = inclusion F x
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
x: A
group_unit = group_unit
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F
x: A

p.1 (inclusion E x) = inclusion F x
exact (fst p.2 x).
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E $-> F

projection (abses_pullback f E) == projection (abses_pullback f F) $o equiv_functor_grp_pullback (projection E) (projection F) f f grp_iso_id p.1 grp_iso_id ((fun x : E => (snd p.2 x)^) : projection F o p.1 == grp_iso_id o projection E) (fun x0 : B' => 1)
reflexivity. Defined.
A, B, B': AbGroup
f: B' $-> B

Is1Functor (abses_pullback f)
A, B, B': AbGroup
f: B' $-> B

Is1Functor (abses_pullback f)
A, B, B': AbGroup
f: B' $-> B

forall (a b : AbSES B A) (f0 g : a $-> b), f0 $== g -> fmap (abses_pullback f) f0 $== fmap (abses_pullback f) g
A, B, B': AbGroup
f: B' $-> B
forall a : AbSES B A, fmap (abses_pullback f) (Id a) $== Id (abses_pullback f a)
A, B, B': AbGroup
f: B' $-> B
forall (a b c : AbSES B A) (f0 : a $-> b) (g : b $-> c), fmap (abses_pullback f) (g $o f0) $== fmap (abses_pullback f) g $o fmap (abses_pullback f) f0
A, B, B': AbGroup
f: B' $-> B

forall (a b : AbSES B A) (f0 g : a $-> b), f0 $== g -> fmap (abses_pullback f) f0 $== fmap (abses_pullback f) g
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p, q: E $-> F
h: p $== q
x: abses_pullback f E

(fmap (abses_pullback f) p).1 x = (fmap (abses_pullback f) q).1 x
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p, q: E $-> F
h: p $== q
x: abses_pullback f E

p.1 (pullback_pr1 x) = q.1 (pullback_pr1 x)
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p, q: E $-> F
h: p $== q
x: abses_pullback f E
pullback_pr2 x = pullback_pr2 x
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p, q: E $-> F
h: p $== q
x: abses_pullback f E

p.1 (pullback_pr1 x) = q.1 (pullback_pr1 x)
exact (h _).
A, B, B': AbGroup
f: B' $-> B

forall a : AbSES B A, fmap (abses_pullback f) (Id a) $== Id (abses_pullback f a)
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
x: abses_pullback f E

(fmap (abses_pullback f) (Id E)).1 x = (Id (abses_pullback f E)).1 x
by srapply equiv_path_pullback_hset.
A, B, B': AbGroup
f: B' $-> B

forall (a b c : AbSES B A) (f0 : a $-> b) (g : b $-> c), fmap (abses_pullback f) (g $o f0) $== fmap (abses_pullback f) g $o fmap (abses_pullback f) f0
A, B, B': AbGroup
f: B' $-> B
E, F, G: AbSES B A
p: E $-> F
q: F $-> G
x: abses_pullback f E

(fmap (abses_pullback f) (q $o p)).1 x = (fmap (abses_pullback f) q $o fmap (abses_pullback f) p).1 x
by srapply equiv_path_pullback_hset. Defined.
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E = F

ap (abses_pullback f) p = equiv_path_abses_iso (fmap (abses_pullback f) (equiv_path_abses_iso^-1 p))
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: E = F

ap (abses_pullback f) p = equiv_path_abses_iso (fmap (abses_pullback f) (equiv_path_abses_iso^-1 p))
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

ap (abses_pullback f) 1 = equiv_path_abses_iso (fmap (abses_pullback f) (equiv_path_abses_iso^-1 1))
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

ap (abses_pullback f) 1 = equiv_path_abses_iso ?Goal0
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A
?Goal0 = fmap (abses_pullback f) (equiv_path_abses_iso^-1 1)
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E: AbSES B A

ap (abses_pullback f) 1 = equiv_path_abses_iso (Id (abses_pullback f E))
exact equiv_path_abses_1^. Defined.
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: abses_path_data_iso E F

ap (abses_pullback f) (equiv_path_abses_iso p) = equiv_path_abses_iso (fmap (abses_pullback f) p)
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: abses_path_data_iso E F

ap (abses_pullback f) (equiv_path_abses_iso p) = equiv_path_abses_iso (fmap (abses_pullback f) p)
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: abses_path_data_iso E F

equiv_path_abses_iso (fmap (abses_pullback f) (equiv_path_abses_iso^-1 (equiv_path_abses_iso p))) = equiv_path_abses_iso (fmap (abses_pullback f) p)
H: Univalence
A, B, B': AbGroup
f: B' $-> B
E, F: AbSES B A
p: abses_path_data_iso E F

equiv_path_abses_iso^-1 (equiv_path_abses_iso p) = p
apply eissect. Defined.
A, B, B': AbGroup
f: B' $-> B

abses_pullback f pt $== pt
A, B, B': AbGroup
f: B' $-> B

abses_pullback f pt $== pt
A, B, B': AbGroup
f: B' $-> B

GroupIsomorphism (abses_pullback f pt) pt
A, B, B': AbGroup
f: B' $-> B
?proj1 $o inclusion (abses_pullback f pt) == inclusion pt
A, B, B': AbGroup
f: B' $-> B
projection (abses_pullback f pt) == projection pt $o ?proj1
A, B, B': AbGroup
f: B' $-> B

GroupIsomorphism (abses_pullback f pt) pt
A, B, B': AbGroup
f: B' $-> B

GroupHomomorphism (abses_pullback f pt) pt
A, B, B': AbGroup
f: B' $-> B
IsEquiv ?grp_iso_homo
A, B, B': AbGroup
f: B' $-> B

GroupHomomorphism (abses_pullback f pt) pt
A, B, B': AbGroup
f: B' $-> B

abses_pullback f pt $-> A
A, B, B': AbGroup
f: B' $-> B
abses_pullback f pt $-> B'
A, B, B': AbGroup
f: B' $-> B

abses_pullback f pt $-> A
A, B, B': AbGroup
f: B' $-> B

abses_pullback f pt $-> ab_biprod A ?Goal
apply grp_pullback_pr1.
A, B, B': AbGroup
f: B' $-> B

abses_pullback f pt $-> B'
apply projection.
A, B, B': AbGroup
f: B' $-> B

IsEquiv (ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)))
A, B, B': AbGroup
f: B' $-> B

pt -> abses_pullback f pt
A, B, B': AbGroup
f: B' $-> B
ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)) o ?g == idmap
A, B, B': AbGroup
f: B' $-> B
?g o ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)) == idmap
A, B, B': AbGroup
f: B' $-> B

pt -> abses_pullback f pt
A, B, B': AbGroup
f: B' $-> B

pt $-> pt
A, B, B': AbGroup
f: B' $-> B
pt $-> B'
A, B, B': AbGroup
f: B' $-> B
projection pt o ?b == f o ?c
A, B, B': AbGroup
f: B' $-> B

pt $-> pt
exact (functor_ab_biprod grp_homo_id f).
A, B, B': AbGroup
f: B' $-> B

pt $-> B'
exact ab_biprod_pr2.
A, B, B': AbGroup
f: B' $-> B

projection pt o functor_ab_biprod grp_homo_id f == f o ab_biprod_pr2
reflexivity.
A, B, B': AbGroup
f: B' $-> B

ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)) o grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1) == idmap
reflexivity.
A, B, B': AbGroup
f: B' $-> B

grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1) o ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)) == idmap
A, B, B': AbGroup
f: B' $-> B
a: A
b: B
b': B'
c: projection pt (a, b) = f b'

grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1) (ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)) ((a, b); b'; c)) = ((a, b); b'; c)
A, B, B': AbGroup
f: B' $-> B
a: A
b: B
b': B'
c: projection pt (a, b) = f b'

(a, f b') = (a, b)
A, B, B': AbGroup
f: B' $-> B
a: A
b: B
b': B'
c: projection pt (a, b) = f b'
b' = b'
A, B, B': AbGroup
f: B' $-> B
a: A
b: B
b': B'
c: projection pt (a, b) = f b'

(a, f b') = (a, b)
exact (path_prod' idpath c^).
A, B, B': AbGroup
f: B' $-> B

{| grp_iso_homo := ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)); isequiv_group_iso := isequiv_adjointify (ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt))) (grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1)) (fun x0 : A * B' => 1) ((fun x : abses_pullback f pt => (fun proj1 : pt => (fun (a : A) (b : B) (proj2 : {c : B' & projection pt (a, b) = f c}) => (fun (b' : B') (c : projection pt (a, b) = f b') => equiv_path_pullback_hset (projection pt) f (grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1) (ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 ... f) (projection (...)) ((a, b); b'; c))) ((a, b); b'; c) (path_prod' 1 c^ : (grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (... => 1) (ab_biprod_corec ... ... ...)).1 = ((a, b); b'; c).1, 1 : ((grp_pullback_corec (...) f (...) ab_biprod_pr2 (...) (...)).2).1 = (((a, b); b'; c).2).1)) proj2.1 proj2.2) (fst proj1) (snd proj1)) x.1 x.2) : grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1) o ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)) == idmap) |} $o inclusion (abses_pullback f pt) == inclusion pt
reflexivity.
A, B, B': AbGroup
f: B' $-> B

projection (abses_pullback f pt) == projection pt $o {| grp_iso_homo := ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)); isequiv_group_iso := isequiv_adjointify (ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt))) (grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1)) (fun x0 : A * B' => 1) ((fun x : abses_pullback f pt => (fun proj1 : pt => (fun (a : A) (b : B) (proj2 : {c : B' & projection pt (a, b) = f c}) => (fun (b' : B') (c : projection pt (a, b) = f b') => equiv_path_pullback_hset (projection pt) f (grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1) (ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 ... f) (projection (...)) ((a, b); b'; c))) ((a, b); b'; c) (path_prod' 1 c^ : (grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (... => 1) (ab_biprod_corec ... ... ...)).1 = ((a, b); b'; c).1, 1 : ((grp_pullback_corec (...) f (...) ab_biprod_pr2 (...) (...)).2).1 = (((a, b); b'; c).2).1)) proj2.1 proj2.2) (fst proj1) (snd proj1)) x.1 x.2) : grp_pullback_corec (projection pt) f (functor_ab_biprod grp_homo_id f) ab_biprod_pr2 (fun x0 : A * B' => 1) o ab_biprod_corec (ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f) (projection (abses_pullback f pt)) == idmap) |}
reflexivity. Defined. Definition abses_pullback_point `{Univalence} {A B B' : AbGroup} (f : B' $-> B) : abses_pullback f pt = pt :> AbSES B' A := equiv_path_abses_iso (abses_pullback_point' f). Definition abses_pullback' {A B B' : AbGroup} (f : B' $-> B) : AbSES B A -->* AbSES B' A := Build_BasepointPreservingFunctor (abses_pullback f) (abses_pullback_point' f). (** Pullback of short exact sequences as a pointed map. *) Definition abses_pullback_pmap `{Univalence} {A B B' : AbGroup} (f : B' $-> B) : AbSES B A ->* AbSES B' A := to_pointed (abses_pullback' f). (** ** Functoriality of [abses_pullback] *) (** [abses_pullback] is psuedo-functorial, and we can state this in terms of actual homotopies or "path data homotopies." We decorate the latter with the suffix ('). *) (** For every [E : AbSES B A], the pullback of [E] along [id_B] is [E]. *)
H: Univalence
A, B: AbGroup

abses_pullback grp_homo_id == idmap
H: Univalence
A, B: AbGroup

abses_pullback grp_homo_id == idmap
H: Univalence
A, B: AbGroup
E: AbSES B A

abses_pullback grp_homo_id E = E
H: Univalence
A, B: AbGroup
E: AbSES B A

GroupIsomorphism (abses_pullback grp_homo_id E) E
H: Univalence
A, B: AbGroup
E: AbSES B A
?proj1 $o inclusion (abses_pullback grp_homo_id E) == inclusion E
H: Univalence
A, B: AbGroup
E: AbSES B A
projection (abses_pullback grp_homo_id E) == projection E $o ?proj1
H: Univalence
A, B: AbGroup
E: AbSES B A

{| grp_iso_homo := grp_pullback_pr1 (projection E) grp_homo_id; isequiv_group_iso := isequiv_pr1 (fun b : E => {c : B & projection E b = grp_homo_id c}) |} $o inclusion (abses_pullback grp_homo_id E) == inclusion E
H: Univalence
A, B: AbGroup
E: AbSES B A
projection (abses_pullback grp_homo_id E) == projection E $o {| grp_iso_homo := grp_pullback_pr1 (projection E) grp_homo_id; isequiv_group_iso := isequiv_pr1 (fun b : E => {c : B & projection E b = grp_homo_id c}) |}
H: Univalence
A, B: AbGroup
E: AbSES B A

projection (abses_pullback grp_homo_id E) == projection E $o {| grp_iso_homo := grp_pullback_pr1 (projection E) grp_homo_id; isequiv_group_iso := isequiv_pr1 (fun b : E => {c : B & projection E b = grp_homo_id c}) |}
H: Univalence
A, B: AbGroup
E: AbSES B A
a: E
p: B
q: projection E a = grp_homo_id p

p = projection E a
exact q^. Defined.
H: Univalence
A, B: AbGroup

abses_pullback_pmap grp_homo_id ==* pmap_idmap
H: Univalence
A, B: AbGroup

abses_pullback_pmap grp_homo_id ==* pmap_idmap
H: Univalence
A, B: AbGroup

abses_pullback_pmap grp_homo_id == pmap_idmap
H: Univalence
A, B: AbGroup
?p pt = dpoint_eq (abses_pullback_pmap grp_homo_id) @ (dpoint_eq pmap_idmap)^
H: Univalence
A, B: AbGroup

abses_pullback_id pt = dpoint_eq (abses_pullback_pmap grp_homo_id) @ (dpoint_eq pmap_idmap)^
H: Univalence
A, B: AbGroup

abses_pullback_id pt = dpoint_eq (abses_pullback_pmap grp_homo_id)
H: Univalence
A, B: AbGroup

({| grp_iso_homo := grp_pullback_pr1 (projection pt) grp_homo_id; isequiv_group_iso := isequiv_pr1 (fun b : pt => {c : B & projection pt b = grp_homo_id c}) |}; (fun x0 : A => 1, fun x : abses_pullback grp_homo_id pt => ((x.2).2)^)) = bp_pointed (abses_pullback' grp_homo_id)
H: Univalence
A, B: AbGroup

({| grp_iso_homo := grp_pullback_pr1 (projection pt) grp_homo_id; isequiv_group_iso := isequiv_pr1 (fun b : pt => {c : B & projection pt b = grp_homo_id c}) |}; (fun x0 : A => 1, fun x : abses_pullback grp_homo_id pt => ((x.2).2)^)).1 = (bp_pointed (abses_pullback' grp_homo_id)).1
H: Univalence
A, B: AbGroup

({| grp_iso_homo := grp_pullback_pr1 (projection pt) grp_homo_id; isequiv_group_iso := isequiv_pr1 (fun b : pt => {c : B & projection pt b = grp_homo_id c}) |}; (fun x0 : A => 1, fun x : abses_pullback grp_homo_id pt => ((x.2).2)^)).1 == (bp_pointed (abses_pullback' grp_homo_id)).1
H: Univalence
A, B: AbGroup
a: A
b, b': B
p: b = b'

(a, b) = (a, b')
by apply path_prod'. Defined.
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback f o abses_pullback g $=> abses_pullback (g $o f)
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback f o abses_pullback g $=> abses_pullback (g $o f)
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
E: AbSES B2 A

GroupIsomorphism (abses_pullback f (abses_pullback g E)) (abses_pullback (g $o f) E)
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
E: AbSES B2 A
?proj1 $o inclusion (abses_pullback f (abses_pullback g E)) == inclusion (abses_pullback (g $o f) E)
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
E: AbSES B2 A
projection (abses_pullback f (abses_pullback g E)) == projection (abses_pullback (g $o f) E) $o ?proj1
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
E: AbSES B2 A

GroupIsomorphism (abses_pullback f (abses_pullback g E)) (abses_pullback (g $o f) E)
apply equiv_grp_pullback_compose_r.
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
E: AbSES B2 A

equiv_grp_pullback_compose_r (projection E) f g $o inclusion (abses_pullback f (abses_pullback g E)) == inclusion (abses_pullback (g $o f) E)
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
E: AbSES B2 A
a: A

(equiv_grp_pullback_compose_r (projection E) f g $o inclusion (abses_pullback f (abses_pullback g E))) a = inclusion (abses_pullback (g $o f) E) a
by srapply equiv_path_pullback_hset.
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
E: AbSES B2 A

projection (abses_pullback f (abses_pullback g E)) == projection (abses_pullback (g $o f) E) $o equiv_grp_pullback_compose_r (projection E) f g
reflexivity. Defined. (** The analog of [abses_pullback_compose'] with actual homotopies. *) Definition abses_pullback_compose `{Univalence} {A B0 B1 B2 : AbGroup@{u}} (f : B0 $-> B1) (g : B1 $-> B2) : abses_pullback (A:=A) f o abses_pullback g == abses_pullback (g $o f) := fun x => equiv_path_abses_iso (abses_pullback_compose' f g x). (** We now work towards *pointed* composition of pullback ([abses_pullback_pcompose]). The proof of pointedness will matter when we later prove that pulling back along a short exact sequence is exact (i.e. that the complex [iscomplex_pullback_abses] below is exact). For this reason we carefully construct the proof of pointedness in terms of the analog [abses_pullback_pcompose'] on path data, which computes. *)
B0, B1, B2, A: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback' f $o* abses_pullback' g $=>* abses_pullback' (g $o f)
B0, B1, B2, A: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback' f $o* abses_pullback' g $=>* abses_pullback' (g $o f)
B0, B1, B2, A: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback_compose' f g pt $== bp_pointed (abses_pullback' f $o* abses_pullback' g) $@ (bp_pointed (abses_pullback' (g $o f)))^$
B0, B1, B2, A: AbGroup
f: B0 $-> B1
g: B1 $-> B2
a: A
b2: B2
b1: B1
c: b2 = g b1
b0: B0
c': b1 = f b0

(abses_pullback_compose' f g pt).1 (((a, b2); b1; c); b0; c') = (bp_pointed (abses_pullback' f $o* abses_pullback' g) $@ (bp_pointed (abses_pullback' (g $o f)))^$).1 (((a, b2); b1; c); b0; c')
B0, B1, B2, A: AbGroup
f: B0 $-> B1
g: B1 $-> B2
a: A
b2: B2
b1: B1
c: b2 = g b1
b0: B0
c': b1 = f b0

(a, b2) = (a, g (f b0))
B0, B1, B2, A: AbGroup
f: B0 $-> B1
g: B1 $-> B2
a: A
b2: B2
b1: B1
c: b2 = g b1
b0: B0
c': b1 = f b0
b0 = b0
B0, B1, B2, A: AbGroup
f: B0 $-> B1
g: B1 $-> B2
a: A
b2: B2
b1: B1
c: b2 = g b1
b0: B0
c': b1 = f b0

(a, b2) = (a, g (f b0))
exact (path_prod' idpath (c @ ap g c')). Defined.
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback_pmap f o* abses_pullback_pmap g ==* abses_pullback_pmap (g $o f)
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback_pmap f o* abses_pullback_pmap g ==* abses_pullback_pmap (g $o f)
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2

to_pointed (abses_pullback' f $o* abses_pullback' g) ==* abses_pullback_pmap (g $o f)
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2

abses_pullback' f $o* abses_pullback' g $=>* abses_pullback' (g $o f)
apply abses_pullback_pcompose'. Defined. (** *** Pulling back along constant maps *)
A, B, B': AbGroup

const pt $=> abses_pullback grp_homo_const
A, B, B': AbGroup

const pt $=> abses_pullback grp_homo_const
A, B, B': AbGroup
E: AbSES B A

const pt E $-> abses_pullback grp_homo_const E
A, B, B': AbGroup
E: AbSES B A

abses_path_data_iso (const pt E) (abses_pullback grp_homo_const E)
A, B, B': AbGroup
E: AbSES B A

abses_path_data (const pt E) (abses_pullback grp_homo_const E)
A, B, B': AbGroup
E: AbSES B A

GroupHomomorphism (grp_prod A B') (grp_pullback (projection E) (grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B')))
A, B, B': AbGroup
E: AbSES B A
(fun x : A => ?Goal (x, group_unit)) == (fun x : A => (inclusion E x; group_unit; cx_isexact x @ (group_cancelL group_unit group_unit mon_unit (((compose_sg_morphism (fun _ : B' => tt) (unit_name group_unit) (fun _ _ : B' => (grp_unit_l tt)^) (unit_name (unit_name (grp_unit_l group_unit)^)) mon_unit mon_unit)^ @ ap (fun _ : B' => group_unit) (monoid_left_id B' mon_unit)) @ (grp_unit_r group_unit)^))^))
A, B, B': AbGroup
E: AbSES B A
snd == (fun x : A * B' => pullback_pr2 (?Goal x))
A, B, B': AbGroup
E: AbSES B A

GroupHomomorphism (grp_prod A B') (grp_pullback (projection E) (grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B')))
A, B, B': AbGroup
E: AbSES B A

grp_prod A B' $-> E
A, B, B': AbGroup
E: AbSES B A
grp_prod A B' $-> B'
A, B, B': AbGroup
E: AbSES B A
projection E o ?b == grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B') o ?c
A, B, B': AbGroup
E: AbSES B A

grp_prod A B' $-> E
exact (inclusion _ $o ab_biprod_pr1).
A, B, B': AbGroup
E: AbSES B A

grp_prod A B' $-> B'
exact ab_biprod_pr2.
A, B, B': AbGroup
E: AbSES B A

projection E o (inclusion E $o ab_biprod_pr1) == grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B') o ab_biprod_pr2
A, B, B': AbGroup
E: AbSES B A
x: grp_prod A B'

projection E (inclusion E (fst x)) = group_unit
apply iscomplex_abses.
A, B, B': AbGroup
E: AbSES B A

(fun x : A => grp_pullback_corec (projection E) (grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B')) (inclusion E $o ab_biprod_pr1) ab_biprod_pr2 ((fun x0 : grp_prod A B' => (let X := fun E : AbSES' B A => pointed_fun (iscomplex_abses E) in X E (fst x0)) : projection E ((inclusion E $o ab_biprod_pr1) x0) = grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B') (ab_biprod_pr2 x0)) : projection E o (inclusion E $o ab_biprod_pr1) == grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B') o ab_biprod_pr2) (x, group_unit)) == (fun x : A => (inclusion E x; group_unit; cx_isexact x @ (group_cancelL group_unit group_unit mon_unit (((compose_sg_morphism (fun _ : B' => tt) (unit_name group_unit) (fun _ _ : B' => (grp_unit_l tt)^) (unit_name (unit_name (grp_unit_l group_unit)^)) mon_unit mon_unit)^ @ ap (fun _ : B' => group_unit) (monoid_left_id B' mon_unit)) @ (grp_unit_r group_unit)^))^))
A, B, B': AbGroup
E: AbSES B A
a: A

(inclusion E a; group_unit; iscomplex_abses E a) = (inclusion E a; group_unit; cx_isexact a @ (group_cancelL group_unit group_unit mon_unit (((compose_sg_morphism (fun _ : B' => tt) (unit_name group_unit) (fun _ _ : B' => (grp_unit_l tt)^) (unit_name (unit_name (grp_unit_l group_unit)^)) mon_unit mon_unit)^ @ ap (fun _ : B' => group_unit) (monoid_left_id B' mon_unit)) @ (grp_unit_r group_unit)^))^)
by srapply equiv_path_pullback_hset; split.
A, B, B': AbGroup
E: AbSES B A

snd == (fun x : A * B' => pullback_pr2 (grp_pullback_corec (projection E) (grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B')) (inclusion E $o ab_biprod_pr1) ab_biprod_pr2 ((fun x0 : grp_prod A B' => (let X := fun E : AbSES' B A => pointed_fun (iscomplex_abses E) in X E (fst x0)) : projection E ((inclusion E $o ab_biprod_pr1) x0) = grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B') (ab_biprod_pr2 x0)) : projection E o (inclusion E $o ab_biprod_pr1) == grp_homo_compose (grp_trivial_rec B) (grp_trivial_corec B') o ab_biprod_pr2) x))
reflexivity. Defined. Definition abses_pullback_const `{Univalence} {A B B' : AbGroup} : const pt == @abses_pullback A B B' grp_homo_const := fun x => (equiv_path_abses_iso (abses_pullback_const' x)).
A, B, B': AbGroup

pmap_abses_const $=>* abses_pullback' grp_homo_const
A, B, B': AbGroup

pmap_abses_const $=>* abses_pullback' grp_homo_const
A, B, B': AbGroup

pmap_abses_const $=> abses_pullback' grp_homo_const
A, B, B': AbGroup
(fun eta : pmap_abses_const $=> abses_pullback' grp_homo_const => eta pt $== bp_pointed pmap_abses_const $@ (bp_pointed (abses_pullback' grp_homo_const))^$) ?proj1
A, B, B': AbGroup

(fun eta : pmap_abses_const $=> abses_pullback' grp_homo_const => eta pt $== bp_pointed pmap_abses_const $@ (bp_pointed (abses_pullback' grp_homo_const))^$) abses_pullback_const'
A, B, B': AbGroup

abses_pullback_const' pt $== bp_pointed pmap_abses_const $@ (bp_pointed (abses_pullback' grp_homo_const))^$
intro x; reflexivity. Defined.
H: Univalence
A, B, B': AbGroup

pconst ==* abses_pullback_pmap grp_homo_const
H: Univalence
A, B, B': AbGroup

pconst ==* abses_pullback_pmap grp_homo_const
H: Univalence
A, B, B': AbGroup

to_pointed pmap_abses_const ==* abses_pullback_pmap grp_homo_const
H: Univalence
A, B, B': AbGroup

pmap_abses_const $=>* abses_pullback' grp_homo_const
exact abses_pullback_pconst'. Defined. (** *** Pulling [E] back along [projection E] is trivial *)
B, A: AbGroup
E: AbSES B A

AbSESMorphism (pt : AbSES E A) E
B, A: AbGroup
E: AbSES B A

AbSESMorphism (pt : AbSES E A) E
B, A: AbGroup
E: AbSES B A

pt $-> E
B, A: AbGroup
E: AbSES B A
inclusion E $o grp_homo_id == ?component2 $o inclusion pt
B, A: AbGroup
E: AbSES B A
projection E $o ?component2 == projection E $o projection pt
B, A: AbGroup
E: AbSES B A

pt $-> E
B, A: AbGroup
E: AbSES B A

GroupHomomorphism (grp_prod A E) E
exact (ab_biprod_rec (inclusion E) grp_homo_id).
B, A: AbGroup
E: AbSES B A

inclusion E $o grp_homo_id == (ab_biprod_rec (inclusion E) grp_homo_id : pt $-> E) $o inclusion pt
B, A: AbGroup
E: AbSES B A
x: A

inclusion E x = sg_op (inclusion E x) group_unit
exact (right_identity _)^.
B, A: AbGroup
E: AbSES B A

projection E $o (ab_biprod_rec (inclusion E) grp_homo_id : pt $-> E) == projection E $o projection pt
B, A: AbGroup
E: AbSES B A
a: A
e: E

projection E (sg_op (inclusion E a) e) = projection E e
B, A: AbGroup
E: AbSES B A
a: A
e: E

sg_op (projection E (inclusion E a)) (projection E e) = projection E e
B, A: AbGroup
E: AbSES B A
a: A
e: E

projection E (inclusion E a) = ?Goal
B, A: AbGroup
E: AbSES B A
a: A
e: E
sg_op ?Goal (projection E e) = projection E e
B, A: AbGroup
E: AbSES B A
a: A
e: E

sg_op (pconst a) (projection E e) = projection E e
apply left_identity. Defined. Definition abses_pullback_projection `{Univalence} {B A : AbGroup} (E : AbSES B A) : pt = abses_pullback (projection E) E := abses_pullback_component1_id (abses_pullback_projection_morphism E) (fun _ => idpath). (** *** Pulling back along homotopic maps *)
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'

abses_pullback f $=> abses_pullback f'
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'

abses_pullback f $=> abses_pullback f'
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

abses_pullback f E $-> abses_pullback f' E
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

GroupIsomorphism (abses_pullback f E) (abses_pullback f' E)
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
?proj1 $o inclusion (abses_pullback f E) == inclusion (abses_pullback f' E)
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
projection (abses_pullback f E) == projection (abses_pullback f' E) $o ?proj1
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

GroupIsomorphism (abses_pullback f E) (abses_pullback f' E)
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

GroupIsomorphism B' B'
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
GroupIsomorphism E E
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
GroupIsomorphism B B
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
projection E o ?beta == ?alpha o projection E
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
?alpha o f == f' o ?gamma
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

projection E o grp_iso_id == grp_iso_id o projection E
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
grp_iso_id o f == f' o grp_iso_id
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

grp_iso_id o f == f' o grp_iso_id
apply h.
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

equiv_functor_grp_pullback (projection E) (projection E) f f' grp_iso_id grp_iso_id grp_iso_id (fun x0 : E => 1) h $o inclusion (abses_pullback f E) == inclusion (abses_pullback f' E)
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A
a: A

(inclusion E a; group_unit; (1 @ ap idmap (cx_isexact a @ (grp_homo_unit f)^)) @ h group_unit) = (inclusion E a; group_unit; cx_isexact a @ (grp_homo_unit f')^)
by srapply equiv_path_pullback_hset; split.
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

projection (abses_pullback f E) == projection (abses_pullback f' E) $o equiv_functor_grp_pullback (projection E) (projection E) f f' grp_iso_id grp_iso_id grp_iso_id (fun x0 : E => 1) h
reflexivity. Defined.
H: Univalence
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'

abses_pullback f == abses_pullback f'
H: Univalence
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'

abses_pullback f == abses_pullback f'
H: Univalence
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

abses_pullback f E = abses_pullback f' E
H: Univalence
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
E: AbSES B' A

abses_path_data_iso (abses_pullback f E) (abses_pullback f' E)
exact (abses_pullback_homotopic' _ _ h _). Defined.
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'

abses_pullback' f $=>* abses_pullback' f'
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'

abses_pullback' f $=>* abses_pullback' f'
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'

(fun x : Pullback snd f => (pullback_pr1 x; pullback_pr2 x; (1 @ ap idmap (pullback_commsq snd f x)) @ h (pullback_pr2 x))) == (fun x : Pullback snd f => ((fst (pullback_pr1 x), f' (pullback_pr2 x)); pullback_pr2 x; 1))
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
a: A
b': B'
b: B
c: b' = f b

(pullback_pr1 ((a, b'); b; c); pullback_pr2 ((a, b'); b; c); (1 @ ap idmap (pullback_commsq snd f ((a, b'); b; c))) @ h (pullback_pr2 ((a, b'); b; c))) = ((fst (pullback_pr1 ((a, b'); b; c)), f' (pullback_pr2 ((a, b'); b; c))); pullback_pr2 ((a, b'); b; c); 1)
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
a: A
b': B'
b: B
c: b' = f b

(a, b') = (a, f' b)
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
a: A
b': B'
b: B
c: b' = f b
b = b
A, B, B': AbGroup
f, f': B $-> B'
h: f == f'
a: A
b': B'
b: B
c: b' = f b

(a, b') = (a, f' b)
exact (path_prod' idpath (c @ h b)). Defined. Definition abses_pullback_phomotopic `{Univalence} {A B B' : AbGroup} (f f' : B $-> B') (h : f == f') : abses_pullback_pmap (A:=A) f ==* abses_pullback_pmap f' := equiv_ptransformation_phomotopy (abses_pullback_phomotopic' f f' h). (** *** Pulling back along a complex *)
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

abses_pullback' f $o* abses_pullback' g $=>* pmap_abses_const
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

abses_pullback' f $o* abses_pullback' g $=>* pmap_abses_const
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

abses_pullback' (g $o f) $=>* pmap_abses_const
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

abses_pullback' grp_homo_const $=>* pmap_abses_const
exact abses_pullback_pconst'^*$. Defined.
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

IsComplex (abses_pullback_pmap g) (abses_pullback_pmap f)
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

IsComplex (abses_pullback_pmap g) (abses_pullback_pmap f)
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

abses_pullback_pmap f o* abses_pullback_pmap g ==* ?Goal
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const
?Goal ==* pconst
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

abses_pullback_pmap f o* abses_pullback_pmap g ==* to_pointed pmap_abses_const
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

to_pointed (abses_pullback' f $o* abses_pullback' g) ==* to_pointed pmap_abses_const
H: Univalence
A, B0, B1, B2: AbGroup
f: B0 $-> B1
g: B1 $-> B2
h: g $o f == grp_homo_const

abses_pullback' f $o* abses_pullback' g $=>* pmap_abses_const
by rapply iscomplex_abses_pullback'. Defined. (** A consequence is that pulling back along a short exact sequence forms a complex. *)
H: Univalence
A, B, C: AbGroup
E: AbSES C B

IsComplex (abses_pullback_pmap (projection E)) (abses_pullback_pmap (inclusion E))
H: Univalence
A, B, C: AbGroup
E: AbSES C B

IsComplex (abses_pullback_pmap (projection E)) (abses_pullback_pmap (inclusion E))
H: Univalence
A, B, C: AbGroup
E: AbSES C B

projection E $o inclusion E == grp_homo_const
rapply iscomplex_abses. Defined. (** In fact, pulling back along a short exact sequence is (purely) exact. See [AbSES.PullbackFiberSequence]. *) (** *** Fibers of pullback in terms of path data *) Definition equiv_hfiber_abses `{Univalence} {X : Type} {A B : AbGroup} (f : X -> AbSES B A) (E : AbSES B A) : graph_hfiber f E <~> hfiber f E := equiv_functor_sigma_id (fun _ => equiv_path_abses_iso). Definition hfiber_abses_path {A B B' : AbGroup} {f : B' $-> B} {X : AbSES B' A} (E F : graph_hfiber (abses_pullback f) X) := {p : E.1 $-> F.1 & (fmap (abses_pullback f) p)^$ $@ E.2 $-> F.2}.
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y
X1: AbSES B A
p: X0.1 = X1

transport (fun x : AbSES B A => abses_pullback f x $== Y) p X0.2 = fmap (abses_pullback f) (equiv_path_abses_iso^-1 p^) $@ X0.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y
X1: AbSES B A
p: X0.1 = X1

transport (fun x : AbSES B A => abses_pullback f x $== Y) p X0.2 = fmap (abses_pullback f) (equiv_path_abses_iso^-1 p^) $@ X0.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y

transport (fun x : AbSES B A => abses_pullback f x $== Y) 1 X0.2 = fmap (abses_pullback f) (equiv_path_abses_iso^-1 1^) $@ X0.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y

X0.2 = fmap (abses_pullback f) (equiv_path_abses_iso^-1 1^) $@ X0.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y

X0.2 = ?Goal0 $@ X0.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y
?Goal0 = fmap (abses_pullback f) (equiv_path_abses_iso^-1 1^)
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y

?Goal0 = fmap (abses_pullback f) (equiv_path_abses_iso^-1 1^)
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y

?Goal0 = fmap (abses_pullback f) (Id X0.1)
exact (fmap_id_strong _ _)^.
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
X0: graph_hfiber (abses_pullback f) Y

X0.2 = Id (abses_pullback f X0.1) $@ X0.2
exact (cat_idr_strong _)^. Defined.
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y

hfiber_abses_path U V <~> U = V
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y

hfiber_abses_path U V <~> U = V
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y

hfiber_abses_path U V <~> {p : U.1 = V.1 & transport (fun b : AbSES B A => abses_pullback f b $-> Y) p U.2 = V.2}
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

((fmap (abses_pullback f) p)^$ $@ U.2 $-> V.2) <~> transport (fun b : AbSES B A => abses_pullback f b $-> Y) (equiv_path_abses_iso p) U.2 = V.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

transport (fun b : AbSES B A => abses_pullback f b $-> Y) (equiv_path_abses_iso p) U.2 = ?Goal
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1
((fmap (abses_pullback f) p)^$ $@ U.2 $-> V.2) <~> ?Goal = V.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

transport (fun b : AbSES B A => abses_pullback f b $-> Y) (equiv_path_abses_iso p) U.2 = ?Goal
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

fmap (abses_pullback f) (equiv_path_abses_iso^-1 (equiv_path_abses_iso p)^) $@ U.2 = ?Goal
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

equiv_path_abses_iso^-1 (equiv_path_abses_iso p)^ = ?Goal1
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1
fmap (abses_pullback f) ?Goal1 $@ U.2 = ?Goal
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

equiv_path_abses_iso^-1 (equiv_path_abses_iso p)^ = ?Goal1
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

equiv_path_abses_iso^-1 (equiv_path_abses_iso (abses_path_data_inverse p)) = ?Goal1
apply eissect.
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

fmap (abses_pullback f) (abses_path_data_inverse p) $@ U.2 = ?Goal
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

fmap (abses_pullback f) (abses_path_data_inverse p) = ?Goal0
rapply gpd_strong_1functor_V.
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

((fmap (abses_pullback f) p)^$ $@ U.2 $-> V.2) <~> (fmap (abses_pullback f) p)^$ $@ U.2 = V.2
H: Univalence
A, B, B': AbGroup
f: B' $-> B
Y: AbSES B' A
U, V: graph_hfiber (abses_pullback f) Y
p: abses_path_data_iso U.1 V.1

((fmap (abses_pullback f) p)^$ $@ U.2 $-> V.2) <~> ((fmap (abses_pullback f) p)^$ $@ U.2).1 = (V.2).1
apply equiv_path_groupisomorphism. Defined. (** *** [AbSES] and [AbSES'] become contravariant functors in the first variable by pulling back *)
A: AbGroup

Is0Functor (fun B : AbGroup^op => AbSES' B A)
A: AbGroup

Is0Functor (fun B : AbGroup^op => AbSES' B A)
A: AbGroup

forall a b : AbGroup^op, (a $-> b) -> AbSES' a A $-> AbSES' b A
exact (fun _ _ f => abses_pullback f). Defined.
H: Univalence
A: AbGroup

Is1Functor (fun B : AbGroup^op => AbSES' B A)
H: Univalence
A: AbGroup

Is1Functor (fun B : AbGroup^op => AbSES' B A)
H: Univalence
A: AbGroup
a, b: AbGroup^op
f, g: a $-> b
X: f $== g

abses_pullback f == abses_pullback g
H: Univalence
A: AbGroup
a: AbGroup^op
abses_pullback grp_homo_id == idmap
H: Univalence
A: AbGroup
a, b, c: AbGroup^op
f: a $-> b
g: b $-> c
abses_pullback (grp_homo_compose f g) == (fun x : AbSES' a A => abses_pullback g (abses_pullback f x))
H: Univalence
A: AbGroup
a, b: AbGroup^op
f, g: a $-> b
X: f $== g

abses_pullback f == abses_pullback g
by apply abses_pullback_homotopic.
H: Univalence
A: AbGroup
a: AbGroup^op

abses_pullback grp_homo_id == idmap
apply abses_pullback_id.
H: Univalence
A: AbGroup
a, b, c: AbGroup^op
f: a $-> b
g: b $-> c

abses_pullback (grp_homo_compose f g) == (fun x : AbSES' a A => abses_pullback g (abses_pullback f x))
symmetry; apply abses_pullback_compose. Defined.
H: Univalence
A: AbGroup

Is0Functor (fun B : AbGroup^op => AbSES B A)
H: Univalence
A: AbGroup

Is0Functor (fun B : AbGroup^op => AbSES B A)
H: Univalence
A: AbGroup

forall a b : AbGroup^op, (a $-> b) -> AbSES a A $-> AbSES b A
exact (fun _ _ f => abses_pullback_pmap f). Defined.
H: Univalence
A: AbGroup

Is1Functor (fun B : AbGroup^op => AbSES B A)
H: Univalence
A: AbGroup

Is1Functor (fun B : AbGroup^op => AbSES B A)
H: Univalence
A: AbGroup
a, b: AbGroup^op
f, g: a $-> b
X: f $== g

abses_pullback_pmap f ==* abses_pullback_pmap g
H: Univalence
A: AbGroup
a: AbGroup^op
abses_pullback_pmap grp_homo_id ==* pmap_idmap
H: Univalence
A: AbGroup
a, b, c: AbGroup^op
f: a $-> b
g: b $-> c
abses_pullback_pmap (grp_homo_compose f g) ==* abses_pullback_pmap g o* abses_pullback_pmap f
H: Univalence
A: AbGroup
a, b: AbGroup^op
f, g: a $-> b
X: f $== g

abses_pullback_pmap f ==* abses_pullback_pmap g
by apply abses_pullback_phomotopic.
H: Univalence
A: AbGroup
a: AbGroup^op

abses_pullback_pmap grp_homo_id ==* pmap_idmap
apply abses_pullback_pmap_id.
H: Univalence
A: AbGroup
a, b, c: AbGroup^op
f: a $-> b
g: b $-> c

abses_pullback_pmap (grp_homo_compose f g) ==* abses_pullback_pmap g o* abses_pullback_pmap f
symmetry; apply abses_pullback_pcompose. Defined.