Built with Alectryon. 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.
From HoTT Require Import Basics Types.From HoTT Require Import Basics Types.From HoTT.WildCat Require Import Core Opposite Equiv Bifunctor.Require Import Pointed.Core Pointed.pTrunc Pointed.pEquiv
Modalities.ReflectiveSubuniverse Truncations.Core Truncations.SeparatedTrunc
AbGroups Homotopy.ExactSequence Spaces.Int Spaces.FreeInt.From HoTT.Algebra.AbSES Require Import Core Pullback Pushout BaerSum
Ext PullbackFiberSequence.Require Import HSet.(** * 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
(funf0 : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism in
X
(funb : A =>
ap f0
(letX0 := funa : AbSES' B A => cx_isexact inletX1 := funa : AbSES' B A => pointed_fun (X0 a) in
X1 E b) @
grp_homo_unit f0))))
(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
(funf0 : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism in
X
(funb : A =>
ap f0
(letX0 := funa : AbSES' B A => cx_isexact inletX1 := funa : AbSES' B A => pointed_fun (X0 a) in X1 E b) @
grp_homo_unit f0)))
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
(funf0 : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism in
X
(funb : A =>
ap f0
(letX0 := funa : AbSES' B A => cx_isexact inletX1 := funa : AbSES' B A => pointed_fun (X0 a) in X1 E b) @
grp_homo_unit f0)))
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
(funf0 : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism in
X
(funb : A =>
ap f0
(letX0 := funa : AbSES' B A => cx_isexact inletX1 := funa : AbSES' B A => pointed_fun (X0 a) in X1 E b) @
grp_homo_unit f0)))
(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
(funf0 : ab_hom B G =>
letX := equiv_fun equiv_path_grouphomomorphism in
X
(funb : A =>
ap f0
(letX0 := funa : AbSES' B A => cx_isexact inletX1 := funa : AbSES' B A => pointed_fun (X0 a) in X1 E b) @
grp_homo_unit f0)))
(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
(funf0 : ab_hom B G =>
equiv_path_grouphomomorphism
(funb : A => ap f0 (cx_isexact b) @ grp_homo_unit f0)))
(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
(funf0 : ab_hom B G =>
equiv_path_grouphomomorphism
(funb : A => ap f0 (cx_isexact b) @ grp_homo_unit f0)))
(grp_homo_compose
(quotient_abgroup_rec (grp_image (inclusion E)) G f
(fune : E =>
Trunc_ind
(fun_ : Trunc (-1) {x0 : A & inclusion E x0 = e} =>
f e = mon_unit)
(funa : {x0 : A & inclusion E x0 = 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
{phi0 : E $-> A' & alpha = phi0 $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
(fung0 : ab_hom E G =>
ap tr
((abses_pushout_compose (inclusion E) g0 E @
ap (abses_pushout g0) (abses_pushout_inclusion E)) @
abses_pushout_point g0))))
(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
(fung0 : ab_hom E G =>
ap tr
((abses_pushout_compose (inclusion E) g0 E @
ap (abses_pushout g0) (abses_pushout_inclusion E)) @
abses_pushout_point g0)))
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 := funa0 : AbSES' B A => cx_isexact inletX0 := funa0 : AbSES' B A => pointed_fun (X a0) 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
(fung0 : ab_hom A G =>
ap tr
(((abses_pushout_pullback_reorder E g0 (projection E))^ @
ap (abses_pushout g0) (abses_pullback_projection E)^) @
abses_pushout_point g0))))
(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
(fung0 : ab_hom A G =>
ap tr
(((abses_pushout_pullback_reorder E g0 (projection E))^ @
ap (abses_pushout g0) (abses_pullback_projection E)^) @
abses_pushout_point g0)))
(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)))).