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 Pointed WildCat.Require Import Truncations.SeparatedTrunc.Require Import AbelianGroup AbHom AbProjective.Require Import AbSES.Pullback AbSES.Pushout AbSES.BaerSum AbSES.Core.LocalOpen Scope mc_scope.LocalOpen Scope mc_add_scope.(** * The set [Ext B A] of abelian group extensions *)DefinitionExt (BA : AbGroup@{u}) := pTr 0 (AbSES B A).Instanceis0bifunctor_ext `{Univalence}
: Is0Bifunctor (Ext : AbGroup^op -> AbGroup -> pType)
:= is0bifunctor_postcompose _ _ (bf:=is0bifunctor_abses).Instanceis1bifunctor_ext `{Univalence}
: Is1Bifunctor (Ext : AbGroup^op -> AbGroup -> pType)
:= is1bifunctor_postcompose _ _ (bf:=is1bifunctor_abses).(** An extension [E : AbSES B A] is trivial in [Ext B A] if and only if [E] merely splits. *)
H: Univalence B, A: AbGroup E: AbSES B A
merely
{s : GroupHomomorphism B E &
projection E $o s == idmap} <~>
tr E = point (Ext B A)
H: Univalence B, A: AbGroup E: AbSES B A
merely
{s : GroupHomomorphism B E &
projection E $o s == idmap} <~>
tr E = point (Ext B A)
H: Univalence B, A: AbGroup E: AbSES B A
merely
{s : GroupHomomorphism B E &
projection E $o s == idmap} <~>
Tr (-1) (E = point (AbSES B A))
srapply equiv_iff_hprop;
apply Trunc_functor;
apply iff_abses_trivial_split.Defined.DefinitionExt' (BA : AbGroup@{u}) := Tr 0 (AbSES' B A).Instanceis0bifunctor_ext' `{Univalence}
: Is0Bifunctor (Ext' : AbGroup^op -> AbGroup -> Type)
:= is0bifunctor_postcompose _ _ (bf:=is0bifunctor_abses').Instanceis1bifunctor_ext' `{Univalence}
: Is1Bifunctor (Ext' : AbGroup^op -> AbGroup -> Type)
:= is1bifunctor_postcompose _ _ (bf:=is1bifunctor_abses').(** [Ext B A] is an abelian group for any [A B : AbGroup]. The proof of commutativity is a bit faster if we separate out the proof that [Ext B A] is a group. *)
abses_baer_sum E (abses_baer_sum F G) =
abses_baer_sum (abses_baer_sum E F) G
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum (point (AbSES B A)) E = E
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum E (point (AbSES B A)) = E
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum (abses_pullback (- grp_homo_id) E) E =
point (AbSES B A)
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum E (abses_pullback (- grp_homo_id) E) =
point (AbSES B A)
H: Univalence B, A: AbGroup G, F, E: AbSES B A
abses_baer_sum E (abses_baer_sum F G) =
abses_baer_sum (abses_baer_sum E F) G
symmetry; apply baer_sum_associative.
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum (point (AbSES B A)) E = E
apply baer_sum_unit_l.
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum E (point (AbSES B A)) = E
apply baer_sum_unit_r.
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum (abses_pullback (- grp_homo_id) E) E =
point (AbSES B A)
apply baer_sum_inverse_r.
H: Univalence B, A: AbGroup E: AbSES B A
abses_baer_sum E (abses_pullback (- grp_homo_id) E) =
point (AbSES B A)
apply baer_sum_inverse_l.Defined.(** ** The bifunctor [ab_ext] *)
H: Univalence B: AbGroup^op A: AbGroup
AbGroup
H: Univalence B: AbGroup^op A: AbGroup
AbGroup
H: Univalence B: AbGroup^op A: AbGroup
Commutative sg_op
H: Univalence B: AbGroup^op A: AbGroup E, F: grp_ext B A
E + F = F + E
H: Univalence B: AbGroup^op A: AbGroup F, E: AbSES B A
tr (abses_baer_sum E F) = tr (abses_baer_sum F E)
H: Univalence B: AbGroup^op A: AbGroup F, E: AbSES B A
abses_baer_sum E F = abses_baer_sum F E
apply baer_sum_commutative.Defined.
H: Univalence B: AbGroup^op
Is0Functor (ab_ext B)
H: Univalence B: AbGroup^op
Is0Functor (ab_ext B)
H: Univalence B: AbGroup^op a, b: AbGroup f: a $-> b
ab_ext B a $-> ab_ext B b
H: Univalence B: AbGroup^op a, b: AbGroup f: a $-> b
ab_ext B a -> ab_ext B b
H: Univalence B: AbGroup^op a, b: AbGroup f: a $-> b
IsSemiGroupPreserving ?grp_homo_map
H: Univalence B: AbGroup^op a, b: AbGroup f: a $-> b
IsSemiGroupPreserving (fmap (pTr 0 o AbSES B) f)
H: Univalence B: AbGroup^op a, b: AbGroup f: a $-> b E0: AbSES B a
forally : ab_ext B a,
fmap (pTr 0 o AbSES B) f (tr E0 + y) =
fmap (pTr 0 o AbSES B) f (tr E0) +
fmap (pTr 0 o AbSES B) f y
H: Univalence B: AbGroup^op a, b: AbGroup f: a $-> b E0, E1: AbSES B a
fmap (pTr 0 o AbSES B) f (tr E0 + tr E1) =
fmap (pTr 0 o AbSES B) f (tr E0) +
fmap (pTr 0 o AbSES B) f (tr E1)
H: Univalence B: AbGroup^op a, b: AbGroup f: a $-> b E0, E1: AbSES B a
abses_pushout f (abses_baer_sum E0 E1) =
abses_baer_sum (abses_pushout f E0)
(abses_pushout f E1)
apply baer_sum_pushout.Defined.
H: Univalence A: AbGroup
Is0Functor (funB : AbGroup^op => ab_ext B A)
H: Univalence A: AbGroup
Is0Functor (funB : AbGroup^op => ab_ext B A)
H: Univalence A: AbGroup a, b: AbGroup^op f: a $-> b
GroupHomomorphism (grp_ext a A) (grp_ext b A)
H: Univalence A: AbGroup a, b: AbGroup^op f: a $-> b
grp_ext a A -> grp_ext b A
H: Univalence A: AbGroup a, b: AbGroup^op f: a $-> b
IsSemiGroupPreserving ?grp_homo_map
H: Univalence A: AbGroup a, b: AbGroup^op f: a $-> b
IsSemiGroupPreserving
(fmap (pTr 0 o (funx : AbGroup^op => AbSES x A)) f)
H: Univalence A: AbGroup a, b: AbGroup^op f: a $-> b E0: AbSES a A
forally : grp_ext a A,
fmap (pTr 0 o (funx : AbGroup^op => AbSES x A)) f
(tr E0 + y) =
fmap (pTr 0 o (funx : AbGroup^op => AbSES x A)) f
(tr E0) +
fmap (pTr 0 o (funx : AbGroup^op => AbSES x A)) f y
H: Univalence A: AbGroup a, b: AbGroup^op f: a $-> b E0, E1: AbSES a A
fmap (pTr 0 o (funx : AbGroup^op => AbSES x A)) f
(tr E0 + tr E1) =
fmap (pTr 0 o (funx : AbGroup^op => AbSES x A)) f
(tr E0) +
fmap (pTr 0 o (funx : AbGroup^op => AbSES x A)) f
(tr E1)
H: Univalence A: AbGroup a, b: AbGroup^op f: a $-> b E0, E1: AbSES a A
abses_pullback f (abses_baer_sum E0 E1) =
abses_baer_sum (abses_pullback f E0)
(abses_pullback f E1)
apply baer_sum_pullback.Defined.
H: Univalence B: AbGroup^op
Is1Functor (ab_ext B)
H: Univalence B: AbGroup^op
Is1Functor (ab_ext B)
H: Univalence B: AbGroup^op
forall (ab : AbGroup) (fg : a $-> b),
f $== g -> fmap (ab_ext B) f $== fmap (ab_ext B) g
H: Univalence B: AbGroup^op
foralla : AbGroup,
fmap (ab_ext B) (Id a) $== Id (ab_ext B a)
H: Univalence B: AbGroup^op
forall (abc : AbGroup) (f : a $-> b) (g : b $-> c),
fmap (ab_ext B) (g $o f) $==
fmap (ab_ext B) g $o fmap (ab_ext B) f
H: Univalence B: AbGroup^op
forall (ab : AbGroup) (fg : a $-> b),
f $== g -> fmap (ab_ext B) f $== fmap (ab_ext B) g
H: Univalence B: AbGroup^op A, C: AbGroup f, g: A $-> C
f $== g -> fmap (ab_ext B) f $== fmap (ab_ext B) g
exact (fmap2 (Ext B)).
H: Univalence B: AbGroup^op
foralla : AbGroup,
fmap (ab_ext B) (Id a) $== Id (ab_ext B a)
exact (fmap_id (Ext B)).
H: Univalence B: AbGroup^op
forall (abc : AbGroup) (f : a $-> b) (g : b $-> c),
fmap (ab_ext B) (g $o f) $==
fmap (ab_ext B) g $o fmap (ab_ext B) f
H: Univalence B: AbGroup^op A, C, D: AbGroup
forall (f : A $-> C) (g : C $-> D),
fmap (ab_ext B) (g $o f) $==
fmap (ab_ext B) g $o fmap (ab_ext B) f
exact (fmap_comp (Ext B)).Defined.
H: Univalence A: AbGroup
Is1Functor (funB : AbGroup^op => ab_ext B A)
H: Univalence A: AbGroup
Is1Functor (funB : AbGroup^op => ab_ext B A)
H: Univalence A: AbGroup
forall (ab : AbGroup^op) (fg : a $-> b),
f $== g ->
fmap (funB : AbGroup^op => ab_ext B A) f $==
fmap (funB : AbGroup^op => ab_ext B A) g
H: Univalence A: AbGroup
foralla : AbGroup^op,
fmap (funB : AbGroup^op => ab_ext B A) (Id a) $==
Id ((funB : AbGroup^op => ab_ext B A) a)
H: Univalence A: AbGroup
forall (abc : AbGroup^op) (f : a $-> b)
(g : b $-> c),
fmap (funB : AbGroup^op => ab_ext B A) (g $o f) $==
fmap (funB : AbGroup^op => ab_ext B A) g $o
fmap (funB : AbGroup^op => ab_ext B A) f
H: Univalence A: AbGroup
forall (ab : AbGroup^op) (fg : a $-> b),
f $== g ->
fmap (funB : AbGroup^op => ab_ext B A) f $==
fmap (funB : AbGroup^op => ab_ext B A) g
H: Univalence A: AbGroup B, C: AbGroup^op f, g: B $-> C
f $== g ->
fmap (funB : AbGroup^op => ab_ext B A) f $==
fmap (funB : AbGroup^op => ab_ext B A) g
exact (fmap2 (funB : AbGroup^op => Ext B A)).
H: Univalence A: AbGroup
foralla : AbGroup^op,
fmap (funB : AbGroup^op => ab_ext B A) (Id a) $==
Id ((funB : AbGroup^op => ab_ext B A) a)
exact (fmap_id (funB : AbGroup^op => Ext B A)).
H: Univalence A: AbGroup
forall (abc : AbGroup^op) (f : a $-> b)
(g : b $-> c),
fmap (funB : AbGroup^op => ab_ext B A) (g $o f) $==
fmap (funB : AbGroup^op => ab_ext B A) g $o
fmap (funB : AbGroup^op => ab_ext B A) f
H: Univalence A: AbGroup B, C, D: AbGroup^op
forall (f : B $-> C) (g : C $-> D),
fmap (funB : AbGroup^op => ab_ext B A) (g $o f) $==
fmap (funB : AbGroup^op => ab_ext B A) g $o
fmap (funB : AbGroup^op => ab_ext B A) f
forall (a0a1 : AbGroup^op) (f : a0 $-> a1)
(b0b1 : AbGroup) (g : b0 $-> b1),
fmap01 ab_ext a1 g $o fmap10 ab_ext f b0 $==
fmap10 ab_ext f b1 $o fmap01 ab_ext a0 g
H: Univalence
forall (a0a1 : AbGroup^op) (f : a0 $-> a1)
(b0b1 : AbGroup) (g : b0 $-> b1),
fmap01 ab_ext a1 g $o fmap10 ab_ext f b0 $==
fmap10 ab_ext f b1 $o fmap01 ab_ext a0 g
H: Univalence A, B: AbGroup^op
forall (f : A $-> B) (b0b1 : AbGroup)
(g : b0 $-> b1),
fmap01 ab_ext B g $o fmap10 ab_ext f b0 $==
fmap10 ab_ext f b1 $o fmap01 ab_ext A g
exact (bifunctor_coh (Ext : AbGroup^op -> AbGroup -> pType)).Defined.(** We can push out a fixed extension while letting the map vary, and this defines a group homomorphism. *)
H: Univalence B, A, G: AbGroup E: AbSES B A
GroupHomomorphism (ab_hom A G) (ab_ext B G)
H: Univalence B, A, G: AbGroup E: AbSES B A
GroupHomomorphism (ab_hom A G) (ab_ext B G)
H: Univalence B, A, G: AbGroup E: AbSES B A
ab_hom A G -> ab_ext B G
H: Univalence B, A, G: AbGroup E: AbSES B A
IsSemiGroupPreserving ?grp_homo_map
H: Univalence B, A, G: AbGroup E: AbSES B A
IsSemiGroupPreserving
(funf : ab_hom A G => fmap01 Ext' B f (tr E))
H: Univalence B, A, G: AbGroup E: AbSES B A f, g: ab_hom A G
tr (abses_pushout (sgop_hom f g) E) =
tr
(abses_baer_sum (abses_pushout f E)
(abses_pushout g E))
H: Univalence B, A, G: AbGroup E: AbSES B A f, g: ab_hom A G
abses_pushout (sgop_hom f g) E =
abses_baer_sum (abses_pushout f E) (abses_pushout g E)
exact (baer_sum_distributive_pushouts f g).Defined.(** ** Extensions ending in a projective are trivial *)
H: Univalence P: AbGroup H0: IsAbProjective P
forall (A : AbGroup) (E : AbSES P A),
tr E = point (Ext P A)
H: Univalence P: AbGroup H0: IsAbProjective P
forall (A : AbGroup) (E : AbSES P A),
tr E = point (Ext P A)
H: Univalence P: AbGroup H0: IsAbProjective P A: AbGroup E: AbSES P A
tr E = point (Ext P A)
H: Univalence P: AbGroup H0: IsAbProjective P A: AbGroup E: AbSES P A
merely
{s : GroupHomomorphism P E &
projection E $o s == idmap}
exact (fst (iff_isabprojective_surjections_split P) _ _ _ _).Defined.(** It follows that when [P] is projective, [Ext P A] is contractible. *)
H: Univalence P: AbGroup H0: IsAbProjective P A: AbGroup
Contr (Ext P A)
H: Univalence P: AbGroup H0: IsAbProjective P A: AbGroup
Contr (Ext P A)
H: Univalence P: AbGroup H0: IsAbProjective P A: AbGroup E: Ext P A
point (Ext P A) = E
H: Univalence P: AbGroup H0: IsAbProjective P A: AbGroup E: AbSES P A
point (Ext P A) = tr E
symmetry; byapply abext_trivial_projective.Defined.(* Conversely, if all extensions ending in [P] are trivial, then [P] is projective. *)
H: Univalence P: AbGroup ext_triv: forall (A : AbGroup) (E : AbSES P A),
tr E = point (Ext P A)
IsAbProjective P
H: Univalence P: AbGroup ext_triv: forall (A : AbGroup) (E : AbSES P A),
tr E = point (Ext P A)
IsAbProjective P
H: Univalence P: AbGroup ext_triv: forall (A : AbGroup) (E : AbSES P A),
tr E = point (Ext P A)
forall (A : AbGroup) (p : A $-> P),
ReflectiveSubuniverse.IsConnMap (Tr (-1)) p ->
merely {s : P $-> A & p $o s == grp_homo_id}
H: Univalence P: AbGroup ext_triv: forall (A : AbGroup) (E : AbSES P A),
tr E = point (Ext P A) E: AbGroup p: E $-> P issurj_p: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p
merely {s : P $-> E & p $o s == grp_homo_id}
H: Univalence P: AbGroup ext_triv: forall (A : AbGroup) (E : AbSES P A),
tr E = point (Ext P A) E: AbGroup p: E $-> P issurj_p: ReflectiveSubuniverse.IsConnMap (Tr (-1)) p
tr (abses_from_surjection p) =
point (Ext P (ab_kernel p))