Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 1367c19

Browse files
committed
feat(algebraic_geometry): LocallyRingedSpace has coproducts. (#10665)
1 parent 9078914 commit 1367c19

File tree

5 files changed

+224
-0
lines changed

5 files changed

+224
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/-
2+
Copyright (c) 2021 Andrew Yang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Andrew Yang
5+
-/
6+
import algebraic_geometry.locally_ringed_space
7+
import algebra.category.CommRing.constructions
8+
import algebraic_geometry.open_immersion
9+
import category_theory.limits.constructions.limits_of_products_and_equalizers
10+
11+
/-!
12+
# Colimits of LocallyRingedSpace
13+
14+
We construct the explict coproducts of `LocallyRingedSpace`.
15+
16+
## TODO
17+
18+
Construct the explict coequalizers of `LocallyRingedSpace`.
19+
It then follows that `LocallyRingedSpace` has all colimits, and
20+
`forget_to_SheafedSpace` preserves them.
21+
22+
-/
23+
24+
namespace algebraic_geometry
25+
26+
universes v u
27+
28+
open category_theory category_theory.limits opposite
29+
30+
namespace SheafedSpace
31+
32+
variables {C : Type u} [category.{v} C] [has_limits C]
33+
variables {J : Type v} [category.{v} J] (F : J ⥤ SheafedSpace C)
34+
35+
lemma is_colimit_exists_rep {c : cocone F} (hc : is_colimit c) (x : c.X) :
36+
∃ (i : J) (y : F.obj i), (c.ι.app i).base y = x :=
37+
concrete.is_colimit_exists_rep (F ⋙ SheafedSpace.forget _)
38+
(is_colimit_of_preserves (SheafedSpace.forget _) hc) x
39+
40+
lemma colimit_exists_rep (x : colimit F) :
41+
∃ (i : J) (y : F.obj i), (colimit.ι F i).base y = x :=
42+
concrete.is_colimit_exists_rep (F ⋙ SheafedSpace.forget _)
43+
(is_colimit_of_preserves (SheafedSpace.forget _) (colimit.is_colimit F)) x
44+
45+
instance {X Y : SheafedSpace C} (f g : X ⟶ Y) : epi (coequalizer.π f g).base :=
46+
begin
47+
erw ← (show _ = (coequalizer.π f g).base, from
48+
ι_comp_coequalizer_comparison f g (SheafedSpace.forget C)),
49+
rw ← preserves_coequalizer.iso_hom,
50+
apply epi_comp
51+
end
52+
53+
end SheafedSpace
54+
55+
namespace LocallyRingedSpace
56+
57+
section has_coproducts
58+
59+
variables {ι : Type u} (F : discrete ι ⥤ LocallyRingedSpace.{u})
60+
61+
/-- The explicit coproduct for `F : discrete ι ⥤ LocallyRingedSpace`. -/
62+
noncomputable
63+
def coproduct : LocallyRingedSpace :=
64+
{ to_SheafedSpace := colimit (F ⋙ forget_to_SheafedSpace : _),
65+
local_ring := λ x, begin
66+
obtain ⟨i, y, ⟨⟩⟩ := SheafedSpace.colimit_exists_rep (F ⋙ forget_to_SheafedSpace) x,
67+
haveI : _root_.local_ring (((F ⋙ forget_to_SheafedSpace).obj i).to_PresheafedSpace.stalk y) :=
68+
(F.obj i).local_ring _,
69+
exact (as_iso (PresheafedSpace.stalk_map (colimit.ι (F ⋙ forget_to_SheafedSpace) i : _) y)
70+
).symm.CommRing_iso_to_ring_equiv.local_ring
71+
end }
72+
73+
/-- The explicit coproduct cofan for `F : discrete ι ⥤ LocallyRingedSpace`. -/
74+
noncomputable
75+
def coproduct_cofan : cocone F :=
76+
{ X := coproduct F,
77+
ι := { app := λ j, ⟨colimit.ι (F ⋙ forget_to_SheafedSpace) j, infer_instance⟩ } }
78+
79+
/-- The explicit coproduct cofan constructed in `coproduct_cofan` is indeed a colimit. -/
80+
noncomputable
81+
def coproduct_cofan_is_colimit : is_colimit (coproduct_cofan F) :=
82+
{ desc := λ s, ⟨colimit.desc (F ⋙ forget_to_SheafedSpace) (forget_to_SheafedSpace.map_cocone s),
83+
begin
84+
intro x,
85+
obtain ⟨i, y, ⟨⟩⟩ := SheafedSpace.colimit_exists_rep (F ⋙ forget_to_SheafedSpace) x,
86+
have := PresheafedSpace.stalk_map.comp (colimit.ι (F ⋙ forget_to_SheafedSpace) i : _)
87+
(colimit.desc (F ⋙ forget_to_SheafedSpace) (forget_to_SheafedSpace.map_cocone s)) y,
88+
rw ← is_iso.comp_inv_eq at this,
89+
erw [← this, PresheafedSpace.stalk_map.congr_hom _ _
90+
(colimit.ι_desc (forget_to_SheafedSpace.map_cocone s) i : _)],
91+
haveI : is_local_ring_hom (PresheafedSpace.stalk_map
92+
((forget_to_SheafedSpace.map_cocone s).ι.app i) y) := (s.ι.app i).2 y,
93+
apply_instance
94+
end⟩,
95+
fac' := λ s j, subtype.eq (colimit.ι_desc _ _),
96+
uniq' := λ s f h, subtype.eq (is_colimit.uniq _ (forget_to_SheafedSpace.map_cocone s) f.1
97+
(λ j, congr_arg subtype.val (h j))) }
98+
99+
instance : has_coproducts LocallyRingedSpace.{u} :=
100+
λ ι, ⟨λ F, ⟨⟨⟨_, coproduct_cofan_is_colimit F⟩⟩⟩⟩
101+
102+
noncomputable
103+
instance (J : Type*) : preserves_colimits_of_shape (discrete J) forget_to_SheafedSpace :=
104+
⟨λ G, preserves_colimit_of_preserves_colimit_cocone (coproduct_cofan_is_colimit G)
105+
((colimit.is_colimit _).of_iso_colimit (cocones.ext (iso.refl _) (λ j, category.comp_id _)))⟩
106+
107+
end has_coproducts
108+
109+
end LocallyRingedSpace
110+
111+
end algebraic_geometry

src/algebraic_geometry/open_immersion.lean

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import category_theory.limits.shapes.binary_products
88
import category_theory.limits.preserves.shapes.pullbacks
99
import topology.sheaves.functors
1010
import algebraic_geometry.Scheme
11+
import category_theory.limits.shapes.strict_initial
1112

1213
/-!
1314
# Open immersions of structured spaces
@@ -519,4 +520,80 @@ end pullback
519520

520521
end PresheafedSpace.is_open_immersion
521522

523+
namespace SheafedSpace.is_open_immersion
524+
525+
section prod
526+
527+
variables [has_limits C] {ι : Type v} (F : discrete ι ⥤ SheafedSpace C) [has_colimit F] (i : ι)
528+
529+
lemma sigma_ι_open_embedding : open_embedding (colimit.ι F i).base :=
530+
begin
531+
rw ← (show _ = (colimit.ι F i).base,
532+
from ι_preserves_colimits_iso_inv (SheafedSpace.forget C) F i),
533+
have : _ = _ ≫ colimit.ι (discrete.functor (F ⋙ SheafedSpace.forget C).obj) i :=
534+
has_colimit.iso_of_nat_iso_ι_hom discrete.nat_iso_functor i,
535+
rw ← iso.eq_comp_inv at this,
536+
rw this,
537+
have : colimit.ι _ _ ≫ _ = _ := Top.sigma_iso_sigma_hom_ι (F ⋙ SheafedSpace.forget C).obj i,
538+
rw ← iso.eq_comp_inv at this,
539+
rw this,
540+
simp_rw [← category.assoc, Top.open_embedding_iff_comp_is_iso,
541+
Top.open_embedding_iff_is_iso_comp],
542+
exact open_embedding_sigma_mk
543+
end
544+
545+
lemma image_preimage_is_empty (j : ι) (h : i ≠ j) (U : opens (F.obj i)) :
546+
(opens.map (colimit.ι (F ⋙ SheafedSpace.forget_to_PresheafedSpace) j).base).obj
547+
((opens.map (preserves_colimit_iso SheafedSpace.forget_to_PresheafedSpace F).inv.base).obj
548+
((sigma_ι_open_embedding F i).is_open_map.functor.obj U)) = ∅ :=
549+
begin
550+
ext,
551+
apply iff_false_intro,
552+
rintro ⟨y, hy, eq⟩,
553+
replace eq := concrete_category.congr_arg
554+
(preserves_colimit_iso (SheafedSpace.forget C) F ≪≫
555+
has_colimit.iso_of_nat_iso discrete.nat_iso_functor ≪≫ Top.sigma_iso_sigma _).hom eq,
556+
simp_rw [category_theory.iso.trans_hom, ← Top.comp_app, ← PresheafedSpace.comp_base] at eq,
557+
rw ι_preserves_colimits_iso_inv at eq,
558+
change ((SheafedSpace.forget C).map (colimit.ι F i) ≫ _) y =
559+
((SheafedSpace.forget C).map (colimit.ι F j) ≫ _) x at eq,
560+
rw [ι_preserves_colimits_iso_hom_assoc, ι_preserves_colimits_iso_hom_assoc,
561+
has_colimit.iso_of_nat_iso_ι_hom_assoc, has_colimit.iso_of_nat_iso_ι_hom_assoc,
562+
Top.sigma_iso_sigma_hom_ι, Top.sigma_iso_sigma_hom_ι] at eq,
563+
exact h (congr_arg sigma.fst eq)
564+
end
565+
566+
instance sigma_ι_is_open_immersion [has_strict_terminal_objects C] :
567+
SheafedSpace.is_open_immersion (colimit.ι F i) :=
568+
{ base_open := sigma_ι_open_embedding F i,
569+
c_iso := λ U, begin
570+
have e : colimit.ι F i = _ :=
571+
(ι_preserves_colimits_iso_inv SheafedSpace.forget_to_PresheafedSpace F i).symm,
572+
have H : open_embedding (colimit.ι (F ⋙ SheafedSpace.forget_to_PresheafedSpace) i ≫
573+
(preserves_colimit_iso SheafedSpace.forget_to_PresheafedSpace F).inv).base :=
574+
e ▸ sigma_ι_open_embedding F i,
575+
suffices : is_iso ((colimit.ι (F ⋙ SheafedSpace.forget_to_PresheafedSpace) i ≫
576+
(preserves_colimit_iso SheafedSpace.forget_to_PresheafedSpace F).inv).c.app
577+
(op (H.is_open_map.functor.obj U))),
578+
{ convert this },
579+
rw [PresheafedSpace.comp_c_app,
580+
← PresheafedSpace.colimit_presheaf_obj_iso_componentwise_limit_hom_π],
581+
suffices : is_iso (limit.π (PresheafedSpace.componentwise_diagram
582+
(F ⋙ SheafedSpace.forget_to_PresheafedSpace)
583+
((opens.map (preserves_colimit_iso SheafedSpace.forget_to_PresheafedSpace F).inv.base).obj
584+
(unop $ op $ H.is_open_map.functor.obj U))) (op i)),
585+
{ resetI, apply_instance },
586+
apply limit_π_is_iso_of_is_strict_terminal,
587+
intros j hj,
588+
induction j using opposite.rec,
589+
dsimp,
590+
convert (F.obj j).sheaf.is_terminal_of_empty,
591+
convert image_preimage_is_empty F i j (λ h, hj (congr_arg op h.symm)) U,
592+
exact (congr_arg PresheafedSpace.hom.base e).symm
593+
end }
594+
595+
end prod
596+
597+
end SheafedSpace.is_open_immersion
598+
522599
end algebraic_geometry

src/algebraic_geometry/sheafed_space.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ instance [has_limits C] : creates_colimits (forget_to_PresheafedSpace : SheafedS
149149
instance [has_limits C] : has_colimits (SheafedSpace C) :=
150150
has_colimits_of_has_colimits_creates_colimits forget_to_PresheafedSpace
151151

152+
noncomputable
153+
instance [has_limits C] : preserves_colimits (forget C) :=
154+
limits.comp_preserves_colimits forget_to_PresheafedSpace (PresheafedSpace.forget C)
155+
152156
end SheafedSpace
153157

154158
end algebraic_geometry

src/topology/category/Top/basic.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,20 @@ by { ext, refl }
7979
@[simp] lemma of_homeo_of_iso {X Y : Top.{u}} (f : X ≅ Y) : iso_of_homeo (homeo_of_iso f) = f :=
8080
by { ext, refl }
8181

82+
@[simp]
83+
lemma open_embedding_iff_comp_is_iso {X Y Z : Top} (f : X ⟶ Y) (g : Y ⟶ Z) [is_iso g] :
84+
open_embedding (f ≫ g) ↔ open_embedding f :=
85+
open_embedding_iff_open_embedding_compose f (Top.homeo_of_iso (as_iso g)).open_embedding
86+
87+
@[simp]
88+
lemma open_embedding_iff_is_iso_comp {X Y Z : Top} (f : X ⟶ Y) (g : Y ⟶ Z) [is_iso f] :
89+
open_embedding (f ≫ g) ↔ open_embedding g :=
90+
begin
91+
split,
92+
{ intro h,
93+
convert h.comp (Top.homeo_of_iso (as_iso f).symm).open_embedding,
94+
exact congr_arg _ (is_iso.inv_hom_id_assoc f g).symm },
95+
{ exact λ h, h.comp (Top.homeo_of_iso (as_iso f)).open_embedding }
96+
end
97+
8298
end Top

src/topology/maps.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,22 @@ lemma open_embedding.comp {g : β → γ} {f : α → β}
423423
(hg : open_embedding g) (hf : open_embedding f) : open_embedding (g ∘ f) :=
424424
⟨hg.1.comp hf.1, (hg.is_open_map.comp hf.is_open_map).is_open_range⟩
425425

426+
lemma open_embedding_of_open_embedding_compose {α β γ : Type*} [topological_space α]
427+
[topological_space β] [topological_space γ] (f : α → β) {g : β → γ} (hg : open_embedding g)
428+
(h : open_embedding (g ∘ f)) : open_embedding f :=
429+
begin
430+
have hf := hg.to_embedding.continuous_iff.mpr h.continuous,
431+
split,
432+
{ exact embedding_of_embedding_compose hf hg.continuous h.to_embedding },
433+
{ rw [hg.open_iff_image_open, ← set.image_univ, ← set.image_comp, ← h.open_iff_image_open],
434+
exact is_open_univ }
435+
end
436+
437+
lemma open_embedding_iff_open_embedding_compose {α β γ : Type*} [topological_space α]
438+
[topological_space β] [topological_space γ] (f : α → β) {g : β → γ} (hg : open_embedding g) :
439+
open_embedding (g ∘ f) ↔ open_embedding f :=
440+
⟨open_embedding_of_open_embedding_compose f hg, hg.comp⟩
441+
426442
end open_embedding
427443

428444
section closed_embedding

0 commit comments

Comments
 (0)