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 UniverseOpposite Bifunctor.Require Import Pointed.Core Pointed.pTrunc.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 (funB0 : AbGroup^op => ab_ext B0 A) f $==
fmap (funB0 : AbGroup^op => ab_ext B0 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 (funB0 : AbGroup^op => ab_ext B0 A) (g $o f) $==
fmap (funB0 : AbGroup^op => ab_ext B0 A) g $o
fmap (funB0 : AbGroup^op => ab_ext B0 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) (E0 : AbSES P A), tr E0 = 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) (E0 : AbSES P A), tr E0 = 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))