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 WildCat.Core HSet.Require Import Algebra.Groups.Group.Require Export Algebra.Groups.QuotientGroup.Require Import AbGroups.AbelianGroup AbGroups.Biproduct.LocalOpen Scope mc_scope.LocalOpen Scope mc_add_scope.(** * Pushouts of abelian groups. *)(** The pushout of two morphisms [f : A $-> B] and [g : A $-> C] is constructed as the quotient of the biproduct [B + C] by the image of [f - g]. Since this image comes up repeatedly, we name it. *)Definitionab_pushout_subgroup {ABC : AbGroup} (f : A $-> B) (g : A $-> C)
: Subgroup (ab_biprod B C)
:= grp_image (ab_biprod_corec (ab_homo_negation $o f) g).Definitionab_pushout {ABC : AbGroup}
(f : A $-> B) (g : A $-> C) : AbGroup
:= QuotientAbGroup (ab_biprod B C) (ab_pushout_subgroup f g).(** Recursion principle. *)
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g
ab_pushout f g $-> Y
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g
ab_pushout f g $-> Y
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g
ab_biprod B C $-> Y
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g
foralln : ab_biprod B C,
{|
normalsubgroup_subgroup := ab_pushout_subgroup f g;
normalsubgroup_isnormal :=
isnormal_ab_subgroup (ab_biprod B C)
(ab_pushout_subgroup f g)
|} n -> ?f n = 0
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g
ab_biprod B C $-> Y
exact (ab_biprod_rec b c).
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g
foralln : ab_biprod B C,
{|
normalsubgroup_subgroup := ab_pushout_subgroup f g;
normalsubgroup_isnormal :=
isnormal_ab_subgroup (ab_biprod B C)
(ab_pushout_subgroup f g)
|} n -> ab_biprod_rec b c n = 0
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g x: B y: C q: {x0 : A &
ab_biprod_corec (ab_homo_negation $o f) g x0 =
(x, y)}
b x + c y = 0
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g x: B y: C a: A q: ab_biprod_corec (ab_homo_negation $o f) g a =
(x, y)
b x + c y = 0
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g x: B y: C a: A q: (- f a, g a) = (x, y)
b x + c y = 0
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g x: B y: C a: A q: (- f a, g a) = (x, y)
b (- f a) + c (g a) = 0
A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: b o f == c o g x: B y: C a: A q: (- f a, g a) = (x, y)
- b (f a) + b (f a) = 0
apply left_inverse.Defined.
A, B, C: AbGroup f: A $-> B g: A $-> C Y: AbGroup
{b : B $-> Y & {c : C $-> Y & b o f == c o g}} ->
ab_pushout f g $-> Y
A, B, C: AbGroup f: A $-> B g: A $-> C Y: AbGroup
{b : B $-> Y & {c : C $-> Y & b o f == c o g}} ->
ab_pushout f g $-> Y
intros [b [c p]]; exact (ab_pushout_rec b c p).Defined.Definitionab_pushout_inl {ABC : AbGroup} {f : A $-> B} {g : A $-> C}
: B $-> ab_pushout f g := grp_quotient_map $o grp_prod_inl.Definitionab_pushout_inr {ABC : AbGroup} {f : A $-> B} {g : A $-> C}
: C $-> ab_pushout f g := grp_quotient_map $o grp_prod_inr.
A, B, C: AbGroup f: A $-> B g: A $-> C
ab_pushout_inl $o f == ab_pushout_inr $o g
A, B, C: AbGroup f: A $-> B g: A $-> C
ab_pushout_inl $o f == ab_pushout_inr $o g
A, B, C: AbGroup f: A $-> B g: A $-> C a: A
class_of
(funxy : B * C =>
Tr (-1) {x0 : A & (- f x0, g x0) = - x + y})
(f a, group_unit) =
class_of
(funxy : B * C =>
Tr (-1) {x0 : A & (- f x0, g x0) = - x + y})
(group_unit, g a)
A, B, C: AbGroup f: A $-> B g: A $-> C a: A
ab_biprod_corec (ab_homo_negation $o f) g a =
- (f a, group_unit) + (group_unit, g a)
A, B, C: AbGroup f: A $-> B g: A $-> C a: A
- f a = - f a + group_unit
A, B, C: AbGroup f: A $-> B g: A $-> C a: A
g a = - group_unit + g a
A, B, C: AbGroup f: A $-> B g: A $-> C a: A
- f a = - f a + group_unit
exact (right_identity _)^.
A, B, C: AbGroup f: A $-> B g: A $-> C a: A
g a = - group_unit + g a
A, B, C: AbGroup f: A $-> B g: A $-> C a: A
g a = 0 + g a
exact (left_identity _)^.Defined.(** A map out of the pushout induces itself after restricting along the inclusions. *)
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
ab_pushout_rec (phi $o ab_pushout_inl)
(phi $o ab_pushout_inr)
(funa : A => ap phi (ab_pushout_commsq a)) = phi
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
ab_pushout_rec (phi $o ab_pushout_inl)
(phi $o ab_pushout_inr)
(funa : A => ap phi (ab_pushout_commsq a)) = phi
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
(equiv_quotient_abgroup_ump (ab_pushout_subgroup f g)
Y)^-1%equiv
(ab_pushout_rec (phi $o ab_pushout_inl)
(phi $o ab_pushout_inr)
(funa : A => ap phi (ab_pushout_commsq a))) =
(equiv_quotient_abgroup_ump (ab_pushout_subgroup f g)
Y)^-1%equiv phi
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
((equiv_quotient_abgroup_ump (ab_pushout_subgroup f g)
Y)^-1%equiv
(ab_pushout_rec (phi $o ab_pushout_inl)
(phi $o ab_pushout_inr)
(funa : A => ap phi (ab_pushout_commsq a)))).1 =
((equiv_quotient_abgroup_ump (ab_pushout_subgroup f g)
Y)^-1%equiv phi).1
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y bc: ab_biprod B C
ab_biprod_rec (phi $o ab_pushout_inl)
(phi $o ab_pushout_inr) bc =
((equiv_quotient_abgroup_ump (ab_pushout_subgroup f g)
Y)^-1%equiv phi).1 bc
exact (ab_biprod_rec_eta (phi $o grp_quotient_map) bc).Defined.(** Restricting [ab_pushout_rec] along [ab_pushout_inl] recovers the left inducing map. *)
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g
ab_pushout_rec l r p $o ab_pushout_inl == l
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g
ab_pushout_rec l r p $o ab_pushout_inl == l
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g x: B
l x + r group_unit = l x
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g x: B
l x + 0 = l x
apply right_identity.Defined.
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g
ab_pushout_rec l r p $o ab_pushout_inr == r
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g
ab_pushout_rec l r p $o ab_pushout_inr == r
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g x: C
l group_unit + r x = r x
A, B, C, Y: AbGroup f: A $-> B g: A $-> C l: B $-> Y r: C $-> Y p: l o f == r o g x: C
0 + r x = r x
apply left_identity.Defined.
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
IsEquiv (ab_pushout_rec_uncurried f g Y)
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
IsEquiv (ab_pushout_rec_uncurried f g Y)
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
(ab_pushout f g $-> Y) ->
{b : B $-> Y & {c : C $-> Y & b o f == c o g}}
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
ab_pushout_rec_uncurried f g Y o ?g == idmap
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
?g o ab_pushout_rec_uncurried f g Y == idmap
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
(ab_pushout f g $-> Y) ->
{b : B $-> Y & {c : C $-> Y & b o f == c o g}}
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
{b : B $-> Y & {c : C $-> Y & b o f == c o g}}
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
(funx : A => (phi $o ab_pushout_inl) (f x)) ==
(funx : A => (phi $o ab_pushout_inr) (g x))
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y a: A
(phi $o ab_pushout_inl) (f a) =
(phi $o ab_pushout_inr) (g a)
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y a: A
ab_pushout_inl (f a) = ab_pushout_inr (g a)
exact (ab_pushout_commsq a).
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
ab_pushout_rec_uncurried f g Y
o (funphi : ab_pushout f g $-> Y =>
(phi $o ab_pushout_inl; phi $o ab_pushout_inr;
(funa : A => ap phi (ab_pushout_commsq a))
:
(funx : A => (phi $o ab_pushout_inl) (f x)) ==
(funx : A => (phi $o ab_pushout_inr) (g x)))) ==
idmap
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C phi: ab_pushout f g $-> Y
ab_pushout_rec_uncurried f g Y
(phi $o ab_pushout_inl; phi $o ab_pushout_inr;
funa : A => ap phi (ab_pushout_commsq a)) = phi
exact (ab_pushout_rec_beta phi).
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C
(funphi : ab_pushout f g $-> Y =>
(phi $o ab_pushout_inl; phi $o ab_pushout_inr;
(funa : A => ap phi (ab_pushout_commsq a))
:
(funx : A => (phi $o ab_pushout_inl) (f x)) ==
(funx : A => (phi $o ab_pushout_inr) (g x))))
o ab_pushout_rec_uncurried f g Y == idmap
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)) = (b; c; p)
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).1 = (b; c; p).1
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
transport
(funb : B $-> Y =>
{c : C $-> Y &
(funx : A => b (f x)) == (funx : A => c (g x))})
?p
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2 = (b; c; p).2
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).1 = (b; c; p).1
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).1 == (b; c; p).1
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x)) x: B
b x + c group_unit = b x
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x)) x: B
b x + 0 = b x
apply right_identity.
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
transport
(funb : B $-> Y =>
{c : C $-> Y &
(funx : A => b (f x)) == (funx : A => c (g x))})
(letX := equiv_fun equiv_path_grouphomomorphism in
X
((funx : B =>
ap (funk : Y => b x + k) (grp_homo_unit c) @
right_identity (b x)
:
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).1 x = (b; c; p).1 x)
:
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).1 == (b; c; p).1))
(ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2 = (b; c; p).2
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
(((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).1;
transport
(funx : B $-> Y =>
(funx0 : A => x (f x0)) ==
(funx0 : A =>
((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).1 (g x0)))
(letX := equiv_fun equiv_path_grouphomomorphism in
X
(funx : B =>
ap (funk : Y => b x + k) (grp_homo_unit c) @
right_identity (b x)))
((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).2) = (b; c; p).2
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
(((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).1;
transport
(funx : B $-> Y =>
(funx0 : A => x (f x0)) ==
(funx0 : A =>
((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).1 (g x0)))
(letX := equiv_fun equiv_path_grouphomomorphism in
X
(funx : B =>
ap (funk : Y => b x + k) (grp_homo_unit c) @
right_identity (b x)))
((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).2).1 = ((b; c; p).2).1
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x))
(((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).1;
transport
(funx : B $-> Y =>
(funx0 : A => x (f x0)) ==
(funx0 : A =>
((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).1 (g x0)))
(letX := equiv_fun equiv_path_grouphomomorphism in
X
(funx : B =>
ap (funk : Y => b x + k) (grp_homo_unit c) @
right_identity (b x)))
((ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inl;
ab_pushout_rec_uncurried f g Y (b; c; p) $o
ab_pushout_inr;
funa : A =>
ap (ab_pushout_rec_uncurried f g Y (b; c; p))
(ab_pushout_commsq a)).2).2).1 == ((b; c; p).2).1
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x)) y: C
b group_unit + c y = c y
H: Funext A, B, C, Y: AbGroup f: A $-> B g: A $-> C b: B $-> Y c: C $-> Y p: (funx : A => b (f x)) == (funx : A => c (g x)) y: C
0 + c y = c y
apply left_identity.Defined.
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C bc0, bc1: ab_biprod B C
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B
{x : A &
ab_biprod_corec (ab_homo_negation $o f) g x =
- grp_prod_inl c0 + grp_prod_inl c1} ->
c0 = c1
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit)
c0 = c1
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit)
a = 0
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit) z: a = 0
c0 = c1
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit)
a = 0
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit)
g a = g 0
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit)
- group_unit + group_unit = g 0
exact (left_inverse 0 @ (grp_homo_unit g)^).
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit) z: a = 0
c0 = c1
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit) z: a = 0
0 = - c0 + c1
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit) z: a = 0
- f a = 0
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit) z: a = 0
- f a = - 0
H: Univalence A, B, C: AbGroup f: A $-> B g: A $-> C IsEmbedding0: IsEmbedding g c0, c1: B a: A p: (- f a, g a) =
(- c0 + c1, - group_unit + group_unit) z: a = 0
f a = 0
exact (ap f z @ grp_homo_unit f).Defined.(** Functoriality of pushouts *)
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
ab_pushout f g $-> ab_pushout f' g'
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
ab_pushout f g $-> ab_pushout f' g'
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
B $-> ab_pushout f' g'
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
C $-> ab_pushout f' g'
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
?b o f == ?c o g
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
B $-> ab_pushout f' g'
exact (ab_pushout_inl $o beta).
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
C $-> ab_pushout f' g'
exact (ab_pushout_inr $o gamma).
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g
ab_pushout_inl $o beta o f ==
ab_pushout_inr $o gamma o g
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g a: A
(ab_pushout_inl $o beta) (f a) =
(ab_pushout_inr $o gamma) (g a)
A, A', B, B', C, C': AbGroup f: A $-> B f': A' $-> B' g: A $-> C g': A' $-> C' alpha: A $-> A' beta: B $-> B' gamma: C $-> C' h: beta $o f == f' $o alpha k: g' $o alpha == gamma $o g a: A
ab_pushout_inl ((f' $o alpha) a) =
ab_pushout_inr ((g' $o alpha) a)
exact (ab_pushout_commsq (alpha a)).Defined.(** ** Properties of pushouts of maps *)(** The pushout of an epimorphism is an epimorphism. *)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g
Tr (-1) (hfiber ab_pushout_inr x)
(* To find a preimage of [x], we may first choose a representative [x']. *)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g
merely (hfiber grp_quotient_map x)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g x': merely (hfiber grp_quotient_map x)
Tr (-1) (hfiber ab_pushout_inr x)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g x': merely (hfiber grp_quotient_map x)
Tr (-1) (hfiber ab_pushout_inr x)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x
Tr (-1) (hfiber ab_pushout_inr x)
(* Now [x] = [b + c] in the quotient. We find a preimage of [a]. *)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x
merely (hfiber f b)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: merely (hfiber f b)
Tr (-1) (hfiber ab_pushout_inr x)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: merely (hfiber f b)
Tr (-1) (hfiber ab_pushout_inr x)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
Tr (-1) (hfiber ab_pushout_inr x)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
ab_pushout_inr (g a + c) = x
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
ab_pushout_inr (g a) + ab_pushout_inr c = x
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
?Goal = ab_pushout_inr (g a)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
?Goal + ab_pushout_inr c = x
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
?Goal = ab_pushout_inr (g a)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
(ab_pushout_inl $o f) a = ?Goal
exact (ap _ q).
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
ab_pushout_inl b + ab_pushout_inr c = x
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
grp_prod_inl b + grp_prod_inr c = (b, c)
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
b + group_unit = b
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
group_unit + c = c
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b
b + group_unit = b
apply right_identity.
A, B, C: AbGroup f: A $-> B g: A $-> C S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f x: ab_pushout f g b: B c: C p: grp_quotient_map (b, c) = x a: A q: f a = b