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 Truncations.Core.From HoTT Require Import Basics Types Truncations.Core.From HoTT.WildCat Require Import Core Equiv Induced NatTrans.Require Import HSet Pointed.Core Pointed.Loops.Require Import Groups.QuotientGroup Groups.ShortExactSequence.Require Import AbelianGroup AbGroups.Biproduct AbHom.Require Import Homotopy.ExactSequence.Require Import Modalities.ReflectiveSubuniverse.LocalOpen Scope pointed_scope.LocalOpen Scope path_scope.LocalOpen Scope type_scope.LocalOpen Scope mc_add_scope.(** * Short exact sequences of abelian groups *)(** A short exact sequence of abelian groups consists of a monomorphism [i : A -> E] and an epimorphism [p : E -> B] such that the image of [i] equals the kernel of [p]. Later we will consider short exact sequences up to isomorphism by 0-truncating the type [AbSES] defined below. An isomorphism class of short exact sequences is called an extension. *)Declare Scope abses_scope.LocalOpen Scope abses_scope.(** The type of short exact sequences [A -> E -> B] of abelian groups. We decorate it with (') to reserve the undecorated name for the structured version. *)RecordAbSES' {BA : AbGroup@{u}} := Build_AbSES {
middle : AbGroup@{u};
inclusion : A $-> middle;
projection : middle $-> B;
isembedding_inclusion :: IsEmbedding inclusion;
issurjection_projection :: IsSurjection projection;
isexact_inclusion_projection :: IsExact (Tr (-1)) inclusion projection;
}.(** Given a short exact sequence [A -> E -> B : AbSES B A], we coerce it to [E]. *)Coercionmiddle : AbSES' >-> AbGroup.Arguments AbSES' B A : clear implicits.Arguments Build_AbSES {B A}.(** TODO Figure out why printing this term eats memory and seems to never finish. *)Local Definitionissig_abses_do_not_print {BA : AbGroup} : _ <~> AbSES' B A := ltac:(issig).(** [make_equiv] is slow if used in the context of the next result, so we give the abstract form of the goal here. *)Local Definitionissig_abses_helper {AG : Type} {P : AG -> Type} {Q : AG -> Type}
{R : forallE, P E -> Type} {S : forallE, Q E -> Type} {T : forallE, P E -> Q E -> Type}
: {X : {E : AG & P E * Q E} & R _ (fst X.2) * S _ (snd X.2) * T _ (fst X.2) (snd X.2)}
<~> {E : AG & {H0 : P E & {H1 : Q E & {_ : R _ H0 & {_ : S _ H1 & T _ H0 H1}}}}}
:= ltac:(make_equiv).(** A more useful organization of [AbSES'] as a sigma-type. *)Definitionissig_abses {BA : AbGroup}
: {X : {E : AbGroup & (A $-> E) * (E $-> B)} &
(IsEmbedding (fst X.2)
* IsSurjection (snd X.2)
* IsExact (Tr (-1)) (fst X.2) (snd X.2))}
<~> AbSES' B A
:= issig_abses_do_not_print oE issig_abses_helper.Definitioniscomplex_abses {AB : AbGroup} (E : AbSES' B A)
: IsComplex (inclusion E) (projection E)
:= cx_isexact.(** [AbSES' B A] is pointed by the split sequence [A -> A+B -> B]. *)
B, A: AbGroup
IsPointed (AbSES' B A)
B, A: AbGroup
IsPointed (AbSES' B A)
B, A: AbGroup
IsExact (Tr (-1)) ab_biprod_inl ab_biprod_pr2
B, A: AbGroup
IsComplex ab_biprod_inl ab_biprod_pr2
B, A: AbGroup
IsConnMap (Tr (-1)) (cxfib ?cx_isexact)
B, A: AbGroup
IsComplex ab_biprod_inl ab_biprod_pr2
srapply phomotopy_homotopy_hset; reflexivity.
B, A: AbGroup
IsConnMap (Tr (-1)) (cxfib (phomotopy_homotopy_hset (funx0 : A => 1)))
exact (path_prod' idpath p^).Defined.(** The pointed type of short exact sequences. *)DefinitionAbSES (BA : AbGroup@{u}) : pType
:= [AbSES' B A, _].(** ** Paths in [AbSES B A] *)Definitionabses_path_data_iso
{BA : AbGroup@{u}} (EF : AbSES B A)
:= {phi : GroupIsomorphism E F
& (phi $o inclusion _ == inclusion _)
* (projection _ == projection _ $o phi)}.(** Having the path data in a slightly different form is useful for [equiv_path_abses_iso]. *)
H: Funext B, A: AbGroup E, F: AbSES B A
abses_path_data_iso E F <~>
{phi : GroupIsomorphism E F &
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)}
H: Funext B, A: AbGroup E, F: AbSES B A
abses_path_data_iso E F <~>
{phi : GroupIsomorphism E F &
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)}
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F
(funphi0 : GroupIsomorphism E F =>
(phi0 $o inclusion E == inclusion F) *
(projection E == projection F $o phi0)) phi <~>
(funphi0 : GroupIsomorphism E F =>
(phi0 $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi0 == projection F)) phi
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F
phi $o inclusion E == inclusion F <~> phi $o inclusion E == inclusion F
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F
projection E == projection F $o phi <~>
projection E $o grp_iso_inverse phi == projection F
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F
projection E == projection F $o phi <~>
projection E $o grp_iso_inverse phi == projection F
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F e: F
projection E (phi^-1 e) = projection F (phi (phi^-1 e)) <~>
projection E (phi^-1 e) = projection F e
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F e: F
projection F (phi (phi^-1 e)) = projection F e
exact (ap _ (eisretr _ _)).Defined.(** Paths in [AbSES] correspond to isomorphisms between the [middle]s respecting [inclusion] and [projection]. Below we prove the stronger statement [equiv_path_abses], which uses this result. *)
H: Univalence B, A: AbGroup E, F: AbSES' B A
abses_path_data_iso E F <~> E = F
H: Univalence B, A: AbGroup E, F: AbSES' B A
abses_path_data_iso E F <~> E = F
H: Univalence B, A: AbGroup E, F: AbSES' B A
{phi : GroupIsomorphism E F &
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)} <~>
E = F
H: Univalence B, A: AbGroup E, F: AbSES' B A
{phi : GroupIsomorphism E F &
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)} <~>
issig_abses^-1 E = issig_abses^-1 F
H: Univalence B, A: AbGroup E, F: AbSES' B A
{phi : GroupIsomorphism E F &
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)} <~>
(issig_abses^-1 E).1 = (issig_abses^-1 F).1
H: Univalence B, A: AbGroup E, F: AbSES' B A
{phi : GroupIsomorphism E F &
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)} <~>
{p : ((issig_abses^-1 E).1).1 = ((issig_abses^-1 F).1).1 &
transport (funE0 : AbGroup => (A $-> E0) * (E0 $-> B)) p
((issig_abses^-1 E).1).2 =
((issig_abses^-1 F).1).2}
H: Univalence B, A: AbGroup E, F: AbSES' B A
GroupIsomorphism E F <~> ((issig_abses^-1 E).1).1 = ((issig_abses^-1 F).1).1
H: Univalence B, A: AbGroup E, F: AbSES' B A
foralla : GroupIsomorphism E F,
(funphi : GroupIsomorphism E F =>
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)) a <~>
(funp : ((issig_abses^-1 E).1).1 = ((issig_abses^-1 F).1).1 =>
transport (funE0 : AbGroup => (A $-> E0) * (E0 $-> B)) p
((issig_abses^-1 E).1).2 =
((issig_abses^-1 F).1).2) (?f a)
H: Univalence B, A: AbGroup E, F: AbSES' B A
foralla : GroupIsomorphism E F,
(funphi : GroupIsomorphism E F =>
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == projection F)) a <~>
(funp : ((issig_abses^-1 E).1).1 = ((issig_abses^-1 F).1).1 =>
transport (funE0 : AbGroup => (A $-> E0) * (E0 $-> B)) p
((issig_abses^-1 E).1).2 =
((issig_abses^-1 F).1).2) (equiv_path_abgroup a)
H: Univalence B, A: AbGroup E, F: AbSES' B A q: GroupIsomorphism E F
(q $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse q == projection F) <~>
transport (funE0 : AbGroup => (A $-> E0) * (E0 $-> B))
(equiv_path_abgroup q) ((issig_abses^-1 E).1).2 =
((issig_abses^-1 F).1).2
H: Univalence B, A: AbGroup E, F: AbSES' B A q: GroupIsomorphism E F
(A $-> ((issig_abses^-1 F).1).1) * (((issig_abses^-1 F).1).1 $-> B)
H: Univalence B, A: AbGroup E, F: AbSES' B A q: GroupIsomorphism E F
transport (funE0 : AbGroup => (A $-> E0) * (E0 $-> B))
(equiv_path_abgroup q) ((issig_abses^-1 E).1).2 =
?y
H: Univalence B, A: AbGroup E, F: AbSES' B A q: GroupIsomorphism E F
H: Univalence B, A: AbGroup E, F: AbSES' B A q: GroupIsomorphism E F
transport (funa : AbGroup => a $-> B) (equiv_path_abgroup q)
(snd ((issig_abses^-1 E).1).2) =
projection E $o grp_iso_inverse q
apply transport_iso_abgrouphomomorphism_to_const.Defined.(** It follows that [AbSES B A] is 1-truncated. *)
H: Univalence B, A: AbGroup
IsTrunc 1 (AbSES B A)
H: Univalence B, A: AbGroup
IsTrunc 1 (AbSES B A)
H: Univalence B, A: AbGroup
forallxy : AbSES B A, IsHSet (x = y)
H: Univalence B, A: AbGroup E, F: AbSES B A
IsHSet (E = F)
H: Univalence B, A: AbGroup E, F: AbSES B A
IsHSet (abses_path_data_iso E F)
H: Univalence B, A: AbGroup E, F: AbSES B A
IsHSet (GroupIsomorphism E F)
exact ishset_groupisomorphism.Defined.Definitionpath_abses_iso `{Univalence} {B A : AbGroup@{u}}
{E F : AbSES B A}
(phi : GroupIsomorphism E F) (p : phi $o inclusion _ == inclusion _)
(q : projection _ == projection _ $o phi)
: E = F := equiv_path_abses_iso (phi; (p,q)).(** Given [p] and [q], the map [phi] just above is automatically an isomorphism. Showing this requires the "short five lemma." *)(** A special case of the "short 5-lemma" where the two outer maps are (definitionally) identities. *)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi
IsEquiv phi
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi
IsEquiv phi
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi
IsConnMap (Tr (-1)) phi
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi
IsEmbedding phi
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi
IsConnMap (Tr (-1)) phi
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F
IsConnected (Tr (-1)) (hfiber phi f)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F
Tr (-1) (hfiber phi f)
(** Since [projection E] is epi, we can pull [projection F f] back to [e0 : E].*)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F
Tr (-1) (hfiber (projection E) (projection F f))
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: Tr (-1) (hfiber (projection E) (projection F f))
Tr (-1) (hfiber phi f)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: Tr (-1) (hfiber (projection E) (projection F f))
Tr (-1) (hfiber phi f)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f)
Tr (-1) (hfiber phi f)
(** The difference [f - (phi e0.1)] is sent to [0] by [projection F], hence lies in [A]. *)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f)
Tr (-1) (hfiber (inclusion F) (f - phi e0.1))
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: Tr (-1) (hfiber (inclusion F) (f - phi e0.1))
Tr (-1) (hfiber phi f)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f)
Tr (-1) (hfiber (inclusion F) (f - phi e0.1))
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f)
projection F (f - phi e0.1) = pt
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f)
projection F f + projection F (- phi e0.1) = pt
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f)
projection F f - projection F (phi e0.1) = pt
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f)
projection F f = projection F (phi e0.1)
exact (e0.2^ @ p1 e0.1).
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: Tr (-1) (hfiber (inclusion F) (f - phi e0.1))
Tr (-1) (hfiber phi f)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: hfiber (inclusion F) (f - phi e0.1)
Tr (-1) (hfiber phi f)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: hfiber (inclusion F) (f - phi e0.1)
phi (inclusion E a.1 + e0.1) = f
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: hfiber (inclusion F) (f - phi e0.1)
phi (inclusion E a.1) + phi e0.1 = f
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: hfiber (inclusion F) (f - phi e0.1)
f - phi e0.1 + phi e0.1 = f
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: hfiber (inclusion F) (f - phi e0.1)
f + (- phi e0.1 + phi e0.1) = f
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi f: F e0: hfiber (projection E) (projection F f) a: hfiber (inclusion F) (f - phi e0.1)
f + 0 = f
apply grp_unit_r.
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi
IsEmbedding phi
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi
IsTrivialGroup (grp_kernel phi)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e
trivial_subgroup E e
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e
Tr (-1) (hfiber (inclusion E) e)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e a: Tr (-1) (hfiber (inclusion E) e)
trivial_subgroup E e
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e
Tr (-1) (hfiber (inclusion E) e)
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e
projection E e = pt
exact (p1 e @ ap (projection F) p @ grp_homo_unit _).
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e a: Tr (-1) (hfiber (inclusion E) e)
trivial_subgroup E e
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e a: hfiber (inclusion E) e
trivial_subgroup E e
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e a: hfiber (inclusion E) e
a.1 = 0
B, A: AbGroup E, F: AbSES B A phi: E $-> F p0: phi $o inclusion E == inclusion F p1: projection E == projection F $o phi e: E p: grp_kernel phi e a: hfiber (inclusion E) e
inclusion F a.1 = inclusion F 0
exact ((p0 a.1)^ @ (ap phi a.2) @ p @ (grp_homo_unit _)^).Defined.(** Below we prove that homomorphisms respecting [projection] and [inclusion] correspond to paths in [AbSES B A]. We refer to such homomorphisms simply as path data in [AbSES B A]. *)Definitionabses_path_data {BA : AbGroup@{u}} (EF : AbSES B A)
:= {phi : Hom (A:=AbGroup) E F
& (phi $o inclusion _ == inclusion _)
* (projection _ == projection _ $o phi)}.
B, A: AbGroup E, F: AbSES B A
abses_path_data E F -> abses_path_data_iso E F
B, A: AbGroup E, F: AbSES B A
abses_path_data E F -> abses_path_data_iso E F
B, A: AbGroup E, F: AbSES B A
abses_path_data E F -> abses_path_data_iso E F
B, A: AbGroup E, F: AbSES B A phi: E $-> F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
foralla : GroupIsomorphism E F,
(funphi : GroupIsomorphism E F =>
(phi $o inclusion E == inclusion F) * (projection E == projection F $o phi))
a ->
(funphi : E $-> F =>
(phi $o inclusion E == inclusion F) * (projection E == projection F $o phi))
a
exact (fun_ => idmap).
H: Funext B, A: AbGroup E, F: AbSES B A
abses_path_data_to_iso E F
o functor_sigma (grp_iso_homo E F) (funa : GroupIsomorphism E F => idmap) ==
idmap
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
abses_path_data_to_iso E F
(functor_sigma (grp_iso_homo E F) (funa : GroupIsomorphism E F => idmap)
(phi; (p, q))) =
(phi; (p, q))
H: Funext B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
(abses_path_data_to_iso E F
(functor_sigma (grp_iso_homo E F) (funa : GroupIsomorphism E F => idmap)
(phi; (p, q)))).1 =
(phi; (p, q)).1
byapply equiv_path_groupisomorphism.
H: Funext B, A: AbGroup E, F: AbSES B A
functor_sigma (grp_iso_homo E F) (funa : GroupIsomorphism E F => idmap)
o abses_path_data_to_iso E F == idmap
reflexivity.Defined.Definitionequiv_path_abses `{Univalence} {B A : AbGroup@{u}} {E F : AbSES B A}
: abses_path_data E F <~> E = F
:= equiv_path_abses_iso oE equiv_path_abses_data E F.Definitionpath_abses `{Univalence} {B A : AbGroup@{u}}
{E F : AbSES B A} (phi : middle E $-> F)
(p : phi $o inclusion _ == inclusion _) (q : projection _ == projection _ $o phi)
: E = F := equiv_path_abses (phi; (p,q)).(** *** The wildcat of short exact sequences *)Instanceisgraph_abses_path_data {AB : AbGroup@{u}} (EF : AbSES B A)
: IsGraph (abses_path_data_iso E F)
:= isgraph_induced (grp_iso_homo _ _ o pr1).Instanceis01cat_abses_path_data {AB : AbGroup@{u}} (EF : AbSES B A)
: Is01Cat (abses_path_data_iso E F)
:= is01cat_induced (grp_iso_homo _ _ o pr1).Instanceis0gpd_abses_path_data {AB : AbGroup@{u}} (EF : AbSES B A)
: Is0Gpd (abses_path_data_iso E F)
:= is0gpd_induced (grp_iso_homo _ _ o pr1).Instanceisgraph_abses {AB : AbGroup@{u}} : IsGraph (AbSES B A)
:= Build_IsGraph _ abses_path_data_iso.(** The path data corresponding to [idpath]. *)Definitionabses_path_data_1 {BA : AbGroup@{u}} (E : AbSES B A)
: E $-> E := (grp_iso_id; (fun_ => idpath, fun_ => idpath)).(** We can compose path data in [AbSES B A]. *)Definitionabses_path_data_compose {BA : AbGroup@{u}} {EFG : AbSES B A}
(p : E $-> F) (q : F $-> G) : E $-> G
:= (q.1 $oE p.1; ((funx => ap q.1 (fst p.2 x) @ fst q.2 x),
(funx => snd p.2 x @ snd q.2 (p.1 x)))).Instanceis01cat_abses {AB : AbGroup@{u}}
: Is01Cat (AbSES B A)
:= Build_Is01Cat _ _ abses_path_data_1
(fun___qp => abses_path_data_compose p q).
B, A: AbGroup E, F: AbSES B A
(E $-> F) -> F $-> E
B, A: AbGroup E, F: AbSES B A
(E $-> F) -> F $-> E
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
F $-> E
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
GroupIsomorphism F E
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
?proj1 $o inclusion F == inclusion E
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
projection F == projection E $o ?proj1
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
GroupIsomorphism F E
exact (grp_iso_inverse phi).
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
grp_iso_inverse phi $o inclusion F == inclusion E
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi a: A
(grp_iso_inverse phi $o inclusion F) a = inclusion E a
exact (ap _ (p a)^ @ eissect _ (inclusion E a)).
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi
projection F == projection E $o grp_iso_inverse phi
B, A: AbGroup E, F: AbSES B A phi: GroupIsomorphism E F p: phi $o inclusion E == inclusion F q: projection E == projection F $o phi a: F
projection F a = projection E (phi^-1 a)
exact (ap (projection F) (eisretr _ _)^ @ (q _)^).Defined.Instanceis0gpd_abses
{AB : AbGroup@{u}} : Is0Gpd (AbSES B A)
:= {| gpd_rev := fun__ => abses_path_data_inverse |}.Instanceis2graph_abses
{AB : AbGroup@{u}} : Is2Graph (AbSES B A)
:= funEF => isgraph_abses_path_data E F.(** [AbSES B A] forms a 1Cat *)
A, B: AbGroup
Is1Cat (AbSES B A)
A, B: AbGroup
Is1Cat (AbSES B A)
A, B: AbGroup
forallab : AbSES B A, Is01Cat (a $-> b)
A, B: AbGroup
forallab : AbSES B A, Is0Gpd (a $-> b)
A, B: AbGroup
forall (abc : AbSES B A) (g : b $-> c), Is0Functor (cat_postcomp a g)
A, B: AbGroup
forall (abc : AbSES B A) (f : a $-> b), Is0Functor (cat_precomp c f)
A, B: AbGroup
forall (abcd : AbSES B A) (f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
A, B: AbGroup
forall (ab : AbSES B A) (f : a $-> b), Id b $o f $== f
A, B: AbGroup
forall (ab : AbSES B A) (f : a $-> b), f $o Id a $== f
A, B: AbGroup
forallab : AbSES B A, Is0Gpd (a $-> b)
A, B: AbGroup
forall (abc : AbSES B A) (g : b $-> c), Is0Functor (cat_postcomp a g)
A, B: AbGroup
forall (abc : AbSES B A) (f : a $-> b), Is0Functor (cat_precomp c f)
A, B: AbGroup
forall (abcd : AbSES B A) (f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
A, B: AbGroup
forall (ab : AbSES B A) (f : a $-> b), Id b $o f $== f
A, B: AbGroup
forall (ab : AbSES B A) (f : a $-> b), f $o Id a $== f
A, B: AbGroup
forall (abc : AbSES B A) (g : b $-> c), Is0Functor (cat_postcomp a g)
A, B: AbGroup
forall (abc : AbSES B A) (f : a $-> b), Is0Functor (cat_precomp c f)
A, B: AbGroup
forall (abcd : AbSES B A) (f : a $-> b) (g : b $-> c)
(h : c $-> d), h $o g $o f $== h $o (g $o f)
A, B: AbGroup
forall (ab : AbSES B A) (f : a $-> b), Id b $o f $== f
A, B: AbGroup
forall (ab : AbSES B A) (f : a $-> b), f $o Id a $== f
A, B: AbGroup
forall (abc : AbSES B A) (g : b $-> c), Is0Functor (cat_postcomp a g)
A, B: AbGroup
forall (abc : AbSES B A) (f : a $-> b), Is0Functor (cat_precomp c f)
A, B: AbGroup E, F, G: AbSES B A f: F $-> G p, q: E $-> F h: p $-> q e: E
f.1 (p.1 e) = f.1 (q.1 e)
A, B: AbGroup E, F, G: AbSES B A f: E $-> F p, q: F $-> G h: p $-> q e: E
p.1 (f.1 e) = q.1 (f.1 e)
A, B: AbGroup E, F, G: AbSES B A f: F $-> G p, q: E $-> F h: p $-> q e: E
f.1 (p.1 e) = f.1 (q.1 e)
exact (ap f.1 (h e)).
A, B: AbGroup E, F, G: AbSES B A f: E $-> F p, q: F $-> G h: p $-> q e: E
p.1 (f.1 e) = q.1 (f.1 e)
exact (h (f.1 e)).Defined.
A, B: AbGroup
Is1Gpd (AbSES B A)
A, B: AbGroup
Is1Gpd (AbSES B A)
A, B: AbGroup E, F: AbSES B A p: E $-> F e: E
(p.1)^-1 (p.1 e) = e
A, B: AbGroup E, F: AbSES B A p: E $-> F e: F
p.1 ((p.1)^-1 e) = e
A, B: AbGroup E, F: AbSES B A p: E $-> F e: E
(p.1)^-1 (p.1 e) = e
apply eissect.
A, B: AbGroup E, F: AbSES B A p: E $-> F e: F
p.1 ((p.1)^-1 e) = e
apply eisretr.Defined.
H: Funext A, B: AbGroup
HasMorExt (AbSES B A)
H: Funext A, B: AbGroup
HasMorExt (AbSES B A)
H: Funext A, B: AbGroup E, F: AbSES B A f, g: E $-> F
IsEquiv GpdHom_path
H: Funext A, B: AbGroup E, F: AbSES B A f, g: E $-> F
f = g <~> f.1 == g.1
H: Funext A, B: AbGroup E, F: AbSES B A f, g: E $-> F
?Goal == GpdHom_path
H: Funext A, B: AbGroup E, F: AbSES B A f, g: E $-> F
(equiv_path_groupisomorphism f.1 g.1)^-1 oE (equiv_path_sigma_hprop f g)^-1 ==
GpdHom_path
intro p; byinduction p.Defined.(** *** Path data lemmas *)(** We need to be able to work with path data as if they're paths. Our preference is to state things in terms of [abses_path_data_iso], since this lets us keep track of isomorphisms whose inverses compute. The "abstract" inverses produced by [short_five_lemma] do not compute well. *)
H: Univalence B, A: AbGroup E, F, G: AbSES B A p: abses_path_data_iso E F q: abses_path_data_iso F G x: E = F y: F = G
x @ y =
equiv_path_abses_iso
(abses_path_data_compose (equiv_path_abses_iso^-1 x)
(equiv_path_abses_iso^-1 y))
rapply abses_path_compose_beta.Defined.(** *** Homotopies of path data *)
H: Univalence X: Type B, A: AbGroup f, g: X -> AbSES B A
(f $=> g) <~> f == g
H: Univalence X: Type B, A: AbGroup f, g: X -> AbSES B A
(f $=> g) <~> f == g
H: Univalence X: Type B, A: AbGroup f, g: X -> AbSES B A x: X
abses_path_data_iso (f x) (g x) <~> f x = g x
exact equiv_path_abses_iso.Defined.Definitionpmap_abses_const {B'A'BA : AbGroup@{u}} : AbSES B A -->* AbSES B' A'
:= Build_BasepointPreservingFunctor (const pt) (Id pt).Definitionto_pointed `{Univalence} {B' A' B A : AbGroup@{u}}
: (AbSES B A -->* AbSES B' A') -> (AbSES B A ->* AbSES B' A')
:= funf => Build_pMap f (equiv_path_abses_iso (bp_pointed f)).
H: Univalence B', A', B, A: AbGroup f, g: AbSES B A -->* AbSES B' A' h: f $=> g
h pt $== bp_pointed f $@ (bp_pointed g)^$ <~>
equiv_path_data_homotopy f g h pt = ?Goal
H: Univalence B', A', B, A: AbGroup f, g: AbSES B A -->* AbSES B' A' h: f $=> g
h pt $== bp_pointed f $@ (bp_pointed g)^$ <~>
equiv_path_data_homotopy f g h pt =
equiv_path_abses_iso
(abses_path_data_compose (bp_pointed f)
(abses_path_data_inverse (bp_pointed g)))
H: Univalence B', A', B, A: AbGroup f, g: AbSES B A -->* AbSES B' A' h: f $=> g
h pt $== bp_pointed f $@ (bp_pointed g)^$ <~>
h (1%equiv pt) =
abses_path_data_compose (bp_pointed f)
(abses_path_data_inverse (bp_pointed g))
H: Univalence B', A', B, A: AbGroup f, g: AbSES B A -->* AbSES B' A' h: f $=> g
h pt $== bp_pointed f $@ (bp_pointed g)^$ <~>
(h (1%equiv pt)).1 =
(abses_path_data_compose (bp_pointed f)
(abses_path_data_inverse (bp_pointed g))).1
apply equiv_path_groupisomorphism.Defined.(** *** Characterisation of loops of short exact sequences *)(** Endomorphisms of the trivial short exact sequence in [AbSES B A] correspond to homomorphisms [B -> A]. *)
H: Funext B, A: AbGroup
{phi : GroupHomomorphism pt pt &
(phi o inclusion pt == inclusion pt) * (projection pt == projection pt o phi)} <~>
(B $-> A)
H: Funext B, A: AbGroup
{phi : GroupHomomorphism pt pt &
(phi o inclusion pt == inclusion pt) * (projection pt == projection pt o phi)} <~>
(B $-> A)
H: Funext B, A: AbGroup
{phi : GroupHomomorphism pt pt &
(phi o inclusion pt == inclusion pt) * (projection pt == projection pt o phi)} ->
B $-> A
H: Funext B, A: AbGroup
(B $-> A) ->
{phi : GroupHomomorphism pt pt &
(phi o inclusion pt == inclusion pt) * (projection pt == projection pt o phi)}
H: Funext B, A: AbGroup
?f o ?g == idmap
H: Funext B, A: AbGroup
?g o ?f == idmap
H: Funext B, A: AbGroup
{phi : GroupHomomorphism pt pt &
(phi o inclusion pt == inclusion pt) * (projection pt == projection pt o phi)} ->
B $-> A
exact (ap011 _ (ap snd (p a)) (q (group_unit, b))^).Defined.(** Consequently, the loop space of [AbSES B A] is [GroupHomomorphism B A]. (In fact, [B $-> A] are the loops of any short exact sequence, but the trivial case is easiest to show.) *)Definitionloops_abses `{Univalence} {A B : AbGroup}
: (B $-> A) <~> loops (AbSES B A)
:= equiv_path_abses oE abses_endomorphism_trivial^-1.(** We can transfer a loop of the trivial short exact sequence to any other. *)
A, B: AbGroup E: AbSES B A
(B $-> A) -> abses_path_data E E
A, B: AbGroup E: AbSES B A
(B $-> A) -> abses_path_data E E
A, B: AbGroup E: AbSES B A phi: B $-> A
abses_path_data E E
A, B: AbGroup E: AbSES B A phi: B $-> A
E $-> E
A, B: AbGroup E: AbSES B A phi: B $-> A
?proj1 $o inclusion E == inclusion E
A, B: AbGroup E: AbSES B A phi: B $-> A
projection E == projection E $o ?proj1
A, B: AbGroup E: AbSES B A phi: B $-> A
E $-> E
exact (grp_homo_id + (inclusion E $o phi $o projection E)).
A, B: AbGroup E: AbSES B A phi: B $-> A
(grp_homo_id + inclusion E $o phi $o projection E) $o inclusion E ==
inclusion E
A, B: AbGroup E: AbSES B A phi: B $-> A a: A
inclusion E a + inclusion E (phi (projection E (inclusion E a))) =
inclusion E a
A, B: AbGroup E: AbSES B A phi: B $-> A a: A
projection E (inclusion E a) = ?Goal
A, B: AbGroup E: AbSES B A phi: B $-> A a: A
inclusion E a + inclusion E (phi ?Goal) = inclusion E a
A, B: AbGroup E: AbSES B A phi: B $-> A a: A
inclusion E a + inclusion E (phi (pconst a)) = inclusion E a
A, B: AbGroup E: AbSES B A phi: B $-> A a: A
inclusion E a + 0 = inclusion E a
apply grp_unit_r.
A, B: AbGroup E: AbSES B A phi: B $-> A
projection E ==
projection E $o (grp_homo_id + inclusion E $o phi $o projection E)
A, B: AbGroup E: AbSES B A phi: B $-> A e: E
(projection E $o (grp_homo_id + inclusion E $o phi $o projection E)) e =
projection E e
A, B: AbGroup E: AbSES B A phi: B $-> A e: E
projection E e + projection E (inclusion E (phi (projection E e))) =
projection E e
A, B: AbGroup E: AbSES B A phi: B $-> A e: E
projection E (inclusion E (phi (projection E e))) = ?Goal
A, B: AbGroup E: AbSES B A phi: B $-> A e: E
projection E e + ?Goal = projection E e
A, B: AbGroup E: AbSES B A phi: B $-> A e: E
projection E e + pconst (phi (projection E e)) = projection E e
apply grp_unit_r.Defined.(** ** Morphisms of short exact sequences *)(** A morphism between short exact sequences is a natural transformation between the underlying diagrams. *)RecordAbSESMorphism {AXBY : AbGroup@{u}}
{E : AbSES B A} {F : AbSES Y X} := {
component1 : A $-> X;
component2 : middle E $-> middle F;
component3 : B $-> Y;
left_square : (inclusion _) $o component1 == component2 $o (inclusion _);
right_square : (projection _) $o component2 == component3 $o (projection _);
}.Arguments AbSESMorphism {A X B Y} E F.Arguments Build_AbSESMorphism {_ _ _ _ _ _} _ _ _ _ _.Definitionissig_AbSESMorphism {AXBY : AbGroup@{u}}
{E : AbSES B A} {F : AbSES Y X}
: { f : (A $-> X) * (middle E $-> middle F) * (B $-> Y)
& ((inclusion _) $o (fst (fst f)) == (snd (fst f)) $o (inclusion _))
* ((projection F) $o (snd (fst f)) == (snd f) $o (projection _)) }
<~> AbSESMorphism E F := ltac:(make_equiv).(** The identity morphism from [E] to [E]. *)
A, B: AbGroup E: AbSES B A
AbSESMorphism E E
A, B: AbGroup E: AbSES B A
AbSESMorphism E E
A, B: AbGroup E: AbSES B A
inclusion E $o grp_homo_id == grp_homo_id $o inclusion E
A, B: AbGroup E: AbSES B A
projection E $o grp_homo_id == grp_homo_id $o projection E
1,2: reflexivity.Defined.
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F
AbSESMorphism E G
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F
AbSESMorphism E G
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F
inclusion G $o (component1 g $o component1 f) ==
component2 g $o component2 f $o inclusion E
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F
projection G $o (component2 g $o component2 f) ==
component3 g $o component3 f $o projection E
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F
inclusion G $o (component1 g $o component1 f) ==
component2 g $o component2 f $o inclusion E
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F x: A0
inclusion G (component1 g (component1 f x)) =
component2 g (component2 f (inclusion E x))
exact (left_square g _ @ ap _ (left_square f _)).
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F
projection G $o (component2 g $o component2 f) ==
component3 g $o component3 f $o projection E
A0, A1, A2, B0, B1, B2: AbGroup E: AbSES B0 A0 F: AbSES B1 A1 G: AbSES B2 A2 g: AbSESMorphism F G f: AbSESMorphism E F x: E
projection G (component2 g (component2 f x)) =
component3 g (component3 f (projection E x))
exact (right_square g _ @ ap _ (right_square f _)).Defined.(** ** Characterization of split short exact sequences *)(* We characterize trivial short exact sequences in [AbSES] as those for which [projection] splits. *)(** If [projection E] splits, we get an induced map [fun e => e - s (projection E e)] from [E] to [ab_kernel (projection E)]. *)
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
E $-> ab_kernel (projection E)
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
E $-> ab_kernel (projection E)
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
E $-> E
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection E $o ?g == grp_homo_const
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
E $-> E
refine (grp_homo_id - (s $o projection _)).
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection E $o (grp_homo_id - s $o projection E) == grp_homo_const
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap x: E
projection E (x - s (projection E x)) = group_unit
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap x: E
projection E x + projection E (- s (projection E x)) = group_unit
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap x: E
projection E (- s (projection E x)) = - projection E x
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap x: E
projection E (s (projection E x)) = projection E x
apply h.Defined.(** The composite [A -> E -> ab_kernel (projection E)] is [grp_cxfib]. *)
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection_split_to_kernel E h $o inclusion E == grp_cxfib cx_isexact
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection_split_to_kernel E h $o inclusion E == grp_cxfib cx_isexact
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
(projection_split_to_kernel E h $o inclusion E) a = grp_cxfib cx_isexact a
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
inclusion E a - s (projection E (inclusion E a)) = inclusion E a
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
- s (projection E (inclusion E a)) = 0
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
projection E (inclusion E a) = ?Goal
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
- s ?Goal = 0
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
- s (pconst a) = 0
exact (ap _ (grp_homo_unit _) @ grp_inv_unit).Defined.(** The induced map [E -> ab_kernel (projection E) + B] is an isomorphism. We suffix it with 1 since it is the first composite in the desired isomorphism [E -> A + B]. *)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism E (ab_biprod (ab_kernel (projection E)) B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism E (ab_biprod (ab_kernel (projection E)) B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupHomomorphism E (ab_biprod (ab_kernel (projection E)) B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
IsEquiv ?grp_iso_homo
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupHomomorphism E (ab_biprod (ab_kernel (projection E)) B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
E $-> ab_kernel (projection E)
exact (projection_split_to_kernel E h).
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
IsEquiv (ab_biprod_corec (projection_split_to_kernel E h) (projection E))
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
ab_biprod (ab_kernel (projection E)) B -> E
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
ab_biprod_corec (projection_split_to_kernel E h) (projection E) o ?g == idmap
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
?g o ab_biprod_corec (projection_split_to_kernel E h) (projection E) == idmap
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
ab_biprod (ab_kernel (projection E)) B -> E
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
ab_kernel (projection E) $-> E
rapply subgroup_incl.
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
ab_biprod_corec (projection_split_to_kernel E h) (projection E)
o ab_biprod_rec (subgroup_incl (grp_kernel (projection E))) s == idmap
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
((a.1 + s b - s (projection E (a.1 + s b));
grp_homo_op (projection E) (a.1 + s b) (- s (projection E (a.1 + s b))) @
(ap (funy : B => projection E (a.1 + s b) + y)
(grp_homo_inv (projection E) (s (projection E (a.1 + s b))) @
ap inv (h (projection E (a.1 + s b)))) @
right_inverse (projection E (a.1 + s b)))),
projection E (a.1 + s b)) = (a, b)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
(a.1 + s b - s (projection E (a.1 + s b));
grp_homo_op (projection E) (a.1 + s b) (- s (projection E (a.1 + s b))) @
(ap (funy : B => projection E (a.1 + s b) + y)
(grp_homo_inv (projection E) (s (projection E (a.1 + s b))) @
ap inv (h (projection E (a.1 + s b)))) @
right_inverse (projection E (a.1 + s b)))) =
a
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
projection E (a.1 + s b) = b
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
(a.1 + s b - s (projection E (a.1 + s b));
grp_homo_op (projection E) (a.1 + s b) (- s (projection E (a.1 + s b))) @
(ap (funy : B => projection E (a.1 + s b) + y)
(grp_homo_inv (projection E) (s (projection E (a.1 + s b))) @
ap inv (h (projection E (a.1 + s b)))) @
right_inverse (projection E (a.1 + s b)))) =
a
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
a.1 + s b - s (projection E (a.1 + s b)) = a.1
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
a.1 + (s b - s (projection E (a.1 + s b))) = a.1
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
s b - s (projection E (a.1 + s b)) = 0
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
- s (projection E (a.1 + s b)) = - s b
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
s (projection E (a.1 + s b)) = s b
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
projection E (a.1 + s b) = b
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
projection E a.1 + projection E (s b) = b
exact (ap (funy => y + _) a.2 @ left_identity _ @ h b).
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
projection E (a.1 + s b) = b
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap a: ab_kernel (projection E) b: B
projection E a.1 + projection E (s b) = b
exact (ap (funy => y + _) a.2 @ left_identity _ @ h b).
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
ab_biprod_rec (subgroup_incl (grp_kernel (projection E))) s
o ab_biprod_corec (projection_split_to_kernel E h) (projection E) == idmap
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap e: E
e - s (projection E e) + s (projection E e) = e
byapply grp_moveR_gM.Defined.(** The full isomorphism [E -> A + B]. *)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism E (ab_biprod A B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism E (ab_biprod A B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism E (ab_biprod (ab_kernel ?f) B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism (ab_biprod (ab_kernel ?f) B) (ab_biprod A B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism E (ab_biprod (ab_kernel ?f) B)
exact (projection_split_iso1 E h).
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism (ab_biprod (ab_kernel (projection E)) B) (ab_biprod A B)
B, A: AbGroup E: AbSES B A s: GroupHomomorphism B E h: projection E $o s == idmap
GroupIsomorphism A (ab_kernel (projection E))
rapply grp_iso_cxfib.Defined.
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection_split_iso E h o inclusion E == ab_biprod_inl
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection_split_iso E h o inclusion E == ab_biprod_inl
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
projection_split_iso E h (inclusion E a) = ab_biprod_inl a
(* The next two lines might help the reader, but both are definitional equalities: lhs napply (ap _ (grp_prod_corec_natural _ _ _ _)). lhs napply ab_biprod_functor_beta. *)
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
(grp_iso_inverse (grp_iso_cxfib (isexact_inclusion_projection E)) $o
ab_biprod_pr1) (projection_split_iso1 E h (inclusion E a)) =
grp_homo_id a
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
(grp_iso_id $o ab_biprod_pr2) (projection_split_iso1 E h (inclusion E a)) =
grp_homo_const a
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
(grp_iso_inverse (grp_iso_cxfib (isexact_inclusion_projection E)) $o
ab_biprod_pr1) (projection_split_iso1 E h (inclusion E a)) =
grp_homo_id a
(* The LHS of the remaining goal is definitionally equal to (grp_iso_inverse (grp_iso_cxfib (isexact_inclusion_projection E)) $o (projection_split_to_kernel E h $o inclusion E)) a allowing us to do: *)
B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap a: A
grp_iso_inverse (grp_iso_cxfib (isexact_inclusion_projection E))
(grp_cxfib cx_isexact a) =
grp_homo_id a
apply eissect.Defined.(** A short exact sequence [E] in [AbSES B A] is trivial if and only if [projection E] splits. *)
H: Univalence B, A: AbGroup E: AbSES B A
{s : B $-> E & projection E $o s == idmap} <-> E = pt
H: Univalence B, A: AbGroup E: AbSES B A
{s : B $-> E & projection E $o s == idmap} <-> E = pt
H: Univalence B, A: AbGroup E: AbSES B A
{s : B $-> E & projection E $o s == idmap} -> abses_path_data_iso E pt
H: Univalence B, A: AbGroup E: AbSES B A
abses_path_data_iso E pt -> {s : B $-> E & projection E $o s == idmap}
H: Univalence B, A: AbGroup E: AbSES B A
{s : B $-> E & projection E $o s == idmap} -> abses_path_data_iso E pt
H: Univalence B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
abses_path_data_iso E pt
H: Univalence B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
(projection_split_iso E h $o inclusion E == inclusion pt) *
(projection E == projection pt $o projection_split_iso E h)
H: Univalence B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection_split_iso E h $o inclusion E == inclusion pt
H: Univalence B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection E == projection pt $o projection_split_iso E h
H: Univalence B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection_split_iso E h $o inclusion E == inclusion pt
napply projection_split_beta.
H: Univalence B, A: AbGroup E: AbSES B A s: B $-> E h: projection E $o s == idmap
projection E == projection pt $o projection_split_iso E h
reflexivity.
H: Univalence B, A: AbGroup E: AbSES B A
abses_path_data_iso E pt -> {s : B $-> E & projection E $o s == idmap}
H: Univalence B, A: AbGroup E: AbSES B A phi: GroupIsomorphism E pt g: phi $o inclusion E == inclusion pt h: projection E == projection pt $o phi
{s : B $-> E & projection E $o s == idmap}
H: Univalence B, A: AbGroup E: AbSES B A phi: GroupIsomorphism E pt g: phi $o inclusion E == inclusion pt h: projection E == projection pt $o phi
projection E $o grp_homo_compose (grp_iso_inverse phi) ab_biprod_inr == idmap
H: Univalence B, A: AbGroup E: AbSES B A phi: GroupIsomorphism E pt g: phi $o inclusion E == inclusion pt h: projection E == projection pt $o phi x: B
projection E (phi^-1 (group_unit, x)) = x
exact (h _ @ ap snd (eisretr _ _)).Defined.(** ** Constructions of short exact sequences *)(** Any inclusion [i : A $-> E] determines a short exact sequence by quotienting. *)
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
AbSES (QuotientAbGroup E (grp_image_embedding i)) A
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
AbSES (QuotientAbGroup E (grp_image_embedding i)) A
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
E $-> QuotientAbGroup E (grp_image_embedding i)
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsConnMap (Tr (-1)) ?projection
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsExact (Tr (-1)) i ?projection
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsConnMap (Tr (-1)) grp_quotient_map
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsExact (Tr (-1)) i grp_quotient_map
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsExact (Tr (-1)) i grp_quotient_map
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsComplex i grp_quotient_map
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsConnMap (Tr (-1)) (cxfib ?cx_isexact)
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsComplex i grp_quotient_map
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
grp_quotient_map o* i == pconst
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i x: A
(grp_quotient_map o* i) x = pconst x
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i x: A
hfiber i (- i x + 0)
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i x: A
i (- x) = - i x + 0
exact (grp_homo_inv _ _ @ (grp_unit_r _)^).
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsConnMap (Tr (-1))
(cxfib
(phomotopy_homotopy_hset
((funx : A =>
qglue
((- x; grp_homo_inv i x @ (grp_unit_r (- i x))^)
:
in_cosetL
{|
normalsubgroup_subgroup := grp_image_embedding i;
normalsubgroup_isnormal :=
isnormal_ab_subgroup E (grp_image_embedding i)
|} (i x) 0))
:
grp_quotient_map o* i == pconst)))
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
A -> grp_kernel grp_quotient_map
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
?f ==
cxfib
(phomotopy_homotopy_hset
((funx : A =>
qglue
((- x; grp_homo_inv i x @ (grp_unit_r (- i x))^)
:
in_cosetL
{|
normalsubgroup_subgroup := grp_image_embedding i;
normalsubgroup_isnormal :=
isnormal_ab_subgroup E (grp_image_embedding i)
|} (i x) 0))
:
grp_quotient_map o* i == pconst))
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsConnMap (Tr (-1)) ?f
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
A -> grp_kernel grp_quotient_map
exact (grp_kernel_quotient_iso _ o ab_image_in_embedding i).
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
grp_kernel_quotient_iso (ab_image_embedding i) o ab_image_in_embedding i ==
cxfib
(phomotopy_homotopy_hset
((funx : A =>
qglue
((- x; grp_homo_inv i x @ (grp_unit_r (- i x))^)
:
in_cosetL
{|
normalsubgroup_subgroup := grp_image_embedding i;
normalsubgroup_isnormal :=
isnormal_ab_subgroup E (grp_image_embedding i)
|} (i x) 0))
:
grp_quotient_map o* i == pconst))
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i a: A
grp_kernel_quotient_iso (ab_image_embedding i) (ab_image_in_embedding i a) =
cxfib
(phomotopy_homotopy_hset
(funx : A => qglue (- x; grp_homo_inv i x @ (grp_unit_r (- i x))^)))
a
by rapply (isinj_embedding (subgroup_incl _)).
H: Univalence A, E: AbGroup i: A $-> E IsEmbedding0: IsEmbedding i
IsConnMap (Tr (-1))
(grp_kernel_quotient_iso (ab_image_embedding i) o ab_image_in_embedding i)
rapply conn_map_isequiv.Defined.(** Conversely, given a short exact sequence [A -> E -> B], [A] is the kernel of [E -> B]. (We don't need exactness at [B], so we drop this assumption.) *)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
GroupIsomorphism A (ab_kernel p)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
GroupIsomorphism A (ab_kernel p)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
GroupHomomorphism A (ab_kernel p)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
IsEquiv ?grp_iso_homo
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
GroupHomomorphism A (ab_kernel p)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
p $o i == grp_homo_const
exact cx_isexact.
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
IsEquiv (grp_kernel_corec i cx_isexact)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
IsConnMap (Tr (-1)) (grp_kernel_corec i cx_isexact)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
IsEmbedding (grp_kernel_corec i cx_isexact)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
IsConnMap (Tr (-1)) (grp_kernel_corec i cx_isexact)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y
IsConnected (Tr (-1)) (hfiber (grp_kernel_corec i cx_isexact) (y; q))
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y
Tr (-1) (hfiber i y)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y a: Tr (-1) (hfiber i y)
IsConnected (Tr (-1)) (hfiber (grp_kernel_corec i cx_isexact) (y; q))
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y a: Tr (-1) (hfiber i y)
IsConnected (Tr (-1)) (hfiber (grp_kernel_corec i cx_isexact) (y; q))
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y a: A r: i a = y
IsConnected (Tr (-1)) (hfiber (grp_kernel_corec i cx_isexact) (y; q))
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y a: A r: i a = y
Tr (-1) (hfiber (grp_kernel_corec i cx_isexact) (y; q))
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y a: A r: i a = y
(i a; cx_isexact a) = (y; q)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p y: E q: grp_kernel p y a: A r: i a = y
i a = y
exact r.Defined.(** A computation rule for the inverse of [abses_kernel_iso i p]. *)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
i o (abses_kernel_iso i p)^-1 == subgroup_incl (grp_kernel p)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p
i o (abses_kernel_iso i p)^-1 == subgroup_incl (grp_kernel p)
H: Funext A, E, B: AbGroup i: A $-> E p: E $-> B IsEmbedding0: IsEmbedding i H0: IsExact (Tr (-1)) i p a: A
i ((abses_kernel_iso i p)^-1 (abses_kernel_iso i p a)) =
subgroup_incl (grp_kernel p) (abses_kernel_iso i p a)
exact (ap i (eissect (abses_kernel_iso i p) _)).Defined.(* Any surjection [p : E $-> B] induces a short exact sequence by taking the kernel. *)
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
AbSES B (ab_kernel p)
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
AbSES B (ab_kernel p)
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
ab_kernel p $-> E
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsEmbedding ?inclusion
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsExact (Tr (-1)) ?inclusion p
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsEmbedding (subgroup_incl (grp_kernel p))
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsExact (Tr (-1)) (subgroup_incl (grp_kernel p)) p
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsExact (Tr (-1)) (subgroup_incl (grp_kernel p)) p
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsComplex (subgroup_incl (grp_kernel p)) p
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsConnMap (Tr (-1)) (cxfib ?cx_isexact)
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
IsComplex (subgroup_incl (grp_kernel p)) p
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
p o* subgroup_incl (grp_kernel p) == pconst
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p e: E q: grp_kernel p e
p e = ispointed_group B
exact q.
E, B: AbGroup p: E $-> B IsSurjection0: IsConnMap (Tr (-1)) p
rapply conn_map_isequiv.Defined.(** Conversely, given a short exact sequence [A -> E -> B], [B] is the cokernel of [A -> E]. In fact, we don't need exactness at [A], so we drop this from the statement. *)
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
GroupIsomorphism (ab_cokernel f) B
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
GroupIsomorphism (ab_cokernel f) B
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
GroupHomomorphism (ab_cokernel f) B
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
IsEquiv ?grp_iso_homo
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
GroupHomomorphism (ab_cokernel f) B
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
foralln : E, grp_image f n -> g n = 0
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g e: E a: A p: f a = e
g e = 0
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g e: E a: A p: f a = e
g (f a) = 0
tapply cx_isexact.
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
IsEquiv
(quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec
(funX : {x : A & f x = e} =>
(fun (a : A) (p : f a = e) => ap g p^ @ cx_isexact a) X.1 X.2)))
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
IsConnMap (Tr (-1))
(quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x : A & f x = e} => ap g (X.2)^ @ cx_isexact X.1)))
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
IsEmbedding
(quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x : A & f x = e} => ap g (X.2)^ @ cx_isexact X.1)))
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
IsEmbedding
(quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x : A & f x = e} => ap g (X.2)^ @ cx_isexact X.1)))
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
IsInjective
(quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x : A & f x = e} => ap g (X.2)^ @ cx_isexact X.1)))
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g x, y: E
(funx0y0 : E /
in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|} =>
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x1 : A & f x1 = e} => ap g (X.2)^ @ cx_isexact X.1))
x0 =
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x1 : A & f x1 = e} => ap g (X.2)^ @ cx_isexact X.1))
y0 ->
x0 = y0)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x)
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y)
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g x, y: E p: quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x) =
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y)
class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x =
class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g x, y: E p: quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x) =
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y)
Trunc (-1) {x0 : A & f x0 = - x + y}
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g x, y: E p: quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x) =
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y)
g (- x + y) = pt
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g x, y: E p: quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x) =
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y)
g (- x) + g y = pt
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g x, y: E p: quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x) =
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y)
- g x + g y = pt
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g x, y: E p: quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
x) =
quotient_abgroup_rec (grp_image f) B g
(fune : E =>
Trunc_rec (funX : {x0 : A & f x0 = e} => ap g (X.2)^ @ cx_isexact X.1))
(class_of
(in_cosetL
{|
normalsubgroup_subgroup := grp_image f;
normalsubgroup_isnormal := isnormal_ab_subgroup E (grp_image f)
|})
y)
g y = g x
exact p^.Defined.
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
(abses_cokernel_iso f g)^-1 o g == grp_quotient_map
H: Funext A, E, B: AbGroup f: A $-> E g: GroupHomomorphism E B IsSurjection0: IsConnMap (Tr (-1)) g H0: IsExact (Tr (-1)) f g
(abses_cokernel_iso f g)^-1 o g == grp_quotient_map