Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import HSet WildCat Pointed.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
(funphi : GroupIsomorphism E F =>
(phi $o inclusion E == inclusion F) *
(projection E == projection F $o phi)) phi <~>
(funphi : GroupIsomorphism E F =>
(phi $o inclusion E == inclusion F) *
(projection E $o grp_iso_inverse phi == 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 (funE : AbGroup => (A $-> E) * (E $-> 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 (funE : AbGroup => (A $-> E) * (E $-> 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 (funE : AbGroup => (A $-> E) * (E $-> 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 (funE : AbGroup => (A $-> E) * (E $-> 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 (funE : AbGroup => (A $-> E) * (E $-> 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
(funxy : 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 : {x0 : A & f x0 = e} =>
ap g (X.2)^ @ cx_isexact X.1)) 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)) y ->
x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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 : {x : A & f x = 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