Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
(** * 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. *)
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 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
((funf : ab_hom B G =>
letX :=
equiv_fun equiv_path_grouphomomorphism in
X
((funb : A =>
ap f
(letX0 :=
funa : AbSES' B A => cx_isexact inletX1 :=
funa : 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
forallb : pFiber.pfiber (fmap10 ab_hom (inclusion E) G),
IsConnected (Tr (-1))
(hfiber
(cxfib
(phomotopy_homotopy_hset
(funf : ab_hom B G =>
letX :=
equiv_fun equiv_path_grouphomomorphism
in
X
(funb0 : A =>
ap f
(letX0 :=
funa : AbSES' B A => cx_isexact
inletX1 :=
funa : 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
(funf : ab_hom B G =>
letX :=
equiv_fun equiv_path_grouphomomorphism
in
X
(funb : A =>
ap f
(letX0 :=
funa : AbSES' B A => cx_isexact
inletX1 :=
funa : 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
(funx : ab_hom B G =>
cxfib
(phomotopy_homotopy_hset
(funf : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism
in
X
(funb : A =>
ap f
(letX0 :=
funa : AbSES' B A => cx_isexact inletX1 :=
funa : 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
foralln : 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
{x : A & inclusion E x = 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
(funx : ab_hom B G =>
cxfib
(phomotopy_homotopy_hset
(funf : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism
in
X
(funb : A =>
ap f
(letX0 :=
funa : AbSES' B A => cx_isexact inletX1 :=
funa : 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
(fune : E =>
Trunc_ind
(fun_ : Trunc (-1)
{x : A & inclusion E x = e} =>
f e = mon_unit)
(funa : {x : A & inclusion E x = 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
(funf : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism
in
X
(funb : A =>
ap f
(letX0 := funa : AbSES' B A => cx_isexact
inletX1 :=
funa : 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
(fune : E =>
Trunc_ind
(fun_ : Trunc (-1)
{x : A & inclusion E x = e} =>
f e = mon_unit)
(funa : {x : A & inclusion E x = 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
(funf : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism
in
X
(funb : A =>
ap f
(letX0 :=
funa : AbSES' B A => cx_isexact inletX1 :=
funa : 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
(fune : E =>
Trunc_ind
(fun_ : Trunc (-1)
{x : A & inclusion E x = e} =>
f e = mon_unit)
(funa : {x : A & inclusion E x = 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
(funf : ab_hom B G =>
equiv_path_grouphomomorphism
(funb : A =>
ap f (cx_isexact b) @ grp_homo_unit f)))
(grp_homo_compose
(quotient_abgroup_rec (grp_image (inclusion E))
G f
(fune : E =>
Trunc_ind
(fun_ : Trunc (-1)
{x : A & inclusion E x = e} =>
f e = mon_unit)
(funa : {x : A & inclusion E x = 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
(funf : ab_hom B G =>
equiv_path_grouphomomorphism
(funb : A =>
ap f (cx_isexact b) @ grp_homo_unit f)))
(grp_homo_compose
(quotient_abgroup_rec (grp_image (inclusion E))
G f
(fune : E =>
Trunc_ind
(fun_ : Trunc (-1)
{x : A & inclusion E x = e} =>
f e = mon_unit)
(funa : {x : A & inclusion E x = 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: 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: 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: 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: 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: 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: 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: 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
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
((fung : 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
(fung : 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
(fung : 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
(fung : 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
(fung : 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
(fung : 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
(fung : 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': 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': 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': 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': 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': 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': 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': 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': 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': 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': 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': 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': 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': 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': 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': 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)
((funx : 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)))^ @
((letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : 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': 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)
(funx : 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)))^ @
(letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : 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
napply 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': 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': 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': 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
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
((fung : 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
(fung : 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
forallaa : Trunc 0 (AbSES B G),
IsHSet
(forallp : fmap (pTr 0)
(abses_pullback_pmap (projection E)) aa = pt,
IsConnected (Tr (-1))
(hfiber
(cxfib
(phomotopy_homotopy_hset
(fung : 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
(fung : 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
forallaa : Trunc 0 (AbSES B G),
IsHSet
(forallp : fmap (pTr 0)
(abses_pullback_pmap (projection E)) aa = pt,
IsConnected (Tr (-1))
(hfiber
(cxfib
(phomotopy_homotopy_hset
(fung : 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)
foralla : fmap (pTr 0) (abses_pullback_pmap (projection E))
x = pt,
IsHSet
(IsConnected (Tr (-1))
(hfiber
(cxfib
(phomotopy_homotopy_hset
(fung : 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)))
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
(fung : 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
forallp : fmap (pTr 0) (abses_pullback_pmap (projection E))
(tr F) = pt,
IsConnected (Tr (-1))
(hfiber
(cxfib
(phomotopy_homotopy_hset
(fung : 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
(fung : 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
(fung : 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
(fung : 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
(fung : 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
(fung : 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]. *)
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. *)Definitioncyclic' `{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 Definitionisexact_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]. *)
(* 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)))).