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.Require Import HSet.Require Import AbelianGroup.Require Import Modalities.ReflectiveSubuniverse.LocalOpen Scope mc_add_scope.(** * Biproducts of abelian groups *)
A, B: AbGroup
AbGroup
A, B: AbGroup
AbGroup
A, B: AbGroup
Commutative sg_op
A, B: AbGroup a: A b: B a': A b': B
(a, b) + (a', b') = (a', b') + (a, b)
apply path_prod; simpl; apply commutativity.Defined.(** These inherit [IsEmbedding] instances from their [grp_prod] versions. *)Definitionab_biprod_inl {AB : AbGroup} : A $-> ab_biprod A B := grp_prod_inl.Definitionab_biprod_inr {AB : AbGroup} : B $-> ab_biprod A B := grp_prod_inr.(** These inherit [IsSurjection] instances from their [grp_prod] versions. *)Definitionab_biprod_pr1 {AB : AbGroup} : ab_biprod A B $-> A := grp_prod_pr1.Definitionab_biprod_pr2 {AB : AbGroup} : ab_biprod A B $-> B := grp_prod_pr2.
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y)
forallx : ab_biprod A B, P x
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y)
forallx : ab_biprod A B, P x
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y) a: A b: B
P (a, b)
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y) a: A b: B
P (((a, 0) : grp_prod A B) + (0, b))
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y) a: A b: B
P (a, 0)
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y) a: A b: B
P (0, b)
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y) a: A b: B
P (a, 0)
exact (Hinl a).
A, B: AbGroup P: ab_biprod A B -> Type Hinl: foralla : A, P (ab_biprod_inl a) Hinr: forallb : B, P (ab_biprod_inr b) Hop: forallxy : ab_biprod A B,
P x -> P y -> P (x + y) a: A b: B
P (0, b)
exact (Hinr b).Defined.
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
f $== g
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
f $== g
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
foralla : A,
f (ab_biprod_inl a) = g (ab_biprod_inl a)
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
forallb : B,
f (ab_biprod_inr b) = g (ab_biprod_inr b)
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
forallxy : ab_biprod A B,
f x = g x -> f y = g y -> f (x + y) = g (x + y)
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
foralla : A,
f (ab_biprod_inl a) = g (ab_biprod_inl a)
exact Hinl.
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
forallb : B,
f (ab_biprod_inr b) = g (ab_biprod_inr b)
exact Hinr.
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr
forallxy : ab_biprod A B,
f x = g x -> f y = g y -> f (x + y) = g (x + y)
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr x, y: ab_biprod A B p: f x = g x q: f y = g y
f (x + y) = g (x + y)
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr x, y: ab_biprod A B p: f x = g x q: f y = g y
f x + f y = g (x + y)
A, B, C: AbGroup f, g: ab_biprod A B $-> C Hinl: f $o ab_biprod_inl $== g $o ab_biprod_inl Hinr: f $o ab_biprod_inr $== g $o ab_biprod_inr x, y: ab_biprod A B p: f x = g x q: f y = g y
f x + f y = g x + g y
f_ap.Defined.(* Maps out of biproducts are determined on the two inclusions. *)
H: Funext A, B, X: AbGroup phi, psi: ab_biprod A B $-> X
(funphi : ab_biprod A B $-> Y =>
(phi $o ab_biprod_inl, phi $o ab_biprod_inr))
o ab_biprod_rec_uncurried == idmap
H: Funext A, B, Y: AbGroup a: A $-> Y b: B $-> Y
(ab_biprod_rec_uncurried (a, b) $o ab_biprod_inl,
ab_biprod_rec_uncurried (a, b) $o ab_biprod_inr) =
(a, b)
H: Funext A, B, Y: AbGroup a: A $-> Y b: B $-> Y
fst
(ab_biprod_rec_uncurried (a, b) $o ab_biprod_inl,
ab_biprod_rec_uncurried (a, b) $o ab_biprod_inr) =
fst (a, b)
H: Funext A, B, Y: AbGroup a: A $-> Y b: B $-> Y
snd
(ab_biprod_rec_uncurried (a, b) $o ab_biprod_inl,
ab_biprod_rec_uncurried (a, b) $o ab_biprod_inr) =
snd (a, b)
H: Funext A, B, Y: AbGroup a: A $-> Y b: B $-> Y
fst
(ab_biprod_rec_uncurried (a, b) $o ab_biprod_inl,
ab_biprod_rec_uncurried (a, b) $o ab_biprod_inr) =
fst (a, b)
H: Funext A, B, Y: AbGroup a: A $-> Y b: B $-> Y
fst
(ab_biprod_rec_uncurried (a, b) $o ab_biprod_inl,
ab_biprod_rec_uncurried (a, b) $o ab_biprod_inr) ==
fst (a, b)
apply ab_biprod_rec_beta_inl.
H: Funext A, B, Y: AbGroup a: A $-> Y b: B $-> Y
snd
(ab_biprod_rec_uncurried (a, b) $o ab_biprod_inl,
ab_biprod_rec_uncurried (a, b) $o ab_biprod_inr) =
snd (a, b)
H: Funext A, B, Y: AbGroup a: A $-> Y b: B $-> Y
snd
(ab_biprod_rec_uncurried (a, b) $o ab_biprod_inl,
ab_biprod_rec_uncurried (a, b) $o ab_biprod_inr) ==
snd (a, b)
apply ab_biprod_rec_beta_inr.Defined.(** Corecursion principle, inherited from Groups/Group.v. *)Definitionab_biprod_corec {ABX : AbGroup} (f : X $-> A) (g : X $-> B)
: X $-> ab_biprod A B
:= grp_prod_corec f g.(** *** Functoriality of [ab_biprod] *)Definitionfunctor_ab_biprod {AA'BB' : AbGroup} (f : A $-> A') (g: B $-> B')
: ab_biprod A B $-> ab_biprod A' B'
:= (ab_biprod_corec (f $o ab_biprod_pr1) (g $o ab_biprod_pr2)).Definitionab_biprod_functor_beta {ZXYAB : AbGroup} (f0 : Z $-> X) (f1 : Z $-> Y)
(g0 : X $-> A) (g1 : Y $-> B)
: functor_ab_biprod g0 g1 $o ab_biprod_corec f0 f1
$== ab_biprod_corec (g0 $o f0) (g1 $o f1)
:= fun_ => idpath.
Is0Bifunctor ab_biprod
Is0Bifunctor ab_biprod
Is0Functor (uncurry ab_biprod)
forallab : AbGroup * AbGroup,
(a $-> b) ->
uncurry ab_biprod a $-> uncurry ab_biprod b
A, B, A', B': AbGroup f: fst (A, B) $-> fst (A', B') g: snd (A, B) $-> snd (A', B')
uncurry ab_biprod (A, B) $->
uncurry ab_biprod (A', B')
exact (functor_ab_biprod f g).Defined.
Is1Bifunctor ab_biprod
Is1Bifunctor ab_biprod
Is1Functor (uncurry ab_biprod)
forall (ab : AbGroup * AbGroup) (fg : a $-> b),
f $== g ->
fmap (uncurry ab_biprod) f $==
fmap (uncurry ab_biprod) g
foralla : AbGroup * AbGroup,
fmap (uncurry ab_biprod) (Id a) $==
Id (uncurry ab_biprod a)
forall (abc : AbGroup * AbGroup) (f : a $-> b)
(g : b $-> c),
fmap (uncurry ab_biprod) (g $o f) $==
fmap (uncurry ab_biprod) g $o
fmap (uncurry ab_biprod) f
forall (ab : AbGroup * AbGroup) (fg : a $-> b),
f $== g ->
fmap (uncurry ab_biprod) f $==
fmap (uncurry ab_biprod) g
A, B, A', B': AbGroup f: fst (A, B) $-> fst (A', B') g: snd (A, B) $-> snd (A', B') f': fst (A, B) $-> fst (A', B') g': snd (A, B) $-> snd (A', B') p: fst (f, g) $-> fst (f', g') q: snd (f, g) $-> snd (f', g') a: fst (A, B) b: snd (A, B)
fmap (uncurry ab_biprod) (f, g) (a, b) =
fmap (uncurry ab_biprod) (f', g') (a, b)
A, B, A', B': AbGroup f: fst (A, B) $-> fst (A', B') g: snd (A, B) $-> snd (A', B') f': fst (A, B) $-> fst (A', B') g': snd (A, B) $-> snd (A', B') p: fst (f, g) $-> fst (f', g') q: snd (f, g) $-> snd (f', g') a: fst (A, B) b: snd (A, B)
foralla : AbGroup * AbGroup,
fmap (uncurry ab_biprod) (Id a) $==
Id (uncurry ab_biprod a)
reflexivity.
forall (abc : AbGroup * AbGroup) (f : a $-> b)
(g : b $-> c),
fmap (uncurry ab_biprod) (g $o f) $==
fmap (uncurry ab_biprod) g $o
fmap (uncurry ab_biprod) f
cbn; reflexivity.Defined.
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
IsEquiv (functor_ab_biprod f g)
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
IsEquiv (functor_ab_biprod f g)
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
ab_biprod A' B' -> ab_biprod A B
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
functor_ab_biprod f g o ?g == idmap
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
?g o functor_ab_biprod f g == idmap
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
ab_biprod A' B' -> ab_biprod A B
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
GroupIsomorphism A A'
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
GroupIsomorphism B B'
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
GroupIsomorphism A A'
exact (Build_GroupIsomorphism _ _ f _).
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
GroupIsomorphism B B'
exact (Build_GroupIsomorphism _ _ g _).
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
functor_ab_biprod f g
o functor_ab_biprod
(letX :=
funH : GroupIsomorphism A A' =>
grp_iso_homo A' A (grp_iso_inverse H) in
X {| grp_iso_homo := f; isequiv_group_iso := H |})
(letX :=
funH : GroupIsomorphism B B' =>
grp_iso_homo B' B (grp_iso_inverse H) in
X
{|
grp_iso_homo := g; isequiv_group_iso := H0
|}) == idmap
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g
functor_ab_biprod
(letX :=
funH : GroupIsomorphism A A' =>
grp_iso_homo A' A (grp_iso_inverse H) in
X {| grp_iso_homo := f; isequiv_group_iso := H |})
(letX :=
funH : GroupIsomorphism B B' =>
grp_iso_homo B' B (grp_iso_inverse H) in
X {| grp_iso_homo := g; isequiv_group_iso := H0 |})
o functor_ab_biprod f g == idmap
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A' b: B'
(f (f^-1 a), g (g^-1 b)) = (a, b)
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A b: B
(f^-1 (f a), g^-1 (g b)) = (a, b)
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A' b: B'
f (f^-1 a) = a
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A' b: B'
g (g^-1 b) = b
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A b: B
f^-1 (f a) = a
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A b: B
g^-1 (g b) = b
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A b: B
f^-1 (f a) = a
A, A', B, B': AbGroup f: A $-> A' g: B $-> B' H: IsEquiv f H0: IsEquiv g a: A b: B
g^-1 (g b) = b
all: apply eissect.Defined.Definitionequiv_functor_ab_biprod {AA'BB' : AbGroup}
(f : A $-> A') (g : B $-> B') `{IsEquiv _ _ f} `{IsEquiv _ _ g}
: GroupIsomorphism (ab_biprod A B) (ab_biprod A' B')
:= Build_GroupIsomorphism _ _ _ (isequiv_functor_ab_biprod f g).(** Biproducts preserve embeddings. *)
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i'
IsEmbedding (functor_ab_biprod i i')
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i'
IsEmbedding (functor_ab_biprod i i')
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B'
IsHProp (hfiber (functor_ab_biprod i i') (b, b'))
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B'
forallxy : hfiber (functor_ab_biprod i i') (b, b'),
x = y
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b')
((a0, a0'); p) = ((a1, a1'); p')
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b')
(a0, a0') = (a1, a1')
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b') q:= (ap fst p, ap snd p): (i a0 = b) * (i' a0' = b')
(a0, a0') = (a1, a1')
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b') q:= (ap fst p, ap snd p): (i a0 = b) * (i' a0' = b') q':= (ap fst p', ap snd p'): (i a1 = b) * (i' a1' = b')
(a0, a0') = (a1, a1')
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b') q0: i a0 = b q1: i' a0' = b' q0': i a1 = b q1': i' a1' = b'
(a0, a0') = (a1, a1')
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b') q0: i a0 = b q1: i' a0' = b' q0': i a1 = b q1': i' a1' = b'
i a0 = i a1
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b') q0: i a0 = b q1: i' a0' = b' q0': i a1 = b q1': i' a1' = b'
i' a0' = i' a1'
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b') q0: i a0 = b q1: i' a0' = b' q0': i a1 = b q1': i' a1' = b'
i a0 = i a1
exact (q0 @ q0'^).
A, A', B, B': AbGroup i: A $-> B i': A' $-> B' IsEmbedding0: IsEmbedding i IsEmbedding1: IsEmbedding i' b: B b': B' a0: A a0': A' p: (i a0, i' a0') = (b, b') a1: A a1': A' p': (i a1, i' a1') = (b, b') q0: i a0 = b q1: i' a0' = b' q0': i a1 = b q1': i' a1' = b'
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p'
IsConnMap (Tr (-1)) (functor_ab_biprod p p')
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p'
IsConnMap (Tr (-1)) (functor_ab_biprod p p')
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B'
IsConnected (Tr (-1))
(hfiber (functor_ab_biprod p p') (b, b'))
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a: IsConnected (Tr (-1)) (hfiber p b) a': IsConnected (Tr (-1)) (hfiber p' b')
IsConnected (Tr (-1))
(hfiber (functor_ab_biprod p p') (b, b'))
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a: Tr (-1) (hfiber p b) a': Tr (-1) (hfiber p' b')
IsConnected (Tr (-1))
(hfiber (functor_ab_biprod p p') (b, b'))
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
IsConnected (Tr (-1))
(hfiber (functor_ab_biprod p p') (b, b'))
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
Tr (-1) (hfiber (functor_ab_biprod p p') (b, b'))
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
hfiber (functor_ab_biprod p p') (b, b')
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
p a.1 + 0 = b
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
0 + p' a'.1 = b'
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
p a.1 + 0 = b
exact (right_identity _ @ a.2).
H: Funext A, A', B, B': AbGroup p: A $-> B p': A' $-> B' S: IsConnMap (Tr (-1)) p S': IsConnMap (Tr (-1)) p' b: B b': B' a': hfiber p' b' a: hfiber p b
0 + p' a'.1 = b'
exact (left_identity _ @ a'.2).Defined.(** *** Lemmas for working with biproducts *)(** The swap isomorphism of the biproduct of two groups. *)
A, B: AbGroup
ab_biprod A B $<~> ab_biprod B A
A, B: AbGroup
ab_biprod A B $<~> ab_biprod B A
A, B: AbGroup
ab_biprod A B <~> ab_biprod B A
A, B: AbGroup
IsSemiGroupPreserving ?f
A, B: AbGroup
ab_biprod A B <~> ab_biprod B A
apply equiv_prod_symm.
A, B: AbGroup
IsSemiGroupPreserving (equiv_prod_symm A B)
intro; reflexivity.Defined.(** Addition [+] is a group homomorphism [A+A -> A]. *)Definitionab_codiagonal {A : AbGroup} : ab_biprod A A $-> A
:= ab_biprod_rec grp_homo_id grp_homo_id.Definitionab_codiagonal_natural {AB : AbGroup} (f : A $-> B)
: f $o ab_codiagonal $== ab_codiagonal $o functor_ab_biprod f f
:= funa => grp_homo_op f _ _.Definitionab_diagonal {A : AbGroup} : A $-> ab_biprod A A
:= ab_biprod_corec grp_homo_id grp_homo_id.(** Given two abelian group homomorphisms [f] and [g], their pairing [(f, g) : B -> A + A] can be written as a composite. Note that [ab_biprod_corec] is an alias for [grp_prod_corec]. *)
H: Funext A, B: AbGroup f, g: B $-> A
ab_biprod_corec f g =
functor_ab_biprod f g $o ab_diagonal
H: Funext A, B: AbGroup f, g: B $-> A
ab_biprod_corec f g =
functor_ab_biprod f g $o ab_diagonal
apply equiv_path_grouphomomorphism; reflexivity.Defined.(** Precomposing the codiagonal with the swap map has no effect. *)
H: Funext A: AbGroup
ab_codiagonal $o direct_sum_swap = ab_codiagonal
H: Funext A: AbGroup
ab_codiagonal $o direct_sum_swap = ab_codiagonal
H: Funext A: AbGroup
ab_codiagonal $o direct_sum_swap == ab_codiagonal
H: Funext A: AbGroup a: ab_biprod A A
snd a + fst a = fst a + snd a
exact (abgroup_commutative _ _ _).Defined.(** The corresponding result for the diagonal is true definitionally, so it isn't strictly necessary to state it, but we record it anyways. *)Definitionab_diagonal_swap {A : AbGroup}
: direct_sum_swap $o (@ab_diagonal A) = ab_diagonal
:= idpath.(** The biproduct is associative. *)
A, B, C: AbGroup
ab_biprod A (ab_biprod B C) $<~>
ab_biprod (ab_biprod A B) C
A, B, C: AbGroup
ab_biprod A (ab_biprod B C) $<~>
ab_biprod (ab_biprod A B) C
A, B, C: AbGroup
ab_biprod A (ab_biprod B C) <~>
ab_biprod (ab_biprod A B) C
A, B, C: AbGroup
IsSemiGroupPreserving ?f
A, B, C: AbGroup
ab_biprod A (ab_biprod B C) <~>
ab_biprod (ab_biprod A B) C
apply equiv_prod_assoc.
A, B, C: AbGroup
IsSemiGroupPreserving (equiv_prod_assoc A B C)
unfold IsSemiGroupPreserving; reflexivity.Defined.(** The iterated diagonals [(ab_diagonal + id) o ab_diagonal] and [(id + ab_diagonal) o ab_diagonal] agree, after reassociating the direct sum. *)Definitionab_commute_id_diagonal {A : AbGroup}
: (functor_ab_biprod (@ab_diagonal A) grp_homo_id) $o ab_diagonal
= ab_biprod_assoc $o (functor_ab_biprod grp_homo_id ab_diagonal) $o ab_diagonal
:= idpath.(** A similar result for the codiagonal. *)
H: Funext A: AbGroup a: ab_biprod A (ab_biprod A A)
fst a + fst (snd a) + snd (snd a) =
fst a + (fst (snd a) + snd (snd a))
exact (grp_assoc _ _ _)^.Defined.(** The next few results are used to prove associativity of the Baer sum. *)(** A "twist" isomorphism [(A + B) + C <~> (C + B) + A]. *)
A, B, C: AbGroup
ab_biprod (ab_biprod A B) C $<~>
ab_biprod (ab_biprod C B) A
A, B, C: AbGroup
ab_biprod (ab_biprod A B) C $<~>
ab_biprod (ab_biprod C B) A
A, B, C: AbGroup
GroupHomomorphism (ab_biprod (ab_biprod A B) C)
(ab_biprod (ab_biprod C B) A)
A, B, C: AbGroup
IsEquiv ?grp_iso_homo
A, B, C: AbGroup
GroupHomomorphism (ab_biprod (ab_biprod A B) C)
(ab_biprod (ab_biprod C B) A)
A, B, C: AbGroup
ab_biprod (ab_biprod A B) C ->
ab_biprod (ab_biprod C B) A
A, B, C: AbGroup
IsSemiGroupPreserving ?grp_homo_map
A, B, C: AbGroup
ab_biprod (ab_biprod A B) C ->
ab_biprod (ab_biprod C B) A
A, B, C: AbGroup a: A b: B c: C
ab_biprod (ab_biprod C B) A
exact ((c,b),a).
A, B, C: AbGroup
IsSemiGroupPreserving
(funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X) (snd X))
IsEquiv
{|
grp_homo_map :=
funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X) (snd X);
issemigrouppreserving_grp_homo :=
(funxy : ab_biprod (ab_biprod A B) C => 1)
:
IsSemiGroupPreserving
(funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X)
(snd X))
|}
A, B, C: AbGroup
ab_biprod (ab_biprod C B) A ->
ab_biprod (ab_biprod A B) C
A, B, C: AbGroup
{|
grp_homo_map :=
funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X) (snd X);
issemigrouppreserving_grp_homo :=
(funxy : ab_biprod (ab_biprod A B) C => 1)
:
IsSemiGroupPreserving
(funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X)
(snd X))
|} o ?g == idmap
A, B, C: AbGroup
?g
o {|
grp_homo_map :=
funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X) (snd X);
issemigrouppreserving_grp_homo :=
(funxy : ab_biprod (ab_biprod A B) C => 1)
:
IsSemiGroupPreserving
(funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X)
(snd X))
|} == idmap
A, B, C: AbGroup
ab_biprod (ab_biprod C B) A ->
ab_biprod (ab_biprod A B) C
A, B, C: AbGroup c: C b: B a: A
ab_biprod (ab_biprod A B) C
exact ((a,b),c).
A, B, C: AbGroup
{|
grp_homo_map :=
funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X) (snd X);
issemigrouppreserving_grp_homo :=
(funxy : ab_biprod (ab_biprod A B) C => 1)
:
IsSemiGroupPreserving
(funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X)
(snd X))
|}
o (funX : ab_biprod (ab_biprod C B) A =>
(funfst : ab_biprod C B =>
(fun (c : C) (b : B) (a : A) => (a, b, c))
(Overture.fst fst) (snd fst)) (fst X) (snd X)) ==
idmap
reflexivity.
A, B, C: AbGroup
(funX : ab_biprod (ab_biprod C B) A =>
(funfst : ab_biprod C B =>
(fun (c : C) (b : B) (a : A) => (a, b, c))
(Overture.fst fst) (snd fst)) (fst X) (snd X))
o {|
grp_homo_map :=
funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X) (snd X);
issemigrouppreserving_grp_homo :=
(funxy : ab_biprod (ab_biprod A B) C => 1)
:
IsSemiGroupPreserving
(funX : ab_biprod (ab_biprod A B) C =>
(funfst : ab_biprod A B =>
(fun (a : A) (b : B) (c : C) => (c, b, a))
(Overture.fst fst) (snd fst)) (fst X)
(snd X))
|} == idmap
reflexivity.Defined.(** The triagonal and cotriagonal homomorphisms. *)Definitionab_triagonal {A : AbGroup} : A $-> ab_biprod (ab_biprod A A) A
:= (functor_ab_biprod ab_diagonal grp_homo_id) $o ab_diagonal.Definitionab_cotriagonal {A : AbGroup} : ab_biprod (ab_biprod A A) A $-> A
:= ab_codiagonal $o (functor_ab_biprod ab_codiagonal grp_homo_id).(** For an abelian group [A], precomposing the triagonal on [A] with the twist map on [A] has no effect. *)Definitionab_triagonal_twist {A : AbGroup}
: ab_biprod_twist $o @ab_triagonal A = ab_triagonal
:= idpath.(** A similar result for the cotriagonal. *)