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 WildCat.Core HSet. Require Export Algebra.Groups.Image Algebra.Groups.QuotientGroup. Require Import AbGroups.AbelianGroup AbGroups.Biproduct. Local Open Scope mc_scope. Local Open 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. *) Definition ab_pushout_subgroup {A B C : AbGroup} (f : A $-> B) (g : A $-> C) : Subgroup (ab_biprod B C) := grp_image (ab_biprod_corec (ab_homo_negation $o f) g). Definition ab_pushout {A B C : 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
forall n : 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 = mon_unit
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

forall n : 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 = mon_unit
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: {a : A & ab_biprod_corec (ab_homo_negation $o f) g a = (x, y)}

b x + c y = mon_unit
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 = mon_unit
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 = mon_unit
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)

uncurry (fun (x : B) (y : C) => b x + c y) (- f a, g a) = mon_unit
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) = mon_unit
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) = mon_unit
exact (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. Definition ab_pushout_inl {A B C : AbGroup} {f : A $-> B} {g : A $-> C} : B $-> ab_pushout f g := grp_quotient_map $o grp_prod_inl. Definition ab_pushout_inr {A B C : 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

(ab_pushout_inl $o f) a = (ab_pushout_inr $o g) a
A, B, C: AbGroup
f: A $-> B
g: A $-> C
a: A

Trunc (-1) {a0 : A & (- f a0, g a0) = (- f a + group_unit, - group_unit + g a)}
A, B, C: AbGroup
f: A $-> B
g: A $-> C
a: A

{a0 : A & (- f a0, g a0) = (- f a + group_unit, - group_unit + g a)}
A, B, C: AbGroup
f: A $-> B
g: A $-> C
a: A

(- f a, 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 = mon_unit + 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) (fun a : 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) (fun a : 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) (fun a : 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) (fun a : 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

ab_biprod_rec (phi $o ab_pushout_inl) (phi $o ab_pushout_inr) = (((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
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 + mon_unit = 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

mon_unit + 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

(fun x : A => (phi $o ab_pushout_inl) (f x)) == (fun x : 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 (fun phi : ab_pushout f g $-> Y => (phi $o ab_pushout_inl; phi $o ab_pushout_inr; (fun a : A => ap phi (ab_pushout_commsq a)) : (fun x : A => (phi $o ab_pushout_inl) (f x)) == (fun x : 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; fun a : 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

(fun phi : ab_pushout f g $-> Y => (phi $o ab_pushout_inl; phi $o ab_pushout_inr; (fun a : A => ap phi (ab_pushout_commsq a)) : (fun x : A => (phi $o ab_pushout_inl) (f x)) == (fun x : 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: (fun x : A => b (f x)) == (fun x : 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; fun a : 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: (fun x : A => b (f x)) == (fun x : 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; fun a : 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: (fun x : A => b (f x)) == (fun x : A => c (g x))
transport (fun b : B $-> Y => {c : C $-> Y & (fun x : A => b (f x)) == (fun x : 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; fun a : 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: (fun x : A => b (f x)) == (fun x : 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; fun a : 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: (fun x : A => b (f x)) == (fun x : 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; fun a : 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: (fun x : A => b (f x)) == (fun x : 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: (fun x : A => b (f x)) == (fun x : A => c (g x))
x: B

b x + mon_unit = 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: (fun x : A => b (f x)) == (fun x : A => c (g x))

transport (fun b : B $-> Y => {c : C $-> Y & (fun x : A => b (f x)) == (fun x : A => c (g x))}) (let X := equiv_fun equiv_path_grouphomomorphism in X ((fun x : B => ap (fun k : 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; fun a : 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; fun a : 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; fun a : 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: (fun x : A => b (f x)) == (fun x : 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; fun a : A => ap (ab_pushout_rec_uncurried f g Y (b; c; p)) (ab_pushout_commsq a)).2).1; transport (fun x : B $-> Y => (fun x0 : A => x (f x0)) == (fun x0 : 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; fun a : A => ap (ab_pushout_rec_uncurried f g Y (b; c; p)) (ab_pushout_commsq a)).2).1 (g x0))) (let X := equiv_fun equiv_path_grouphomomorphism in X (fun x : B => ap (fun k : 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; fun a : 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: (fun x : A => b (f x)) == (fun x : A => c (g x))

grp_homo_compose (ab_pushout_rec_uncurried f g Y (b; c; p)) ab_pushout_inr = c
H: Funext
A, B, C, Y: AbGroup
f: A $-> B
g: A $-> C
b: B $-> Y
c: C $-> Y
p: (fun x : A => b (f x)) == (fun x : A => c (g x))

grp_homo_compose (ab_pushout_rec_uncurried f g Y (b; c; p)) ab_pushout_inr == c
H: Funext
A, B, C, Y: AbGroup
f: A $-> B
g: A $-> C
b: B $-> Y
c: C $-> Y
p: (fun x : A => b (f x)) == (fun x : 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: (fun x : A => b (f x)) == (fun x : A => c (g x))
y: C

mon_unit + 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

in_cosetL (ab_pushout_subgroup f g) bc0 bc1 <~> grp_quotient_map bc0 = grp_quotient_map bc1
H: Univalence
A, B, C: AbGroup
f: A $-> B
g: A $-> C
bc0, bc1: ab_biprod B C

in_cosetL (ab_pushout_subgroup f g) bc0 bc1 <~> grp_quotient_map bc0 = grp_quotient_map bc1
rapply path_quotient. Defined. (** The pushout of an embedding is an embedding. *)
H: Univalence
A, B, C: AbGroup
f: A $-> B
g: A $-> C
IsEmbedding0: IsEmbedding g

IsEmbedding ab_pushout_inl
H: Univalence
A, B, C: AbGroup
f: A $-> B
g: A $-> C
IsEmbedding0: IsEmbedding g

IsEmbedding ab_pushout_inl
H: Univalence
A, B, C: AbGroup
f: A $-> B
g: A $-> C
IsEmbedding0: IsEmbedding g

isinj ab_pushout_inl
H: Univalence
A, B, C: AbGroup
f: A $-> B
g: A $-> C
IsEmbedding0: IsEmbedding g
c0, c1: B

ab_pushout_inl c0 = ab_pushout_inl c1 -> c0 = c1
H: Univalence
A, B, C: AbGroup
f: A $-> B
g: A $-> C
IsEmbedding0: IsEmbedding g
c0, c1: B

in_cosetL (ab_pushout_subgroup f g) (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 & ab_biprod_corec (ab_homo_negation $o f) g a = - 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 = mon_unit
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 = mon_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 = mon_unit
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 mon_unit
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 mon_unit
exact (left_inverse mon_unit @ (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 = mon_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)
z: a = mon_unit

mon_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)
z: a = mon_unit

- f a = mon_unit
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 = mon_unit

- f a = - mon_unit
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 = mon_unit

f a = mon_unit
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

ReflectiveSubuniverse.IsConnMap (Tr (-1)) ab_pushout_inr
A, B, C: AbGroup
f: A $-> B
g: A $-> C
S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f

ReflectiveSubuniverse.IsConnMap (Tr (-1)) ab_pushout_inr
A, B, C: AbGroup
f: A $-> B
g: A $-> C
S: ReflectiveSubuniverse.IsConnMap (Tr (-1)) f
x: ab_pushout f g

ReflectiveSubuniverse.IsConnected (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

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

group_unit + c = c
apply left_identity. Defined.