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]
(** * The contravariant six-term sequence of Ext *) (** We construct the contravariant six-term exact sequence of Ext groups associated to any short exact sequence [A -> E -> B] and coefficient group [G]. The existence of this exact sequence follows from the final result in [PullbackFiberSequence]. However, with that definition it becomes a bit tricky to show that the connecting map is given by pushing out [E]. Instead, we give a direct proof. As an application, we use the six-term exact sequence to show that [Ext Z/n A] is isomorphic to [A/n], for nonzero natural numbers [n]. (See [ext_cyclic_ab].) *) (** Exactness of [0 -> ab_hom B G -> ab_hom E G] follows from the rightmost map being an embedding. *)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (pconst : pUnit ->* ab_hom B G) (fmap10 ab_hom (projection E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (pconst : pUnit ->* ab_hom B G) (fmap10 ab_hom (projection E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsExact Identity.purely pconst (fmap10 ab_hom (projection E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A

pconst ==* ?Goal
H: Funext
B, A, G: AbGroup
E: AbSES B A
IsExact Identity.purely ?Goal (fmap10 ab_hom (projection E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A

pconst ==* grp_trivial_rec (ab_hom B G)
H: Funext
B, A, G: AbGroup
E: AbSES B A
IsEmbedding (fmap10 ab_hom (projection E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsEmbedding (fmap10 ab_hom (projection E) G)
exact _. (* [isembedding_precompose_surjection_ab] *) Defined. (** Exactness of [ab_hom B G -> ab_hom E G -> ab_hom A G]. One can also deduce this from [isexact_abses_pullback]. *)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (fmap10 ab_hom (projection E) G) (fmap10 ab_hom (inclusion E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (fmap10 ab_hom (projection E) G) (fmap10 ab_hom (inclusion E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsComplex (fmap10 ab_hom (projection E) G) (fmap10 ab_hom (inclusion E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A
IsConnMap (Tr (-1)) (cxfib ?cx_isexact)
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsComplex (fmap10 ab_hom (projection E) G) (fmap10 ab_hom (inclusion E) G)
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom B G

(fmap10 ab_hom (inclusion E) G o* fmap10 ab_hom (projection E) G) f = pconst f
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom B G
b: A

f (projection E (inclusion E b)) = group_unit
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom B G
b: A

projection E (inclusion E b) = mon_unit
apply isexact_inclusion_projection.
H: Funext
B, A, G: AbGroup
E: AbSES B A

IsConnMap (Tr (-1)) (cxfib (phomotopy_homotopy_hset ((fun f : ab_hom B G => let X := equiv_fun equiv_path_grouphomomorphism in X ((fun b : A => ap f (let X0 := fun a : AbSES' B A => cx_isexact in let X1 := fun a : AbSES' B A => pointed_fun (X0 a) in X1 E b) @ grp_homo_unit f : (fmap10 ab_hom (inclusion E) G o* fmap10 ab_hom (projection E) G) f b = pconst f b) : (fmap10 ab_hom (inclusion E) G o* fmap10 ab_hom (projection E) G) f == pconst f)) : fmap10 ab_hom (inclusion E) G o* fmap10 ab_hom (projection E) G == pconst)))
H: Funext
B, A, G: AbGroup
E: AbSES B A

forall b : pFiber.pfiber (fmap10 ab_hom (inclusion E) G), IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => let X := equiv_fun equiv_path_grouphomomorphism in X (fun b0 : A => ap f (let X0 := fun a : AbSES' B A => cx_isexact in let X1 := fun a : AbSES' B A => pointed_fun (X0 a) in X1 E b0) @ grp_homo_unit f)))) b)
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

Tr (-1) (hfiber (cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => let X := equiv_fun equiv_path_grouphomomorphism in X (fun b : A => ap f (let X0 := fun a : AbSES' B A => cx_isexact in let X1 := fun a : AbSES' B A => pointed_fun (X0 a) in X1 E b) @ grp_homo_unit f)))) (f; q))
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

ab_hom B G
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt
(fun x : ab_hom B G => cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => let X := equiv_fun equiv_path_grouphomomorphism in X (fun b : A => ap f (let X0 := fun a : AbSES' B A => cx_isexact in let X1 := fun a : AbSES' B A => pointed_fun (X0 a) in X1 E b) @ grp_homo_unit f))) x = (f; q)) ?proj1
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

ab_hom B G
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

GroupHomomorphism (ab_cokernel (inclusion E)) G
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

forall n : E, grp_image (inclusion E) n -> f n = mon_unit
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt
e: E

{a : A & inclusion E a = e} -> f e = mon_unit
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt
e: E
b: A
r: inclusion E b = e

f e = mon_unit
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt
e: E
b: A
r: inclusion E b = e

f (inclusion E b) = mon_unit
exact (equiv_path_grouphomomorphism^-1 q _).
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

(fun x : ab_hom B G => cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => let X := equiv_fun equiv_path_grouphomomorphism in X (fun b : A => ap f (let X0 := fun a : AbSES' B A => cx_isexact in let X1 := fun a : AbSES' B A => pointed_fun (X0 a) in X1 E b) @ grp_homo_unit f))) x = (f; q)) (grp_homo_compose (quotient_abgroup_rec (grp_image (inclusion E)) G f (fun e : E => Trunc_ind (fun _ : Trunc (-1) {a : A & inclusion E a = e} => f e = mon_unit) (fun a : {a : A & inclusion E a = e} => (fun (b : A) (r : inclusion E b = e) => ap f r^ @ equiv_path_grouphomomorphism^-1 q b) a.1 a.2))) (abses_cokernel_iso (inclusion E) (projection E))^-1$)
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => let X := equiv_fun equiv_path_grouphomomorphism in X (fun b : A => ap f (let X0 := fun a : AbSES' B A => cx_isexact in let X1 := fun a : AbSES' B A => pointed_fun (X0 a) in X1 E b) @ grp_homo_unit f))) (grp_homo_compose (quotient_abgroup_rec (grp_image (inclusion E)) G f (fun e : E => Trunc_ind (fun _ : Trunc (-1) {a : A & inclusion E a = e} => f e = mon_unit) (fun a : {a : A & inclusion E a = e} => ap f (a.2)^ @ equiv_path_grouphomomorphism^-1 q a.1))) (abses_cokernel_iso (inclusion E) (projection E))^-1$) = (f; q)
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

(cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => let X := equiv_fun equiv_path_grouphomomorphism in X (fun b : A => ap f (let X0 := fun a : AbSES' B A => cx_isexact in let X1 := fun a : AbSES' B A => pointed_fun (X0 a) in X1 E b) @ grp_homo_unit f))) (grp_homo_compose (quotient_abgroup_rec (grp_image (inclusion E)) G f (fun e : E => Trunc_ind (fun _ : Trunc (-1) {a : A & inclusion E a = e} => f e = mon_unit) (fun a : {a : A & inclusion E a = e} => ap f (a.2)^ @ equiv_path_grouphomomorphism^-1 q a.1))) (abses_cokernel_iso (inclusion E) (projection E))^-1$)).1 = (f; q).1
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt

(cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => equiv_path_grouphomomorphism (fun b : A => ap f (cx_isexact b) @ grp_homo_unit f))) (grp_homo_compose (quotient_abgroup_rec (grp_image (inclusion E)) G f (fun e : E => Trunc_ind (fun _ : Trunc (-1) {a : A & inclusion E a = e} => f e = mon_unit) (fun a : {a : A & inclusion E a = e} => ap f (a.2)^ @ equiv_path_grouphomomorphism^-1 q a.1))) (abses_cokernel_iso (inclusion E) (projection E))^-1$)).1 == f
H: Funext
B, A, G: AbGroup
E: AbSES B A
f: ab_hom E G
q: fmap10 ab_hom (inclusion E) G f = pt
x: E

(cxfib (phomotopy_homotopy_hset (fun f : ab_hom B G => equiv_path_grouphomomorphism (fun b : A => ap f (cx_isexact b) @ grp_homo_unit f))) (grp_homo_compose (quotient_abgroup_rec (grp_image (inclusion E)) G f (fun e : E => Trunc_ind (fun _ : Trunc (-1) {a : A & inclusion E a = e} => f e = mon_unit) (fun a : {a : A & inclusion E a = e} => ap f (a.2)^ @ equiv_path_grouphomomorphism^-1 q a.1))) (abses_cokernel_iso (inclusion E) (projection E))^-1$)).1 x = f x
exact (ap (quotient_abgroup_rec _ _ f _) (abses_cokernel_iso_inv_beta _ _ _)). Defined. (** *** Exactness of [ab_hom E G -> ab_hom A G -> Ext B G] *) (** If a pushout [abses_pushout alpha E] is trivial, then [alpha] factors through [inclusion E]. *)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A

abses_pushout alpha E = pt -> {phi : E $-> A' & alpha = phi $o inclusion E}
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A

abses_pushout alpha E = pt -> {phi : E $-> A' & alpha = phi $o inclusion E}
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
p: abses_path_data (abses_pushout alpha E) pt

{phi : E $-> A' & alpha = phi $o inclusion E}
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi

{phi : E $-> A' & alpha = phi $o inclusion E}
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi

alpha = ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

alpha a = (ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E) a
(* We embed into the biproduct and prove equality there. *)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

ab_biprod_inl (alpha a) = ab_biprod_inl ((ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E) a)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

(phi $o inclusion (abses_pushout alpha E)) (alpha a) = ab_biprod_inl ((ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E) a)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

inclusion (abses_pushout alpha E) (alpha a) = ?Goal
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A
phi ?Goal = ab_biprod_inl ((ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E) a)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

phi ((component2 (abses_pushout_morphism E alpha) $o inclusion E) a) = ab_biprod_inl ((ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E) a)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

snd (phi ((component2 (abses_pushout_morphism E alpha) $o inclusion E) a)) = grp_homo_const ((ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E) a)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

projection (abses_pushout alpha E) ((component2 (abses_pushout_morphism E alpha) $o inclusion E) a) = grp_homo_const ((ab_biprod_pr1 $o phi $o ab_pushout_inr $o inclusion E) a)
H: Univalence
B, A, A': AbGroup
alpha: A $-> A'
E: AbSES B A
phi: GroupHomomorphism (abses_pushout alpha E) pt
p: phi $o inclusion (abses_pushout alpha E) == inclusion pt
q: projection (abses_pushout alpha E) == projection pt $o phi
a: A

projection E (inclusion E a) = group_unit
apply isexact_inclusion_projection. Defined.
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (fmap10 ab_hom (inclusion E) G) (abses_pushout_ext E)
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (fmap10 ab_hom (inclusion E) G) (abses_pushout_ext E)
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsComplex (fmap10 ab_hom (inclusion E) G) (abses_pushout_ext E)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
IsConnMap (Tr (-1)) (cxfib ?cx_isexact)
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsComplex (fmap10 ab_hom (inclusion E) G) (abses_pushout_ext E)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom E G

tr (abses_pushout (grp_homo_compose g (inclusion E)) E) = tr ispointed_abses
(* this equation holds purely *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom E G

abses_pushout (grp_homo_compose g (inclusion E)) E = ispointed_abses
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom E G

abses_pushout (inclusion E) E = ?Goal
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom E G
abses_pushout g ?Goal = ispointed_abses
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom E G

abses_pushout g pt = ispointed_abses
apply abses_pushout_point.
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsConnMap (Tr (-1)) (cxfib (phomotopy_homotopy_hset ((fun g : ab_hom E G => ap tr ((abses_pushout_compose (inclusion E) g E @ ap (abses_pushout g) (abses_pushout_inclusion E)) @ abses_pushout_point g) : (abses_pushout_ext E o* fmap10 ab_hom (inclusion E) G) g = pconst g) : abses_pushout_ext E o* fmap10 ab_hom (inclusion E) G == pconst)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_hom A G
p: abses_pushout_ext E F = pt

IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom E G => ap tr ((abses_pushout_compose (inclusion E) g E @ ap (abses_pushout g) (abses_pushout_inclusion E)) @ abses_pushout_point g)))) (F; p))
(* since we are proving a proposition, we may convert [p] to an actual path *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_hom A G
p: abses_pushout_ext E F = pt
p': Tr (-1) (fmap ((AbSES' : AbGroup^op -> AbGroup -> Type) B) F E = pt)

IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom E G => ap tr ((abses_pushout_compose (inclusion E) g E @ ap (abses_pushout g) (abses_pushout_inclusion E)) @ abses_pushout_point g)))) (F; p))
(* slightly faster than [strip_truncations]: *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_hom A G
p: abses_pushout_ext E F = pt
p': fmap ((AbSES' : AbGroup^op -> AbGroup -> Type) B) F E = pt

IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom E G => ap tr ((abses_pushout_compose (inclusion E) g E @ ap (abses_pushout g) (abses_pushout_inclusion E)) @ abses_pushout_point g)))) (F; p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_hom A G
p: abses_pushout_ext E F = pt
p': fmap ((AbSES' : AbGroup^op -> AbGroup -> Type) B) F E = pt

hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom E G => ap tr ((abses_pushout_compose (inclusion E) g E @ ap (abses_pushout g) (abses_pushout_inclusion E)) @ abses_pushout_point g)))) (F; p)
(* now we construct a preimage *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_hom A G
p: abses_pushout_ext E F = pt
p': fmap ((AbSES' : AbGroup^op -> AbGroup -> Type) B) F E = pt
g: E $-> G
k: F = g $o inclusion E

hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom E G => ap tr ((abses_pushout_compose (inclusion E) g E @ ap (abses_pushout g) (abses_pushout_inclusion E)) @ abses_pushout_point g)))) (F; p)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_hom A G
p: abses_pushout_ext E F = pt
p': fmap ((AbSES' : AbGroup^op -> AbGroup -> Type) B) F E = pt
g: E $-> G
k: F = g $o inclusion E

cxfib (phomotopy_homotopy_hset (fun g : ab_hom E G => ap tr ((abses_pushout_compose (inclusion E) g E @ ap (abses_pushout g) (abses_pushout_inclusion E)) @ abses_pushout_point g))) g = (F; p)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_hom A G
p: abses_pushout_ext E F = pt
p': fmap ((AbSES' : AbGroup^op -> AbGroup -> Type) B) F E = pt
g: E $-> G
k: F = g $o inclusion E

grp_homo_compose g (inclusion E) = F
exact k^. Defined. (** *** Exactness of [ab_hom A G -> Ext1 B G -> Ext1 E G]. *) (** We construct a morphism which witnesses exactness. *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt

AbSESMorphism E F
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt

AbSESMorphism E F
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

AbSESMorphism E F
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

A $-> G
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
E $-> F
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
inclusion F $o ?component1 == ?component2 $o inclusion E
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
projection F $o ?component2 == grp_homo_id $o projection E
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

A $-> G
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

GroupHomomorphism A (ab_kernel (projection F))
(* now it's easy to construct map into the kernel *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

A $-> F
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
projection F $o ?g == grp_homo_const
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

projection F $o (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr $o inclusion E) == grp_homo_const
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
x: A

(projection F $o (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr $o inclusion E)) x = grp_homo_const x
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
x: A

(component3 (abses_pullback_morphism F (projection E)) $o projection (abses_pullback (projection E) F)) (p' (ab_biprod_inr (inclusion E x))) = grp_homo_const x
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
x: A

projection E (inclusion E x) = group_unit
apply isexact_inclusion_projection.
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

E $-> F
exact (grp_pullback_pr1 _ _ $o p' $o ab_biprod_inr).
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

inclusion F $o grp_homo_compose (grp_iso_inverse (abses_kernel_iso (inclusion F) (projection F))) (grp_kernel_corec (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr $o inclusion E) ((fun x : A => right_square (abses_pullback_morphism F (projection E)) (p' (ab_biprod_inr (inclusion E x))) @ (ap (projection E) (pr (ab_biprod_inr (inclusion E x)))^ @ ((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) : projection E (projection pt (ab_biprod_inr (inclusion E x))) = grp_homo_const x))) : projection F $o (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr $o inclusion E) == grp_homo_const)) == grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr $o inclusion E
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
a: A

(inclusion F $o grp_homo_compose (grp_iso_inverse (abses_kernel_iso (inclusion F) (projection F))) (grp_kernel_corec (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr $o inclusion E) (fun x : A => right_square (abses_pullback_morphism F (projection E)) (p' (ab_biprod_inr (inclusion E x))) @ (ap (projection E) (pr (ab_biprod_inr (inclusion E x)))^ @ (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))))) a = (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr $o inclusion E) a
nrapply abses_kernel_iso_inv_beta.
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'

projection F $o (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr) == grp_homo_id $o projection E
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
e: E

(projection F $o (grp_pullback_pr1 (projection F) (projection E) $o p' $o ab_biprod_inr)) e = (grp_homo_id $o projection E) e
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
p': GroupHomomorphism pt (abses_pullback (projection E) F)
pl: p' $o inclusion pt == inclusion (abses_pullback (projection E) F)
pr: projection pt == projection (abses_pullback (projection E) F) $o p'
e: E

projection (abses_pullback (projection E) F) (p' (ab_biprod_inr e)) = e
exact (pr _)^. Defined.
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (abses_pushout_ext E) (fmap (pTr 0) (abses_pullback_pmap (projection E)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (abses_pushout_ext E) (fmap (pTr 0) (abses_pullback_pmap (projection E)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsComplex (abses_pushout_ext E) (fmap (pTr 0) (abses_pullback_pmap (projection E)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
IsConnMap (Tr (-1)) (cxfib ?cx_isexact)
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsComplex (abses_pushout_ext E) (fmap (pTr 0) (abses_pullback_pmap (projection E)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom A G

tr (abses_pullback (projection E) (abses_pushout g E)) = tr ispointed_abses
(* this equation holds purely *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom A G

abses_pullback (projection E) (abses_pushout g E) = ispointed_abses
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom A G

abses_pullback (projection E) E = ?Goal
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom A G
abses_pushout g ?Goal = ispointed_abses
H: Univalence
B, A, G: AbGroup
E: AbSES B A
g: ab_hom A G

abses_pushout g pt = ispointed_abses
apply abses_pushout_point. (* since we are proving a proposition, we may convert [p] to an actual path *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsConnMap (Tr (-1)) (cxfib (phomotopy_homotopy_hset ((fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g) : (fmap (pTr 0) (abses_pullback_pmap (projection E)) o* abses_pushout_ext E) g = pconst g) : fmap (pTr 0) (abses_pullback_pmap (projection E)) o* abses_pushout_ext E == pconst)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: ab_ext B G
p: fmap (pTr 0) (abses_pullback_pmap (projection E)) F = pt

IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (F; p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A

forall aa : Trunc 0 (AbSES B G), IsHSet (forall p : fmap (pTr 0) (abses_pullback_pmap (projection E)) aa = pt, IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (aa; p)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
forall (a : AbSES B G) (p : fmap (pTr 0) (abses_pullback_pmap (projection E)) (tr a) = pt), IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (tr a; p))
(* [exact _.] works here, but is slow. *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A

forall aa : Trunc 0 (AbSES B G), IsHSet (forall p : fmap (pTr 0) (abses_pullback_pmap (projection E)) aa = pt, IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (aa; p)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
x: Trunc 0 (AbSES B G)

forall a : fmap (pTr 0) (abses_pullback_pmap (projection E)) x = pt, IsHSet (IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (x; a)))
intro y; rapply (istrunc_leq (trunc_index_leq_succ _)).
H: Univalence
B, A, G: AbGroup
E: AbSES B A

forall (a : AbSES B G) (p : fmap (pTr 0) (abses_pullback_pmap (projection E)) (tr a) = pt), IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (tr a; p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G

forall p : fmap (pTr 0) (abses_pullback_pmap (projection E)) (tr F) = pt, IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (tr F; p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: Tr (-1) (abses_pullback (projection E) F = pt)

IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (tr F; equiv_path_Tr (abses_pullback (projection E) F) pt p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt

IsConnected (Tr (-1)) (hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (tr F; equiv_path_Tr (abses_pullback (projection E) F) pt (tr p)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt

hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (tr F; equiv_path_Tr (abses_pullback (projection E) F) pt (tr p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
g:= isexact_ext_contra_sixterm_iv_mor E F p: AbSESMorphism E F

hfiber (cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g)))) (tr F; equiv_path_Tr (abses_pullback (projection E) F) pt (tr p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
g:= isexact_ext_contra_sixterm_iv_mor E F p: AbSESMorphism E F

cxfib (phomotopy_homotopy_hset (fun g : ab_hom A G => ap tr (((abses_pushout_pullback_reorder E g (projection E))^ @ ap (abses_pushout g) (abses_pullback_projection E)^) @ abses_pushout_point g))) (component1 g) = (tr F; equiv_path_Tr (abses_pullback (projection E) F) pt (tr p))
H: Univalence
B, A, G: AbGroup
E: AbSES B A
F: AbSES B G
p: abses_pullback (projection E) F = pt
g:= isexact_ext_contra_sixterm_iv_mor E F p: AbSESMorphism E F

fmap ((AbSES' : AbGroup^op -> AbGroup -> Type) B) (component1 g) E = F
by rapply (abses_pushout_component3_id g). Defined. (** *** Exactness of [Ext B G -> Ext E G -> Ext A G] *) (** This is an immediate consequence of [isexact_abses_pullback]. *)
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (fmap (pTr 0) (abses_pullback_pmap (projection E))) (fmap (pTr 0) (abses_pullback_pmap (inclusion E)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (fmap (pTr 0) (abses_pullback_pmap (projection E))) (fmap (pTr 0) (abses_pullback_pmap (inclusion E)))
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsExact (Tr (-1)) (abses_pullback_pmap (projection E)) (abses_pullback_pmap (inclusion E))
rapply isexact_purely_O. Defined. (** *** [Ext Z/n A] is isomorphic to [A/n] *) (** An easy consequence of the contravariant six-term exact sequence is that [Ext Z/n A] is isomorphic to the cokernel of the multiplication-by-n endomorphism [A -> A], for any abelian group [A]. This falls out of the six-term exact sequence associated to [Z -> Z -> Z/n] and projectivity of [Z]. A minor point is that the library does not currently contain a proof that multiplication by a nonzero natural number is a self-injection of [Z]. Thus we work directly with the assumption that [Z1_mul_nat n] is an embedding. *) (** We define our own cyclic groups using [ab_cokernel_embedding] under the assumption that [Z1_mul_nat n] is an embedding. *) Definition cyclic' `{Funext} (n : nat) `{IsEmbedding (Z1_mul_nat n)} : AbGroup := ab_cokernel_embedding (Z1_mul_nat n). (** We first show that [ab_hom Z A -> ab_hom Z A -> Ext (cyclic n) A] is exact. We could inline the proof below, but factoring it out is faster. *) Local Definition isexact_ext_cyclic_ab_iii@{u v w | u < v, v < w} `{Univalence} (n : nat) `{IsEmbedding (Z1_mul_nat n)} {A : AbGroup@{u}} : IsExact (Tr (-1)) (fmap10 (A:=Group^op) ab_hom (Z1_mul_nat n) A) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n))) := isexact_ext_contra_sixterm_iii (abses_from_inclusion (Z1_mul_nat n)). (** We show exactness of [A -> A -> Ext Z/n A] where the first map is multiplication by [n], but considered in universe [v]. *)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

IsExact (Tr (-1)) (ab_mul_nat n) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)) o* (equiv_Z1_hom A)^-1*)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

IsExact (Tr (-1)) (ab_mul_nat n) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)) o* (equiv_Z1_hom A)^-1*)
(* we first move [equiv_Z1_hom] across the total space *)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

IsExact (Tr (-1)) ((equiv_Z1_hom A)^-1* o* ab_mul_nat n) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)))
(* now we change the left map so as to apply exactness at iii from above *)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

A ->* ab_hom ab_Z1 A
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
(equiv_Z1_hom A)^-1* o* ab_mul_nat n ==* ?i
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
IsExact (Tr (-1)) ?i (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)))
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

(equiv_Z1_hom A)^-1* o* ab_mul_nat n ==* fmap10 ab_hom (Z1_mul_nat n) A o* pequiv_inverse (equiv_Z1_hom A)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
IsExact (Tr (-1)) (fmap10 ab_hom (Z1_mul_nat n) A o* pequiv_inverse (equiv_Z1_hom A)) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)))
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

(equiv_Z1_hom A)^-1* o* ab_mul_nat n ==* fmap10 ab_hom (Z1_mul_nat n) A o* pequiv_inverse (equiv_Z1_hom A)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

(equiv_Z1_hom A)^-1* o* ab_mul_nat n == fmap10 ab_hom (Z1_mul_nat n) A o* pequiv_inverse (equiv_Z1_hom A)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
f: ab_hom ab_Z1 A

((equiv_Z1_hom A)^-1* o* ab_mul_nat n) (equiv_Z1_hom A f) = (fmap10 ab_hom (Z1_mul_nat n) A o* pequiv_inverse (equiv_Z1_hom A)) (equiv_Z1_hom A f)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
f: ab_hom ab_Z1 A

((equiv_Z1_hom A)^-1* o* ab_mul_nat n) (equiv_Z1_hom A f) = fmap10 ab_hom (Z1_mul_nat n) A f
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
f: ab_hom ab_Z1 A

equiv_Z1_hom A (fmap10 ab_hom (Z1_mul_nat n) A f) = ab_mul_nat n (equiv_Z1_hom A f)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
f: ab_hom ab_Z1 A

Z1_mul_nat n (freegroup_eta (FreeGroup.word_sing Unit (inl tt))) = ?Goal
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
f: ab_hom ab_Z1 A
f ?Goal = ab_mul_nat n (equiv_Z1_hom A f)
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup
f: ab_hom ab_Z1 A

f (nat_to_Z1 n) = ab_mul_nat n (equiv_Z1_hom A f)
exact (ab_mul_nat_homo f n Z1_gen).
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

IsExact (Tr (-1)) (fmap10 ab_hom (Z1_mul_nat n) A o* pequiv_inverse (equiv_Z1_hom A)) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)))
H: Univalence
n: nat
IsEmbedding0: IsEmbedding (Z1_mul_nat n)
A: AbGroup

IsExact (Tr (-1)) (fmap10 ab_hom (Z1_mul_nat n) A) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)))
apply isexact_ext_cyclic_ab_iii. Defined. (** The main result of this section. *)
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup

ab_cokernel (ab_mul_nat n) $<~> ab_ext (cyclic' n) A
(* We take a large cokernel in order to apply [abses_cokernel_iso]. *)
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup

ab_cokernel (ab_mul_nat n) $<~> ab_ext (cyclic' n) A
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

ab_cokernel (ab_mul_nat n) $<~> ab_ext (cyclic' n) A
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

GroupHomomorphism A (ab_ext (cyclic' n) A)
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1
IsConnMap (Tr (-1)) ?g
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1
IsExact (Tr (-1)) (ab_mul_nat n) ?g
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

GroupHomomorphism A (ab_ext (cyclic' n) A)
exact (grp_homo_compose (abses_pushout_ext E) (grp_iso_inverse (equiv_Z1_hom A))).
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

IsConnMap (Tr (-1)) (grp_homo_compose (abses_pushout_ext E) (grp_iso_inverse (equiv_Z1_hom A)))
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

IsConnMap (Tr (-1)) (grp_iso_inverse (equiv_Z1_hom A))
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1
IsConnMap (Tr (-1)) (abses_pushout_ext E)
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

IsConnMap (Tr (-1)) (abses_pushout_ext E)
(* Coq knows that [Ext Z1 A] is contractible since [Z1] is projective, so exactness at spot iv gives us this: *) exact (isconnmap_O_isexact_base_contr _ _ (fmap (pTr 0) (abses_pullback_pmap (A:=A) (projection E)))).
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

IsExact (Tr (-1)) (ab_mul_nat n) (grp_homo_compose (abses_pushout_ext E) (grp_iso_inverse (equiv_Z1_hom A)))
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

A ->* ab_ext (cyclic' n) A
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1
grp_homo_compose (abses_pushout_ext E) (grp_iso_inverse (equiv_Z1_hom A)) ==* ?f
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1
IsExact (Tr (-1)) (ab_mul_nat n) ?f
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

grp_homo_compose (abses_pushout_ext E) (grp_iso_inverse (equiv_Z1_hom A)) ==* abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)) o* (equiv_Z1_hom A)^-1*
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1
IsExact (Tr (-1)) (ab_mul_nat n) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)) o* (equiv_Z1_hom A)^-1*)
H: Univalence
n: nat
emb: IsEmbedding (Z1_mul_nat n)
A: AbGroup
E:= abses_from_inclusion (Z1_mul_nat n): AbSES (QuotientAbGroup ab_Z1 (grp_image_embedding (Z1_mul_nat n))) ab_Z1

IsExact (Tr (-1)) (ab_mul_nat n) (abses_pushout_ext (abses_from_inclusion (Z1_mul_nat n)) o* (equiv_Z1_hom A)^-1*)
apply ext_cyclic_exact. Defined.