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.From HoTT Require Import Basics Types.From HoTT.WildCat Require Import Core NatTrans UniverseOpposite.Require Import HSet Limits.Pullback.Require Import 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 (funx0 : E => (snd p.2 x0)^) (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 (projection pt) f)
(projection (abses_pullback f pt))
((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
(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))).1 =
((a, b); b'; c).1,
1
:
((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))).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 (projection pt) f)
(projection (abses_pullback f pt))
((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
(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))).1 =
((a, b); b'; c).1,
1
:
((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))).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 := funE0 : AbSES' B A => pointed_fun (iscomplex_abses E0) 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 := funE0 : AbSES' B A => pointed_fun (iscomplex_abses E0) 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