Zulip Chat Archive
Stream: maths
Topic: pushout of biprod.fst and biprod.snd is zero
Scott Morrison (May 18 2022 at 02:16):
This is a maths question, where I'm hoping I'm missing an easier proof.
Say I have a biproduct of two objects X and Y, with projection maps biprod.fst : X ⊞ Y ⟶ X and biprod.snd : X ⊞ Y ⟶ Y, and inclusion maps biprod.inl and biprod.inr, satisfying the usual identities.
I want to say that the square formed by biprod.fst, biprod.snd, and the zero maps 0 : X ⟶ 0 and 0 : Y ⟶ 0 is a pushout square.
I was sure it was going to be easy, but ... the best I can come up with is:
The biproduct is also a coproduct, so we can compute
pushout biprod.fst biprod.sndascoequalizer (biprod.fst ≫ biprod.inl) (biprod.snd ≫ biprod.inr), and then by assuming our category is preadditive, this iscokernel (biprod.fst ≫ biprod.inl - biprod.snd ≫ biprod.inr), but then that map is an involution (calculate!), so an isomorphism, so that cokernel is zero.
Any suggestions? Even just a compilation of this argument to one that avoids talking about coequalizers and cokernels would probably help. (Is it true without assuming preadditivity?)
Adam Topaz (May 18 2022 at 02:47):
If you have a square diagram with say Z instead of 0, then I think it suffices to show that the maps from A and B to Z are both zero. But by the commutativity of the diagram and properties of the biproduct, the map from A to Z should factor via the inclusion of A to the biproduct, followed by the projection to B then the map from B to Z, and this should be zero from the properties of the biproduct. I haven't written anything down, but I think(???) this works?
Scott Morrison (May 18 2022 at 03:00):
I don't see the "should factor" step in that argument.
Adam Topaz (May 18 2022 at 03:02):
That's because the incl of A into the biprod followed by the projection toA is the identity
Adam Topaz (May 18 2022 at 03:03):
So write the map from A to Z as the incl of A to the biprod, followed by proj to A followed by the map to Z, then use the commutativity of the square
Adam Topaz (May 18 2022 at 03:04):
(sorry for the bad typesetting... I'm on mobile)
Scott Morrison (May 18 2022 at 03:04):
Perfect, thank you. :-)
Reid Barton (May 18 2022 at 06:28):
The top left square is a pushout by definition, and the two big rectangles are trivially pushouts, so by using pushout cancellation twice, so is the bottom right square.
Scott Morrison (May 18 2022 at 06:30):
Oh, now I want to formalise this one, precisely because our API for this style of argument is still missing.
Scott Morrison (May 18 2022 at 06:31):
Was some of this done in LTE?
Johan Commelin (May 18 2022 at 06:32):
I think Andrew set up this kind of API when doing pullbacks of schemes.
Johan Commelin (May 18 2022 at 06:32):
But I don't know if it was dualised to include pushouts.
Scott Morrison (May 18 2022 at 06:34):
docs#category_theory.limits.right_square_is_pushout
Reid Barton (May 18 2022 at 06:35):
I made some arguments like this one in lean-homotopy-theory, though it wasn't for the mathlib notion of pushout (which didn't yet exist). e.g. using https://github.com/rwbarton/lean-homotopy-theory/blob/lean-3.4.2/src/category_theory/pasting_pushouts.lean and https://github.com/rwbarton/lean-homotopy-theory/blob/lean-3.4.2/src/category_theory/colimit_lemmas.lean
Scott Morrison (May 18 2022 at 06:36):
How would everyone feel about migrating Reid's Is_pushout to mathlib?
Scott Morrison (May 18 2022 at 06:37):
(i.e. a prop-valued thing parameterised by four morphisms)
Scott Morrison (May 18 2022 at 06:37):
Maybe call it pushout_square instead? (To avoid another is_*)
Scott Morrison (May 18 2022 at 06:37):
It becomes yet-another-way to talk about limits, and therefor some additional API cost for glue
Scott Morrison (May 18 2022 at 06:38):
But it would still let us state Andrew's docs#category_theory.limits.right_square_is_pushout much more succinctly.
Scott Morrison (May 18 2022 at 06:39):
I noticed that LTE/for_mathlib has a is_biprod structure.
Scott Morrison (May 18 2022 at 12:37):
Bhavik Mehta (May 18 2022 at 17:40):
Yeah I think this is an excellent idea - I either made a poor version of it in the topos project or thought about doing it! I think it would definitely make this sort of argument easier to formalise
Scott Morrison (May 18 2022 at 22:30):
Should we call it cartesian rather than pullback_square? I think I prefer pullback_square, although then I don't know what to call bicartesian.
Johan Commelin (May 19 2022 at 05:19):
cartesian is shorter, and doesn't contain a _. So I would vote for that.
Bhavik Mehta (May 19 2022 at 13:14):
And then cocartesian for pushout_square? I slightly prefer pullback_square: cartesian is overloaded plenty, but I'd be happy either way
Johan Commelin (May 19 2022 at 13:16):
How about commsq.pullback?
Johan Commelin (May 19 2022 at 13:17):
In LTE I defined commsq. I think it's a useful shorthand, and it provides an anchor for dot-notation.
Johan Commelin (May 19 2022 at 13:17):
For h : commsq a b c d you get h.w and h.w_assoc, and of course h.symm.
Bhavik Mehta (May 19 2022 at 13:19):
That sounds sensible to me, although it kind of opens the door to commtri? (and its dual commcotri)! Also I suppose comm_sq would be better?
Markus Himmel (May 19 2022 at 13:35):
There is also the option of stating being a pullback square for morphisms in the arrow category, though I'm not sure how ergonomic that would be
Reid Barton (May 19 2022 at 13:45):
I assume commsq is a bundled commutative square; then how do you state the pushout pasting lemma?
Johan Commelin (May 19 2022 at 13:46):
No, it isn't bundled. a b c d are 4 morphisms.
Reid Barton (May 19 2022 at 13:53):
oh it's a Prop?
Johan Commelin (May 19 2022 at 13:54):
For technical reasons, no. But a Prop-version seems quite useful to me.
Reid Barton (May 19 2022 at 13:54):
Where is the definition?
Johan Commelin (May 19 2022 at 13:55):
In the salamander lemma, you need to consider the direct sum of the two objects on the antidiagonal. So I bundled that into the defn.
Johan Commelin (May 19 2022 at 13:55):
That way you can get commsq.op and commsq.symm with nice defeqs.
Reid Barton (May 19 2022 at 13:55):
OK, well normally two objects don't have a direct sum :upside_down:
Johan Commelin (May 19 2022 at 13:55):
It also assumed an ab cat :see_no_evil:
Johan Commelin (May 19 2022 at 13:55):
https://github.com/leanprover-community/lean-liquid/blob/master/src/for_mathlib/commsq.lean
Johan Commelin (May 19 2022 at 13:56):
But I think simply a Prop version could already be useful, and have a nice API.
Johan Commelin (May 19 2022 at 13:56):
My crazy contraption can have a different name (-;
Reid Barton (May 19 2022 at 13:56):
So the Prop version is just (w : g₁₁ ≫ f₂₁ = f₁₁ ≫ g₁₂)?
Johan Commelin (May 19 2022 at 13:57):
Yes
Johan Commelin (May 19 2022 at 13:57):
Se the of_eq constructor.
Reid Barton (May 19 2022 at 13:57):
I think this could be useful, then is_pushout and is_pullback can extend it
Johan Commelin (May 19 2022 at 13:57):
Maybe assume it, instead of extending?
Johan Commelin (May 19 2022 at 13:58):
Then you can write h.is_pushout
Johan Commelin (May 19 2022 at 13:58):
And sq1.hcomp sq2 (idem for .vcomp). That way the pasting lemmas would become quite nice, I think.
Johan Commelin (May 19 2022 at 13:59):
h.op.is_pullback \iff h.is_pushout etc...
Reid Barton (May 19 2022 at 13:59):
What do you mean "assume"?
Johan Commelin (May 19 2022 at 13:59):
As an explicit parameter
Johan Commelin (May 19 2022 at 13:59):
def commsq.is_pullback (h : commsq a b c d) : Prop := blabla
Reid Barton (May 19 2022 at 14:00):
Oh I see, but somehow it feels a bit more awkward because it suggests you would have to prove the square commutes, before talking about whether it is a pushout
Reid Barton (May 19 2022 at 14:00):
but I guess you have a style in mind where you don't actually do that
Reid Barton (May 19 2022 at 14:02):
i.e. in l-h-t you can just write Is_pushout f g h k, rather than \<show f >> g = h >> k, by assumption\>.is_pushout or whatever
Reid Barton (May 19 2022 at 14:02):
(ok if the proof is by assumption it's a bad example, but maybe it will be by simp etc)
Johan Commelin (May 19 2022 at 14:06):
Yeah, I see. I think both use cases are nice.
Johan Commelin (May 19 2022 at 14:08):
I have in mind statements like:
lemma pasting (h : sq1.is_pushout) :
(sq1.hcomp sq2).is_pushout \iff sq2.is_pushout
Johan Commelin (May 19 2022 at 14:10):
Maybe the base for the dot-notation should be a law-less (but type correct) square?
Johan Commelin (May 19 2022 at 14:10):
And then you have sq.is_comm and sq.is_pullback can extend that?
Reid Barton (May 19 2022 at 14:11):
Johan Commelin said:
Maybe the base for the dot-notation should be a law-less (but type correct) square?
So this is just the proposition true?
Reid Barton (May 19 2022 at 14:11):
I think this might also be awkward in the goal view
Reid Barton (May 19 2022 at 14:12):
Also I'm not sure how well this works with rewriting along equalities of morphisms
Johan Commelin (May 19 2022 at 14:13):
What do you mean?
Johan Commelin (May 19 2022 at 14:13):
.w gives you back the actual equality condition
Reid Barton (May 19 2022 at 14:13):
e.g. if my goal is Is_pushout f g h k and I have H : f = f' I know how to rw H
Reid Barton (May 19 2022 at 14:13):
if my goal is (sq : anysq f g h k).is_pushout then I don't think I can rw H
Johan Commelin (May 19 2022 at 14:13):
Hmm, I see.
Reid Barton (May 19 2022 at 14:16):
(and that's quite a common thing to do, e.g., you need to do it several times in the proof that started this discussion)
Scott Morrison (May 23 2022 at 05:31):
I've added comm_sq, renamed pullback_square to is_pullback, and have it extend comm_sq. I added comm_sq.of_arrow, but no further API relating comm_sq to the arrow category as yet. I think this PR (#14220) is ready for review for now.
Johan Commelin (May 23 2022 at 05:58):
Why do you call the constructors mk' if you don't provide a mk? Or am I blind?
Scott Morrison (May 23 2022 at 06:41):
Not sure what happened there. Removed.
Johan Commelin (May 23 2022 at 16:09):
I just realized that I would really like to have functor.map_comm_sq :grinning:
Scott Morrison (May 24 2022 at 10:25):
Scott Morrison (May 24 2022 at 10:25):
(Also for functor.map_is_pullback etc)
Scott Morrison (May 25 2022 at 04:49):
The rest of Reid's argument is in #14375.
Bhavik Mehta (May 26 2022 at 16:18):
It would be nice to use this to refactor docs#category_theory.is_kernel_pair
Bhavik Mehta (May 26 2022 at 16:18):
in fact looking at that again, most of what I did in that file are (useful) special cases of comm_sq
Scott Morrison (May 27 2022 at 01:15):
One difference is that in is_pullback I wrapped is_limit in nonempty, so we have is_pullback : Prop. Do you think it would be okay to change kernel_pair like that?
Bhavik Mehta (May 27 2022 at 12:57):
Probably - it's subsingleton (not just up to iso) so I expect it should be fine
Last updated: May 02 2025 at 03:31 UTC