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 Limits.Pullback.Require Import WildCat Pointed.Core Homotopy.ExactSequence.Require Import Modalities.ReflectiveSubuniverse.Require Import AbGroups.AbelianGroup AbGroups.AbPullback AbGroups.Biproduct.Require Import AbSES.Core AbSES.DirectSum.LocalOpen Scope abses_scope.(** * Pullbacks of short exact sequences *)(** A short exact sequence [A -> E -> B] can be pulled back along a map [B' -> B]. We start by defining the underlying map, then the pointed version. *)
A, B, B': AbGroup f: B' $-> B
AbSES B A -> AbSES B' A
A, B, B': AbGroup f: B' $-> B
AbSES B A -> AbSES B' A
A, B, B': AbGroup f: B' $-> B E: AbSES B A
AbSES B' A
A, B, B': AbGroup f: B' $-> B E: AbSES B A
projection E o inclusion E == f o grp_homo_const
A, B, B': AbGroup f: B' $-> B E: AbSES B A
IsEmbedding
(grp_pullback_corec (projection E) f (inclusion E)
grp_homo_const ?p)
projection E (inclusion E x) = f (grp_homo_const x)
A, B, B': AbGroup f: B' $-> B E: AbSES B A x: A
projection E (inclusion E x) = mon_unit
apply isexact_inclusion_projection.
A, B, B': AbGroup f: B' $-> B E: AbSES B A
IsEmbedding
(grp_pullback_corec (projection E) f (inclusion E)
grp_homo_const
((funx : A =>
(letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : AbSES' B A => pointed_fun (X a) in
X0 E x) @ (grp_homo_unit f)^)
:
projection E o inclusion E == f o grp_homo_const))
IsExact (Core.Tr (-1))
(grp_pullback_corec (projection E) f (inclusion E)
grp_homo_const
((funx : A =>
(letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : AbSES' B A => pointed_fun (X a) in
X0 E x) @ (grp_homo_unit f)^)
:
projection E o inclusion E == f o grp_homo_const))
(grp_pullback_pr2 (projection E) f)
A, B, B': AbGroup f: B' $-> B E: AbSES B A
IsComplex
(grp_pullback_corec (projection E) f (inclusion E)
grp_homo_const
((funx : A =>
(letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : AbSES' B A => pointed_fun (X a) in
X0 E x) @ (grp_homo_unit f)^)
:
projection E o inclusion E == f o grp_homo_const))
(grp_pullback_pr2 (projection E) f)
IsComplex
(grp_pullback_corec (projection E) f (inclusion E)
grp_homo_const
((funx : A =>
(letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : AbSES' B A => pointed_fun (X a) in
X0 E x) @ (grp_homo_unit f)^)
:
projection E o inclusion E == f o grp_homo_const))
(grp_pullback_pr2 (projection E) f)
A, B, B': AbGroup f: B' $-> B E: AbSES B A
IsHSet B'
A, B, B': AbGroup f: B' $-> B E: AbSES B A
grp_pullback_pr2 (projection E) f
o* grp_pullback_corec (projection E) f (inclusion E)
grp_homo_const
((funx : A =>
(letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : AbSES' B A => pointed_fun (X a) in
X0 E x) @ (grp_homo_unit f)^)
:
projection E o inclusion E == f o grp_homo_const) ==
pconst
A, B, B': AbGroup f: B' $-> B E: AbSES B A
IsHSet B'
exact _.
A, B, B': AbGroup f: B' $-> B E: AbSES B A
grp_pullback_pr2 (projection E) f
o* grp_pullback_corec (projection E) f (inclusion E)
grp_homo_const
((funx : A =>
(letX := funa : AbSES' B A => cx_isexact inletX0 :=
funa : AbSES' B A => pointed_fun (X a) in
X0 E x) @ (grp_homo_unit f)^)
:
projection E o inclusion E == f o grp_homo_const) ==
pconst
A, B, X, Y: AbGroup E: AbSES B A F: AbSES Y X f: AbSESMorphism E F x: A
(inclusion F (component1 f x); group_unit;
cx_isexact (component1 f x) @
(grp_homo_unit (component3 f))^) =
(component2 f (inclusion E x);
projection E (inclusion E x);
right_square f (inclusion E x))
A, B, X, Y: AbGroup E: AbSES B A F: AbSES Y X f: AbSESMorphism E F x: A
inclusion F (component1 f x) =
component2 f (inclusion E x)
A, B, X, Y: AbGroup E: AbSES B A F: AbSES Y X f: AbSESMorphism E F x: A
group_unit = projection E (inclusion E x)
A, B, X, Y: AbGroup E: AbSES B A F: AbSES Y X f: AbSESMorphism E F x: A
inclusion F (component1 f x) =
component2 f (inclusion E x)
apply left_square.
A, B, X, Y: AbGroup E: AbSES B A F: AbSES Y X f: AbSESMorphism E F x: A
group_unit = projection E (inclusion E x)
symmetry; apply iscomplex_abses.
A, B, X, Y: AbGroup E: AbSES B A F: AbSES Y X f: AbSESMorphism E F
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id
E $== abses_pullback (component3 f) F
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id
E $== abses_pullback (component3 f) F
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)
E $== abses_pullback (component3 f) F
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)
abses_path_data E (abses_pullback (component3 f) F)
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)
component2 g $o inclusion E ==
inclusion (abses_pullback (component3 f) F)
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)
projection E ==
projection (abses_pullback (component3 f) F) $o
component2 g
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)
component2 g $o inclusion E ==
inclusion (abses_pullback (component3 f) F)
exact (funa => (left_square g a)^ @ ap _ (h a)).
A, B, B': AbGroup E: AbSES B A F: AbSES B' A f: AbSESMorphism E F h: component1 f == grp_homo_id g:= abses_pullback_morphism_corec f: AbSESMorphism E (abses_pullback (component3 f) F)
projection E ==
projection (abses_pullback (component3 f) F) $o
component2 g
reflexivity.Defined.(** In particular, if [component1] of a morphism is the identity, then it exhibits the domain as the pullback of the codomain. *)Definitionabses_pullback_component1_id `{Univalence} {A B B' : AbGroup}
{E : AbSES B A} {F : AbSES B' A}
(f : AbSESMorphism E F) (h : component1 f == grp_homo_id)
: E = abses_pullback (component3 f) F
:= equiv_path_abses_iso (abses_pullback_component1_id' f h).(** For any two [E, F : AbSES B A] and [f, g : B' $-> B], there is a morphism [Ef + Fg -> E + F] induced by the universal properties of the pullbacks of E and F, respectively. *)Definitionabses_directsum_pullback_morphism `{Funext}
{A B B' C D D' : AbGroup@{u}} {E : AbSES B A} {F : AbSES D C}
(f : B' $-> B) (g : D' $-> D)
: AbSESMorphism
(abses_direct_sum (abses_pullback f E) (abses_pullback g F))
(abses_direct_sum E F)
:= functor_abses_directsum
(abses_pullback_morphism E f) (abses_pullback_morphism F g).(** For any two [E, F : AbSES B A] and [f, g : B' $-> B], we have (E + F)(f + g) = Ef + Eg, where + denotes the direct sum. *)Definitionabses_directsum_distributive_pullbacks `{Univalence}
{A B B' C D D' : AbGroup@{u}}
{E : AbSES B A} {F : AbSES D C} (f : B' $-> B) (g : D' $-> D)
: abses_pullback (functor_ab_biprod f g) (abses_direct_sum E F)
= abses_direct_sum (abses_pullback f E) (abses_pullback g F)
:= (abses_pullback_component1_id (abses_directsum_pullback_morphism f g)
(fun_ => idpath))^.
A, B, B': AbGroup bt: B' $-> B E: AbSES B A F: AbSES B' A p: abses_pullback bt E = F
{phi : F $-> E &
projection E o phi == bt o projection F}
A, B, B': AbGroup bt: B' $-> B E: AbSES B A F: AbSES B' A p: abses_pullback bt E = F
{phi : F $-> E &
projection E o phi == bt o projection F}
A, B, B': AbGroup bt: B' $-> B E: AbSES B A
{phi : abses_pullback bt E $-> E &
(funx : abses_pullback bt E => projection E (phi x)) ==
(funx : abses_pullback bt E =>
bt (projection (abses_pullback bt E) x))}
A, B, B': AbGroup bt: B' $-> B E: AbSES B A x: abses_pullback bt E
napply pullback_commsq.Defined.(** ** Functoriality of [abses_pullback f] for [f : B' $-> B] *)(** As any function, [abses_pullback f] acts on paths. By explicitly describing the analogous action on path data we get an action which computes, this turn out to be useful. *)
A, B, B': AbGroup f: B' $-> B
Is0Functor (abses_pullback f)
A, B, B': AbGroup f: B' $-> B
Is0Functor (abses_pullback f)
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
abses_pullback f E $-> abses_pullback f F
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
GroupIsomorphism (abses_pullback f E)
(abses_pullback f F)
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
?proj1 $o inclusion (abses_pullback f E) ==
inclusion (abses_pullback f F)
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
projection (abses_pullback f E) ==
projection (abses_pullback f F) $o ?proj1
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
GroupIsomorphism (abses_pullback f E)
(abses_pullback f F)
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
GroupIsomorphism B B
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
GroupIsomorphism E F
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
GroupIsomorphism B' B'
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
projection F o ?beta == ?alpha o projection E
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
?alpha o f == f o ?gamma
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
GroupIsomorphism E F
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
projection F o ?beta == grp_iso_id o projection E
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
grp_iso_id o f == f o grp_iso_id
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
projection F o p.1 == grp_iso_id o projection E
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
grp_iso_id o f == f o grp_iso_id
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
projection F o p.1 == grp_iso_id o projection E
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F x: E
projection F (p.1 x) = grp_iso_id (projection E x)
exact (snd p.2 x)^.
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
equiv_functor_grp_pullback (projection E)
(projection F) f f grp_iso_id p.1 grp_iso_id
((funx : E => (snd p.2 x)^)
:
projection F o p.1 == grp_iso_id o projection E)
(funx0 : B' => 1) $o inclusion (abses_pullback f E) ==
inclusion (abses_pullback f F)
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F x: A
(equiv_functor_grp_pullback (projection E)
(projection F) f f grp_iso_id p.1 grp_iso_id
(funx : E => (snd p.2 x)^) (funx0 : B' => 1) $o
inclusion (abses_pullback f E)) x =
inclusion (abses_pullback f F) x
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F x: A
p.1 (inclusion E x) = inclusion F x
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F x: A
group_unit = group_unit
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F x: A
p.1 (inclusion E x) = inclusion F x
exact (fst p.2 x).
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E $-> F
projection (abses_pullback f E) ==
projection (abses_pullback f F) $o
equiv_functor_grp_pullback (projection E)
(projection F) f f grp_iso_id p.1 grp_iso_id
((funx : E => (snd p.2 x)^)
:
projection F o p.1 == grp_iso_id o projection E)
(funx0 : B' => 1)
reflexivity.Defined.
A, B, B': AbGroup f: B' $-> B
Is1Functor (abses_pullback f)
A, B, B': AbGroup f: B' $-> B
Is1Functor (abses_pullback f)
A, B, B': AbGroup f: B' $-> B
forall (ab : AbSES B A) (f0g : a $-> b),
f0 $== g ->
fmap (abses_pullback f) f0 $==
fmap (abses_pullback f) g
A, B, B': AbGroup f: B' $-> B
foralla : AbSES B A,
fmap (abses_pullback f) (Id a) $==
Id (abses_pullback f a)
A, B, B': AbGroup f: B' $-> B
forall (abc : AbSES B A) (f0 : a $-> b)
(g : b $-> c),
fmap (abses_pullback f) (g $o f0) $==
fmap (abses_pullback f) g $o
fmap (abses_pullback f) f0
A, B, B': AbGroup f: B' $-> B
forall (ab : AbSES B A) (f0g : a $-> b),
f0 $== g ->
fmap (abses_pullback f) f0 $==
fmap (abses_pullback f) g
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p, q: E $-> F h: p $== q x: abses_pullback f E
(fmap (abses_pullback f) p).1 x =
(fmap (abses_pullback f) q).1 x
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p, q: E $-> F h: p $== q x: abses_pullback f E
p.1 (pullback_pr1 x) = q.1 (pullback_pr1 x)
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p, q: E $-> F h: p $== q x: abses_pullback f E
pullback_pr2 x = pullback_pr2 x
A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p, q: E $-> F h: p $== q x: abses_pullback f E
p.1 (pullback_pr1 x) = q.1 (pullback_pr1 x)
exact (h _).
A, B, B': AbGroup f: B' $-> B
foralla : AbSES B A,
fmap (abses_pullback f) (Id a) $==
Id (abses_pullback f a)
A, B, B': AbGroup f: B' $-> B E: AbSES B A x: abses_pullback f E
(fmap (abses_pullback f) (Id E)).1 x =
(Id (abses_pullback f E)).1 x
by srapply equiv_path_pullback_hset.
A, B, B': AbGroup f: B' $-> B
forall (abc : AbSES B A) (f0 : a $-> b)
(g : b $-> c),
fmap (abses_pullback f) (g $o f0) $==
fmap (abses_pullback f) g $o
fmap (abses_pullback f) f0
A, B, B': AbGroup f: B' $-> B E, F, G: AbSES B A p: E $-> F q: F $-> G x: abses_pullback f E
(fmap (abses_pullback f) (q $o p)).1 x =
(fmap (abses_pullback f) q $o
fmap (abses_pullback f) p).1 x
by srapply equiv_path_pullback_hset.Defined.
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E = F
ap (abses_pullback f) p =
equiv_path_abses_iso
(fmap (abses_pullback f) (equiv_path_abses_iso^-1 p))
H: Univalence A, B, B': AbGroup f: B' $-> B E, F: AbSES B A p: E = F
ap (abses_pullback f) p =
equiv_path_abses_iso
(fmap (abses_pullback f) (equiv_path_abses_iso^-1 p))
H: Univalence A, B, B': AbGroup f: B' $-> B E: AbSES B A
ap (abses_pullback f) 1 =
equiv_path_abses_iso
(fmap (abses_pullback f) (equiv_path_abses_iso^-11))
H: Univalence A, B, B': AbGroup f: B' $-> B E: AbSES B A
ap (abses_pullback f) 1 = equiv_path_abses_iso ?Goal0
H: Univalence A, B, B': AbGroup f: B' $-> B E: AbSES B A
ab_biprod_corec
(ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt)) o ?g == idmap
A, B, B': AbGroup f: B' $-> B
?g
o ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt)) == idmap
A, B, B': AbGroup f: B' $-> B
pt -> abses_pullback f pt
A, B, B': AbGroup f: B' $-> B
pt $-> pt
A, B, B': AbGroup f: B' $-> B
pt $-> B'
A, B, B': AbGroup f: B' $-> B
projection pt o ?b == f o ?c
A, B, B': AbGroup f: B' $-> B
pt $-> pt
exact (functor_ab_biprod grp_homo_id f).
A, B, B': AbGroup f: B' $-> B
pt $-> B'
exact ab_biprod_pr2.
A, B, B': AbGroup f: B' $-> B
projection pt o functor_ab_biprod grp_homo_id f ==
f o ab_biprod_pr2
reflexivity.
A, B, B': AbGroup f: B' $-> B
ab_biprod_corec
(ab_biprod_pr1 $o grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt))
o grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f) ab_biprod_pr2
(funx0 : A * B' => 1) == idmap
reflexivity.
A, B, B': AbGroup f: B' $-> B
grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f) ab_biprod_pr2
(funx0 : A * B' => 1)
o ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt)) == idmap
A, B, B': AbGroup f: B' $-> B a: A b: B b': B' c: projection pt (a, b) = f b'
grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f) ab_biprod_pr2
(funx0 : A * B' => 1)
(ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt))
((a, b); b'; c)) = ((a, b); b'; c)
A, B, B': AbGroup f: B' $-> B a: A b: B b': B' c: projection pt (a, b) = f b'
(a, f b') = (a, b)
A, B, B': AbGroup f: B' $-> B a: A b: B b': B' c: projection pt (a, b) = f b'
b' = b'
A, B, B': AbGroup f: B' $-> B a: A b: B b': B' c: projection pt (a, b) = f b'
(a, f b') = (a, b)
exact (path_prod' idpath c^).
A, B, B': AbGroup f: B' $-> B
{|
grp_iso_homo :=
ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt));
isequiv_group_iso :=
isequiv_adjointify
(ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt)))
(grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (funx0 : A * B' => 1))
(funx0 : A * B' => 1)
((funx : abses_pullback f pt =>
(funproj1 : pt =>
(fun (a : A) (b : B)
(proj2 : {c : B' &
projection pt (a, b) = f c}) =>
(fun (b' : B')
(c : projection pt (a, b) = f b') =>
equiv_path_pullback_hset (projection pt) f
(grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (funx0 : A * B' => 1)
(ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 ... f)
(projection (...)) ((a, b); b'; c)))
((a, b); b'; c)
(path_prod' 1 c^
:
(grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (... => 1)
(ab_biprod_corec ... ... ...)).1 =
((a, b); b'; c).1,
1
:
((grp_pullback_corec (...) f (...)
ab_biprod_pr2 (...) (...)).2).1 =
(((a, b); b'; c).2).1)) proj2.1 proj2.2)
(fst proj1) (snd proj1)) x.1 x.2)
:
grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (funx0 : A * B' => 1)
o ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt)) == idmap)
|} $o inclusion (abses_pullback f pt) == inclusion pt
reflexivity.
A, B, B': AbGroup f: B' $-> B
projection (abses_pullback f pt) ==
projection pt $o
{|
grp_iso_homo :=
ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt));
isequiv_group_iso :=
isequiv_adjointify
(ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt)))
(grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (funx0 : A * B' => 1))
(funx0 : A * B' => 1)
((funx : abses_pullback f pt =>
(funproj1 : pt =>
(fun (a : A) (b : B)
(proj2 : {c : B' &
projection pt (a, b) = f c}) =>
(fun (b' : B')
(c : projection pt (a, b) = f b') =>
equiv_path_pullback_hset (projection pt) f
(grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (funx0 : A * B' => 1)
(ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 ... f)
(projection (...)) ((a, b); b'; c)))
((a, b); b'; c)
(path_prod' 1 c^
:
(grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (... => 1)
(ab_biprod_corec ... ... ...)).1 =
((a, b); b'; c).1,
1
:
((grp_pullback_corec (...) f (...)
ab_biprod_pr2 (...) (...)).2).1 =
(((a, b); b'; c).2).1)) proj2.1 proj2.2)
(fst proj1) (snd proj1)) x.1 x.2)
:
grp_pullback_corec (projection pt) f
(functor_ab_biprod grp_homo_id f)
ab_biprod_pr2 (funx0 : A * B' => 1)
o ab_biprod_corec
(ab_biprod_pr1 $o
grp_pullback_pr1 (projection pt) f)
(projection (abses_pullback f pt)) == idmap)
|}
reflexivity.Defined.Definitionabses_pullback_point `{Univalence} {A B B' : AbGroup} (f : B' $-> B)
: abses_pullback f pt = pt :> AbSES B' A
:= equiv_path_abses_iso (abses_pullback_point' f).Definitionabses_pullback' {ABB' : AbGroup} (f : B' $-> B)
: AbSES B A -->* AbSES B' A
:= Build_BasepointPreservingFunctor (abses_pullback f) (abses_pullback_point' f).(** Pullback of short exact sequences as a pointed map. *)Definitionabses_pullback_pmap `{Univalence} {A B B' : AbGroup} (f : B' $-> B)
: AbSES B A ->* AbSES B' A
:= to_pointed (abses_pullback' f).(** ** Functoriality of [abses_pullback] *)(** [abses_pullback] is pseudo-functorial, and we can state this in terms of actual homotopies or "path data homotopies." We decorate the latter with the suffix ('). *)(** For every [E : AbSES B A], the pullback of [E] along [id_B] is [E]. *)
H: Univalence A, B: AbGroup
abses_pullback grp_homo_id == idmap
H: Univalence A, B: AbGroup
abses_pullback grp_homo_id == idmap
H: Univalence A, B: AbGroup E: AbSES B A
abses_pullback grp_homo_id E = E
H: Univalence A, B: AbGroup E: AbSES B A
GroupIsomorphism (abses_pullback grp_homo_id E) E
H: Univalence A, B: AbGroup E: AbSES B A
?proj1 $o inclusion (abses_pullback grp_homo_id E) ==
inclusion E
H: Univalence A, B: AbGroup E: AbSES B A
projection (abses_pullback grp_homo_id E) ==
projection E $o ?proj1
H: Univalence A, B: AbGroup E: AbSES B A
{|
grp_iso_homo :=
grp_pullback_pr1 (projection E) grp_homo_id;
isequiv_group_iso :=
isequiv_pr1
(funb : E =>
{c : B & projection E b = grp_homo_id c})
|} $o inclusion (abses_pullback grp_homo_id E) ==
inclusion E
H: Univalence A, B: AbGroup E: AbSES B A
projection (abses_pullback grp_homo_id E) ==
projection E $o
{|
grp_iso_homo :=
grp_pullback_pr1 (projection E) grp_homo_id;
isequiv_group_iso :=
isequiv_pr1
(funb : E =>
{c : B & projection E b = grp_homo_id c})
|}
H: Univalence A, B: AbGroup E: AbSES B A
projection (abses_pullback grp_homo_id E) ==
projection E $o
{|
grp_iso_homo :=
grp_pullback_pr1 (projection E) grp_homo_id;
isequiv_group_iso :=
isequiv_pr1
(funb : E =>
{c : B & projection E b = grp_homo_id c})
|}
H: Univalence A, B: AbGroup E: AbSES B A a: E p: B q: projection E a = grp_homo_id p
H: Univalence A, B: AbGroup a: A b, b': B p: b = b'
(a, b) = (a, b')
byapply path_prod'.Defined.
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2
abses_pullback f o abses_pullback g $=>
abses_pullback (g $o f)
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2
abses_pullback f o abses_pullback g $=>
abses_pullback (g $o f)
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 E: AbSES B2 A
GroupIsomorphism
(abses_pullback f (abses_pullback g E))
(abses_pullback (g $o f) E)
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 E: AbSES B2 A
?proj1 $o
inclusion (abses_pullback f (abses_pullback g E)) ==
inclusion (abses_pullback (g $o f) E)
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 E: AbSES B2 A
projection (abses_pullback f (abses_pullback g E)) ==
projection (abses_pullback (g $o f) E) $o ?proj1
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 E: AbSES B2 A
GroupIsomorphism
(abses_pullback f (abses_pullback g E))
(abses_pullback (g $o f) E)
apply equiv_grp_pullback_compose_r.
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 E: AbSES B2 A
equiv_grp_pullback_compose_r (projection E) f g $o
inclusion (abses_pullback f (abses_pullback g E)) ==
inclusion (abses_pullback (g $o f) E)
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 E: AbSES B2 A a: A
(equiv_grp_pullback_compose_r (projection E) f g $o
inclusion (abses_pullback f (abses_pullback g E))) a =
inclusion (abses_pullback (g $o f) E) a
by srapply equiv_path_pullback_hset.
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 E: AbSES B2 A
projection (abses_pullback f (abses_pullback g E)) ==
projection (abses_pullback (g $o f) E) $o
equiv_grp_pullback_compose_r (projection E) f g
reflexivity.Defined.(** The analog of [abses_pullback_compose'] with actual homotopies. *)Definitionabses_pullback_compose `{Univalence}
{A B0 B1 B2 : AbGroup@{u}} (f : B0 $-> B1) (g : B1 $-> B2)
: abses_pullback (A:=A) f o abses_pullback g == abses_pullback (g $o f)
:= funx => equiv_path_abses_iso (abses_pullback_compose' f g x).(** We now work towards *pointed* composition of pullback ([abses_pullback_pcompose]). The proof of pointedness will matter when we later prove that pulling back along a short exact sequence is exact (i.e. that the complex [iscomplex_pullback_abses] below is exact). For this reason we carefully construct the proof of pointedness in terms of the analog [abses_pullback_pcompose'] on path data, which computes. *)
B0, B1, B2, A: AbGroup f: B0 $-> B1 g: B1 $-> B2
abses_pullback' f $o* abses_pullback' g $=>*
abses_pullback' (g $o f)
B0, B1, B2, A: AbGroup f: B0 $-> B1 g: B1 $-> B2
abses_pullback' f $o* abses_pullback' g $=>*
abses_pullback' (g $o f)
B0, B1, B2, A: AbGroup f: B0 $-> B1 g: B1 $-> B2
abses_pullback_compose' f g pt $==
bp_pointed (abses_pullback' f $o* abses_pullback' g) $@
(bp_pointed (abses_pullback' (g $o f)))^$
GroupHomomorphism (grp_prod A B')
(grp_pullback (projection E)
(grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B')))
A, B, B': AbGroup E: AbSES B A
(funx : A => ?Goal (x, group_unit)) ==
(funx : A =>
(inclusion E x; group_unit;
cx_isexact x @
(grp_homo_unit
(grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B')))^))
A, B, B': AbGroup E: AbSES B A
snd == (funx : A * B' => pullback_pr2 (?Goal x))
A, B, B': AbGroup E: AbSES B A
GroupHomomorphism (grp_prod A B')
(grp_pullback (projection E)
(grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B')))
A, B, B': AbGroup E: AbSES B A
grp_prod A B' $-> E
A, B, B': AbGroup E: AbSES B A
grp_prod A B' $-> B'
A, B, B': AbGroup E: AbSES B A
projection E o ?b ==
grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B') o ?c
A, B, B': AbGroup E: AbSES B A
grp_prod A B' $-> E
exact (inclusion _ $o ab_biprod_pr1).
A, B, B': AbGroup E: AbSES B A
grp_prod A B' $-> B'
exact ab_biprod_pr2.
A, B, B': AbGroup E: AbSES B A
projection E o (inclusion E $o ab_biprod_pr1) ==
grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B') o ab_biprod_pr2
A, B, B': AbGroup E: AbSES B A x: grp_prod A B'
projection E (inclusion E (fst x)) = group_unit
apply iscomplex_abses.
A, B, B': AbGroup E: AbSES B A
(funx : A =>
grp_pullback_corec (projection E)
(grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B'))
(inclusion E $o ab_biprod_pr1) ab_biprod_pr2
((funx0 : grp_prod A B' =>
(letX :=
funE : AbSES' B A =>
pointed_fun (iscomplex_abses E) in
X E (fst x0))
:
projection E ((inclusion E $o ab_biprod_pr1) x0) =
grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B') (ab_biprod_pr2 x0))
:
projection E o (inclusion E $o ab_biprod_pr1) ==
grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B') o ab_biprod_pr2)
(x, group_unit)) ==
(funx : A =>
(inclusion E x; group_unit;
cx_isexact x @
(grp_homo_unit
(grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B')))^))
A, B, B': AbGroup E: AbSES B A a: A
(inclusion E a; group_unit; iscomplex_abses E a) =
(inclusion E a; group_unit;
cx_isexact a @
(grp_homo_unit
(grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B')))^)
by srapply equiv_path_pullback_hset; split.
A, B, B': AbGroup E: AbSES B A
snd ==
(funx : A * B' =>
pullback_pr2
(grp_pullback_corec (projection E)
(grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B'))
(inclusion E $o ab_biprod_pr1) ab_biprod_pr2
((funx0 : grp_prod A B' =>
(letX :=
funE : AbSES' B A =>
pointed_fun (iscomplex_abses E) in
X E (fst x0))
:
projection E
((inclusion E $o ab_biprod_pr1) x0) =
grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B') (ab_biprod_pr2 x0))
:
projection E o (inclusion E $o ab_biprod_pr1) ==
grp_homo_compose (grp_trivial_rec B)
(grp_trivial_corec B') o ab_biprod_pr2) x))
reflexivity.Defined.Definitionabses_pullback_const `{Univalence} {A B B' : AbGroup}
: const pt == @abses_pullback A B B' grp_homo_const
:= funx => (equiv_path_abses_iso (abses_pullback_const' x)).
projection E $o
(ab_biprod_rec (inclusion E) grp_homo_id : pt $-> E) ==
projection E $o projection pt
B, A: AbGroup E: AbSES B A a: A e: E
projection E (sg_op (inclusion E a) e) =
projection E e
B, A: AbGroup E: AbSES B A a: A e: E
sg_op (projection E (inclusion E a)) (projection E e) =
projection E e
B, A: AbGroup E: AbSES B A a: A e: E
projection E (inclusion E a) = ?Goal
B, A: AbGroup E: AbSES B A a: A e: E
sg_op ?Goal (projection E e) = projection E e
B, A: AbGroup E: AbSES B A a: A e: E
sg_op (pconst a) (projection E e) = projection E e
apply left_identity.Defined.Definitionabses_pullback_projection `{Univalence} {B A : AbGroup} (E : AbSES B A)
: pt = abses_pullback (projection E) E
:= abses_pullback_component1_id
(abses_pullback_projection_morphism E) (fun_ => idpath).(** *** Pulling back along homotopic maps *)
A, B, B': AbGroup f, f': B $-> B' h: f == f'
abses_pullback f $=> abses_pullback f'
A, B, B': AbGroup f, f': B $-> B' h: f == f'
abses_pullback f $=> abses_pullback f'
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
abses_pullback f E $-> abses_pullback f' E
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
GroupIsomorphism (abses_pullback f E)
(abses_pullback f' E)
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
?proj1 $o inclusion (abses_pullback f E) ==
inclusion (abses_pullback f' E)
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
projection (abses_pullback f E) ==
projection (abses_pullback f' E) $o ?proj1
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
GroupIsomorphism (abses_pullback f E)
(abses_pullback f' E)
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
GroupIsomorphism B' B'
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
GroupIsomorphism E E
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
GroupIsomorphism B B
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
projection E o ?beta == ?alpha o projection E
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
?alpha o f == f' o ?gamma
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
projection E o grp_iso_id == grp_iso_id o projection E
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
grp_iso_id o f == f' o grp_iso_id
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
grp_iso_id o f == f' o grp_iso_id
exact h.
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
equiv_functor_grp_pullback (projection E)
(projection E) f f' grp_iso_id grp_iso_id grp_iso_id
(funx0 : E => 1) h $o
inclusion (abses_pullback f E) ==
inclusion (abses_pullback f' E)
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A a: A
(inclusion E a; group_unit;
(1 @ ap idmap (cx_isexact a @ (grp_homo_unit f)^)) @
h group_unit) =
(inclusion E a; group_unit;
cx_isexact a @ (grp_homo_unit f')^)
by srapply equiv_path_pullback_hset; split.
A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
projection (abses_pullback f E) ==
projection (abses_pullback f' E) $o
equiv_functor_grp_pullback (projection E)
(projection E) f f' grp_iso_id grp_iso_id grp_iso_id
(funx0 : E => 1) h
reflexivity.Defined.
H: Univalence A, B, B': AbGroup f, f': B $-> B' h: f == f'
abses_pullback f == abses_pullback f'
H: Univalence A, B, B': AbGroup f, f': B $-> B' h: f == f'
abses_pullback f == abses_pullback f'
H: Univalence A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
abses_pullback f E = abses_pullback f' E
H: Univalence A, B, B': AbGroup f, f': B $-> B' h: f == f' E: AbSES B' A
abses_path_data_iso (abses_pullback f E)
(abses_pullback f' E)
exact (abses_pullback_homotopic' _ _ h _).Defined.
A, B, B': AbGroup f, f': B $-> B' h: f == f'
abses_pullback' f $=>* abses_pullback' f'
A, B, B': AbGroup f, f': B $-> B' h: f == f'
abses_pullback' f $=>* abses_pullback' f'
A, B, B': AbGroup f, f': B $-> B' h: f == f'
(funx : Pullback snd f =>
(pullback_pr1 x; pullback_pr2 x;
(1 @ ap idmap (pullback_commsq snd f x)) @
h (pullback_pr2 x))) ==
(funx : Pullback snd f =>
((fst (pullback_pr1 x), f' (pullback_pr2 x));
pullback_pr2 x; 1))
A, B, B': AbGroup f, f': B $-> B' h: f == f' a: A b': B' b: B c: b' = f b
A, B, B': AbGroup f, f': B $-> B' h: f == f' a: A b': B' b: B c: b' = f b
(a, b') = (a, f' b)
A, B, B': AbGroup f, f': B $-> B' h: f == f' a: A b': B' b: B c: b' = f b
b = b
A, B, B': AbGroup f, f': B $-> B' h: f == f' a: A b': B' b: B c: b' = f b
(a, b') = (a, f' b)
exact (path_prod' idpath (c @ h b)).Defined.Definitionabses_pullback_phomotopic `{Univalence} {A B B' : AbGroup}
(f f' : B $-> B') (h : f == f')
: abses_pullback_pmap (A:=A) f ==* abses_pullback_pmap f'
:= equiv_ptransformation_phomotopy (abses_pullback_phomotopic' f f' h).(** *** Pulling back along a complex *)
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 h: g $o f == grp_homo_const
abses_pullback' f $o* abses_pullback' g $=>*
pmap_abses_const
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 h: g $o f == grp_homo_const
abses_pullback' f $o* abses_pullback' g $=>*
pmap_abses_const
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 h: g $o f == grp_homo_const
abses_pullback' (g $o f) $=>* pmap_abses_const
A, B0, B1, B2: AbGroup f: B0 $-> B1 g: B1 $-> B2 h: g $o f == grp_homo_const
rapply iscomplex_abses.Defined.(** In fact, pulling back along a short exact sequence is (purely) exact. See [AbSES.PullbackFiberSequence]. *)(** *** Fibers of pullback in terms of path data *)Definitionequiv_hfiber_abses `{Univalence} {X : Type} {A B : AbGroup}
(f : X -> AbSES B A) (E : AbSES B A)
: graph_hfiber f E <~> hfiber f E
:= equiv_functor_sigma_id (fun_ => equiv_path_abses_iso).Definitionhfiber_abses_path {ABB' : AbGroup} {f : B' $-> B} {X : AbSES B' A}
(EF : graph_hfiber (abses_pullback f) X)
:= {p : E.1 $-> F.1 & (fmap (abses_pullback f) p)^$ $@ E.2 $-> F.2}.
H: Univalence A, B, B': AbGroup f: B' $-> B Y: AbSES B' A X0: graph_hfiber (abses_pullback f) Y X1: AbSES B A p: X0.1 = X1
transport
(funx : AbSES B A => abses_pullback f x $== Y) p
X0.2 =
fmap (abses_pullback f) (equiv_path_abses_iso^-1 p^) $@
X0.2
H: Univalence A, B, B': AbGroup f: B' $-> B Y: AbSES B' A X0: graph_hfiber (abses_pullback f) Y X1: AbSES B A p: X0.1 = X1
transport
(funx : AbSES B A => abses_pullback f x $== Y) p
X0.2 =
fmap (abses_pullback f) (equiv_path_abses_iso^-1 p^) $@
X0.2
H: Univalence A, B, B': AbGroup f: B' $-> B Y: AbSES B' A X0: graph_hfiber (abses_pullback f) Y
transport
(funx : AbSES B A => abses_pullback f x $== Y) 1
X0.2 =
fmap (abses_pullback f) (equiv_path_abses_iso^-11^) $@
X0.2
H: Univalence A, B, B': AbGroup f: B' $-> B Y: AbSES B' A X0: graph_hfiber (abses_pullback f) Y