Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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. Local Open Scope mc_scope. Local Open Scope mc_add_scope. (** * The set [Ext B A] of abelian group extensions *) Definition Ext (B A : AbGroup@{u}) := pTr 0 (AbSES B A). Global Instance is0bifunctor_ext `{Univalence} : Is0Bifunctor (Ext : AbGroup^op -> AbGroup -> pType) := is0bifunctor_postcompose _ _ (bf:=is0bifunctor_abses). Global Instance is1bifunctor_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. Definition Ext' (B A : AbGroup@{u}) := Tr 0 (AbSES' B A). Global Instance is0bifunctor_ext' `{Univalence} : Is0Bifunctor (Ext' : AbGroup^op -> AbGroup -> Type) := is0bifunctor_postcompose _ _ (bf:=is0bifunctor_abses'). Global Instance is1bifunctor_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. *)
H: Univalence
B, A: AbGroup

Group
H: Univalence
B, A: AbGroup

Group
H: Univalence
B, A: AbGroup

SgOp (Ext B A)
H: Univalence
B, A: AbGroup
MonUnit (Ext B A)
H: Univalence
B, A: AbGroup
Negate (Ext B A)
H: Univalence
B, A: AbGroup
IsGroup (Ext B A)
H: Univalence
B, A: AbGroup

SgOp (Ext B A)
H: Univalence
B, A: AbGroup
E, F: Ext B A

Ext B A
H: Univalence
B, A: AbGroup
F, E: AbSES B A

Ext B A
exact (tr (abses_baer_sum E F)).
H: Univalence
B, A: AbGroup

MonUnit (Ext B A)
exact (point (Ext B A)).
H: Univalence
B, A: AbGroup

Negate (Ext B A)
H: Univalence
B, A: AbGroup

Ext B A -> Ext B A
exact (Trunc_functor _ (abses_pullback (- grp_homo_id))).
H: Univalence
B, A: AbGroup

IsGroup (Ext B A)
H: Univalence
B, A: AbGroup

IsHSet (Ext B A)
H: Univalence
B, A: AbGroup
Associative sg_op
H: Univalence
B, A: AbGroup
LeftIdentity sg_op mon_unit
H: Univalence
B, A: AbGroup
RightIdentity sg_op mon_unit
H: Univalence
B, A: AbGroup
LeftInverse sg_op negate mon_unit
H: Univalence
B, A: AbGroup
RightInverse sg_op negate mon_unit
H: Univalence
B, A: AbGroup

Associative sg_op
H: Univalence
B, A: AbGroup
LeftIdentity sg_op mon_unit
H: Univalence
B, A: AbGroup
RightIdentity sg_op mon_unit
H: Univalence
B, A: AbGroup
LeftInverse sg_op negate mon_unit
H: Univalence
B, A: AbGroup
RightInverse sg_op negate mon_unit
H: Univalence
B, A: AbGroup
E: Ext B A

forall y z : Ext B A, E + (y + z) = E + y + z
H: Univalence
B, A: AbGroup
E: Ext B A
mon_unit + E = E
H: Univalence
B, A: AbGroup
E: Ext B A
E + mon_unit = E
H: Univalence
B, A: AbGroup
E: Ext B A
- E + E = mon_unit
H: Univalence
B, A: AbGroup
E: Ext B A
E + - E = mon_unit
H: Univalence
B, A: AbGroup
E, F, G: Ext B A

E + (F + G) = E + F + G
H: Univalence
B, A: AbGroup
E: Ext B A
mon_unit + E = E
H: Univalence
B, A: AbGroup
E: Ext B A
E + mon_unit = E
H: Univalence
B, A: AbGroup
E: Ext B A
- E + E = mon_unit
H: Univalence
B, A: AbGroup
E: Ext B A
E + - E = mon_unit
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
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 group_sgop
H: Univalence
B: AbGroup^op
A: AbGroup
E, F: grp_ext B A

group_sgop E F = group_sgop 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 ?f
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

forall y : 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 (fun B : AbGroup^op => ab_ext B A)
H: Univalence
A: AbGroup

Is0Functor (fun B : 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 ?f
H: Univalence
A: AbGroup
a, b: AbGroup^op
f: a $-> b

IsSemiGroupPreserving (fmap (pTr 0 o (fun x : AbGroup^op => AbSES x A)) f)
H: Univalence
A: AbGroup
a, b: AbGroup^op
f: a $-> b
E0: AbSES a A

forall y : grp_ext a A, fmap (pTr 0 o (fun x : AbGroup^op => AbSES x A)) f (tr E0 + y) = fmap (pTr 0 o (fun x : AbGroup^op => AbSES x A)) f (tr E0) + fmap (pTr 0 o (fun x : 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 (fun x : AbGroup^op => AbSES x A)) f (tr E0 + tr E1) = fmap (pTr 0 o (fun x : AbGroup^op => AbSES x A)) f (tr E0) + fmap (pTr 0 o (fun x : 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 (a b : AbGroup) (f g : a $-> b), f $== g -> fmap (ab_ext B) f $== fmap (ab_ext B) g
H: Univalence
B: AbGroup^op
forall a : AbGroup, fmap (ab_ext B) (Id a) $== Id (ab_ext B a)
H: Univalence
B: AbGroup^op
forall (a b c : 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 (a b : AbGroup) (f g : 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

forall a : AbGroup, fmap (ab_ext B) (Id a) $== Id (ab_ext B a)
exact (fmap_id (Ext B)).
H: Univalence
B: AbGroup^op

forall (a b c : 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 (fun B : AbGroup^op => ab_ext B A)
H: Univalence
A: AbGroup

Is1Functor (fun B : AbGroup^op => ab_ext B A)
H: Univalence
A: AbGroup

forall (a b : AbGroup^op) (f g : a $-> b), f $== g -> fmap (fun B : AbGroup^op => ab_ext B A) f $== fmap (fun B : AbGroup^op => ab_ext B A) g
H: Univalence
A: AbGroup
forall a : AbGroup^op, fmap (fun B : AbGroup^op => ab_ext B A) (Id a) $== Id ((fun B : AbGroup^op => ab_ext B A) a)
H: Univalence
A: AbGroup
forall (a b c : AbGroup^op) (f : a $-> b) (g : b $-> c), fmap (fun B : AbGroup^op => ab_ext B A) (g $o f) $== fmap (fun B : AbGroup^op => ab_ext B A) g $o fmap (fun B : AbGroup^op => ab_ext B A) f
H: Univalence
A: AbGroup

forall (a b : AbGroup^op) (f g : a $-> b), f $== g -> fmap (fun B : AbGroup^op => ab_ext B A) f $== fmap (fun B : AbGroup^op => ab_ext B A) g
H: Univalence
A: AbGroup
B, C: AbGroup^op
f, g: B $-> C

f $== g -> fmap (fun B : AbGroup^op => ab_ext B A) f $== fmap (fun B : AbGroup^op => ab_ext B A) g
exact (fmap2 (fun B : AbGroup^op => Ext B A)).
H: Univalence
A: AbGroup

forall a : AbGroup^op, fmap (fun B : AbGroup^op => ab_ext B A) (Id a) $== Id ((fun B : AbGroup^op => ab_ext B A) a)
exact (fmap_id (fun B : AbGroup^op => Ext B A)).
H: Univalence
A: AbGroup

forall (a b c : AbGroup^op) (f : a $-> b) (g : b $-> c), fmap (fun B : AbGroup^op => ab_ext B A) (g $o f) $== fmap (fun B : AbGroup^op => ab_ext B A) g $o fmap (fun B : AbGroup^op => ab_ext B A) f
H: Univalence
A: AbGroup
B, C, D: AbGroup^op

forall (f : B $-> C) (g : C $-> D), fmap (fun B : AbGroup^op => ab_ext B A) (g $o f) $== fmap (fun B : AbGroup^op => ab_ext B A) g $o fmap (fun B : AbGroup^op => ab_ext B A) f
exact (fmap_comp (fun B : AbGroup^op => Ext B A)). Defined.
H: Univalence

Is0Bifunctor ab_ext
H: Univalence

Is0Bifunctor ab_ext
rapply Build_Is0Bifunctor''. Defined.
H: Univalence

Is1Bifunctor ab_ext
H: Univalence

Is1Bifunctor ab_ext
H: Univalence

forall a : AbGroup^op, Is1Functor (ab_ext a)
H: Univalence
forall b : AbGroup, Is1Functor (flip ab_ext b)
H: Univalence
forall (a0 a1 : AbGroup^op) (f : a0 $-> a1) (b0 b1 : 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 (a0 a1 : AbGroup^op) (f : a0 $-> a1) (b0 b1 : 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) (b0 b1 : 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 ?f
H: Univalence
B, A, G: AbGroup
E: AbSES B A

IsSemiGroupPreserving (fun f : 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 (ab_homo_add 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 (ab_homo_add 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; by apply abext_trivial_projective. Defined. (* Converely, 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))
apply ext_triv. Defined.