Zulip Chat Archive
Stream: maths
Topic: Showing pushouts of open embedding in schemes are pullbacks
Dhyan Aranha (Feb 13 2026 at 08:50):
I'm currently trying to formalize the following result:
lemma isPullback_of_isPushout_of_isOpenImmersion {U X Y T : Scheme.{u}} (f : U ⟶ X) (g : U ⟶ Y)
(inl : X ⟶ T) (inr : Y ⟶ T) (h : IsPushout f g inl inr)
[IsOpenImmersion f] [IsOpenImmersion g] :
IsPullback f g inl inr := by sorry
Roughly speaking the idea is to use the universal property of open immersions to construct an arrow to show the diagram is a pullback. This reduces to a set-theoretic question and my proof has only one sorry remaining which is:
have range_inter : Set.range inl.base ∩ Set.range inr.base ⊆ Set.range
(f ≫ inl).base := by sorry
I know how to prove an analogue of this result for TopCat because I can use the fact that after applying the forgetful functor I still have a pushout diagram in types. For these kind of gluing pushouts in schemes, the underlying diagram of topological space/types is a pushout in top/type, but how do I show this in Lean? (I see there is some probably relevant stuff in glue data, but I am hesitant/incompetent to use it.)
Any thoughts/help would be great :)
Notification Bot (Feb 13 2026 at 08:52):
This topic was moved here from #maths > Showing pushouts of open embedding i schemes are pullbacks by Dhyan Aranha.
Edward van de Meent (Feb 13 2026 at 10:21):
@Christian Merten didn't we prove something like this at Loki some time ago?
Edward van de Meent (Feb 13 2026 at 10:21):
or no, i think that was something like "open embeddings are preserved under pullback"
Edward van de Meent (Feb 13 2026 at 10:22):
(i'm not sure, not quite my field)
Christian Merten (Feb 13 2026 at 10:29):
Does this help?
import Mathlib
universe u
open CategoryTheory Limits AlgebraicGeometry
instance {X Y Z : Scheme.{u}} (f : Z ⟶ X) (g : Z ⟶ Y) [IsOpenImmersion f]
[IsOpenImmersion g] :
PreservesColimit (span f g) (Scheme.forgetToTop) := by
change PreservesColimit _ (Scheme.forgetToLocallyRingedSpace ⋙
LocallyRingedSpace.forgetToSheafedSpace ⋙ _)
infer_instance
Christian Merten (Feb 13 2026 at 10:30):
(We should have the more general version of this for locally directed diagrams, which has exactly the same proof)
Dhyan Aranha (Feb 16 2026 at 14:15):
@Christian Merten
This exactly what I needed, thanks! [edited: figured out what I needed to do!]
Dhyan Aranha (Feb 18 2026 at 13:48):
@Christian Merten Sorry for this annoyance! I bumped mathlib today and now a lot of my instances have broken. In particular the one you suggested:
import Mathlib
open Polynomial AlgebraicGeometry CategoryTheory CategoryTheory.Limits Scheme TopCat Topology
open LocallyRingedSpace.IsOpenImmersion
instance {X Y Z : Scheme} (f : Z ⟶ X) (g : Z ⟶ Y) [IsOpenImmersion f] [IsOpenImmersion g] :
PreservesColimit (span f g) (Scheme.forgetToTop) := by
change PreservesColimit _ (Scheme.forgetToLocallyRingedSpace ⋙
LocallyRingedSpace.forgetToSheafedSpace ⋙ _)
infer_instance
breaks now.
Christian Merten (Feb 18 2026 at 15:21):
Can you try putting set_option backward.isDefEq.respectTransparency false in above the instance? There has been a Lean version bump yesterday which changed the behaviour of a def-eq check. It is still being discussed what to do about this.
Dhyan Aranha (Feb 18 2026 at 15:23):
it works! Thanks!
Last updated: Feb 28 2026 at 14:05 UTC