Skip to content

Commit a708114

Browse files
committed
feat(AlgebraicGeometry): zero locus of sections and characterisation of nilpotent elements (#14337)
Introduces the zero locus of a set of sections on a ringed space and characterizes nilpotent sections over compact opens of a scheme in terms of basic opens and the zero locus. Co-authored-by: Andrew Yang @erdOne
1 parent ffca4d8 commit a708114

File tree

12 files changed

+343
-12
lines changed

12 files changed

+343
-12
lines changed

Mathlib/AlgebraicGeometry/AffineScheme.lean

+33-5
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,6 @@ theorem range_fromSpec :
273273
infer_instance
274274
#align algebraic_geometry.is_affine_open.from_Spec_range AlgebraicGeometry.IsAffineOpen.range_fromSpec
275275

276-
@[simp]
277-
theorem fromSpec_image_top : hU.fromSpec ''ᵁ ⊤ = U :=
278-
Opens.ext (Set.image_univ.trans (range_fromSpec hU))
279-
#align algebraic_geometry.is_affine_open.from_Spec_image_top AlgebraicGeometry.IsAffineOpen.fromSpec_image_top
280-
281276
@[simp]
282277
theorem opensRange_fromSpec : Scheme.Hom.opensRange hU.fromSpec = U := Opens.ext (range_fromSpec hU)
283278

@@ -669,6 +664,39 @@ theorem of_affine_open_cover {X : Scheme} {P : X.affineOpens → Prop}
669664
exact ⟨_, hf₁ ⟨x, hx⟩⟩
670665
#align algebraic_geometry.of_affine_open_cover AlgebraicGeometry.of_affine_open_cover
671666

667+
section ZeroLocus
668+
669+
/-- On a locally ringed space `X`, the preimage of the zero locus of the prime spectrum
670+
of `Γ(X, ⊤)` under `toΓSpecFun` agrees with the associated zero locus on `X`. -/
671+
lemma Scheme.toΓSpec_preimage_zeroLocus_eq {X : Scheme.{u}} (s : Set Γ(X, ⊤)) :
672+
(ΓSpec.adjunction.unit.app X).val.base ⁻¹' PrimeSpectrum.zeroLocus s = X.zeroLocus s :=
673+
LocallyRingedSpace.toΓSpec_preimage_zeroLocus_eq s
674+
675+
open ConcreteCategory
676+
677+
/-- If `X` is affine, the image of the zero locus of global sections of `X` under `toΓSpecFun`
678+
is the zero locus in terms of the prime spectrum of `Γ(X, ⊤)`. -/
679+
lemma Scheme.toΓSpec_image_zeroLocus_eq_of_isAffine {X : Scheme.{u}} [IsAffine X] (s : Set Γ(X, ⊤)) :
680+
X.isoSpec.hom.val.base '' X.zeroLocus s = PrimeSpectrum.zeroLocus s := by
681+
erw [← X.toΓSpec_preimage_zeroLocus_eq, Set.image_preimage_eq]
682+
exact (bijective_of_isIso X.isoSpec.hom.val.base).surjective
683+
684+
/-- If `X` is an affine scheme, every closed set of `X` is the zero locus
685+
of a set of global sections. -/
686+
lemma Scheme.eq_zeroLocus_of_isClosed_of_isAffine (X : Scheme.{u}) [IsAffine X] (s : Set X) :
687+
IsClosed s ↔ ∃ I : Ideal (Γ(X, ⊤)), s = X.zeroLocus (I : Set Γ(X, ⊤)) := by
688+
refine ⟨fun hs ↦ ?_, ?_⟩
689+
· let Z : Set (Spec <| Γ(X, ⊤)) := X.toΓSpecFun '' s
690+
have hZ : IsClosed Z := (X.isoSpec.hom.homeomorph).isClosedMap _ hs
691+
obtain ⟨I, (hI : Z = _)⟩ := (PrimeSpectrum.isClosed_iff_zeroLocus_ideal _).mp hZ
692+
use I
693+
simp only [← Scheme.toΓSpec_preimage_zeroLocus_eq, ← hI, Z]
694+
erw [Set.preimage_image_eq _ (bijective_of_isIso X.isoSpec.hom.val.base).injective]
695+
· rintro ⟨I, rfl⟩
696+
exact zeroLocus_isClosed X I.carrier
697+
698+
end ZeroLocus
699+
672700
@[deprecated (since := "2024-06-21"), nolint defLemma]
673701
alias isAffineAffineScheme := isAffine_affineScheme
674702
@[deprecated (since := "2024-06-21"), nolint defLemma]

Mathlib/AlgebraicGeometry/Cover/Open.lean

+38
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,44 @@ def OpenCover.fromAffineRefinement {X : Scheme.{u}} (𝓤 : X.OpenCover) :
397397
idx j := j.fst
398398
app j := (𝓤.obj j.fst).affineCover.map _
399399

400+
/-- If two global sections agree after restriction to each member of a finite open cover, then
401+
they agree globally. -/
402+
lemma OpenCover.ext_elem {X : Scheme.{u}} {U : Opens X} (f g : Γ(X, U)) (𝒰 : X.OpenCover)
403+
(h : ∀ i : 𝒰.J, (𝒰.map i).app U f = (𝒰.map i).app U g) : f = g := by
404+
fapply TopCat.Sheaf.eq_of_locally_eq' X.sheaf
405+
(fun i ↦ (𝒰.map (𝒰.f i)).opensRange ⊓ U) _ (fun _ ↦ homOfLE inf_le_right)
406+
· intro x hx
407+
simp only [Opens.iSup_mk, Opens.carrier_eq_coe, Opens.coe_inf, Hom.opensRange_coe, Opens.coe_mk,
408+
Set.mem_iUnion, Set.mem_inter_iff, Set.mem_range, SetLike.mem_coe, exists_and_right]
409+
refine ⟨?_, hx⟩
410+
simpa using ⟨_, 𝒰.covers x⟩
411+
· intro x;
412+
replace h := h (𝒰.f x)
413+
rw [← IsOpenImmersion.map_ΓIso_inv] at h
414+
exact (IsOpenImmersion.ΓIso (𝒰.map (𝒰.f x)) U).commRingCatIsoToRingEquiv.symm.injective h
415+
416+
/-- If the restriction of a global section to each member of an open cover is zero, then it is
417+
globally zero. -/
418+
lemma zero_of_zero_cover {X : Scheme.{u}} {U : Opens X} (s : Γ(X, U)) (𝒰 : X.OpenCover)
419+
(h : ∀ i : 𝒰.J, (𝒰.map i).app U s = 0) : s = 0 :=
420+
𝒰.ext_elem s 0 (fun i ↦ by rw [map_zero]; exact h i)
421+
422+
/-- If a global section is nilpotent on each member of a finite open cover, then `f` is
423+
nilpotent. -/
424+
lemma isNilpotent_of_isNilpotent_cover {X : Scheme.{u}} {U : Opens X} (s : Γ(X, U))
425+
(𝒰 : X.OpenCover) [Finite 𝒰.J] (h : ∀ i : 𝒰.J, IsNilpotent ((𝒰.map i).app U s)) :
426+
IsNilpotent s := by
427+
choose fn hfn using h
428+
have : Fintype 𝒰.J := Fintype.ofFinite 𝒰.J
429+
/- the maximum of all `fn i` (exists, because `𝒰.J` is finite) -/
430+
let N : ℕ := Finset.sup Finset.univ fn
431+
have hfnleN (i : 𝒰.J) : fn i ≤ N := Finset.le_sup (Finset.mem_univ i)
432+
use N
433+
apply zero_of_zero_cover
434+
intro i
435+
simp only [map_pow]
436+
exact pow_eq_zero_of_le (hfnleN i) (hfn i)
437+
400438
section deprecated
401439

402440
/-- The basic open sets form an affine open cover of `Spec R`. -/

Mathlib/AlgebraicGeometry/GammaSpecAdjunction.lean

+25-4
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,17 @@ theorem not_mem_prime_iff_unit_in_stalk (r : Γ.obj (op X)) (x : X) :
8181

8282
/-- The preimage of a basic open in `Spec Γ(X)` under the unit is the basic
8383
open in `X` defined by the same element (they are equal as sets). -/
84-
theorem toΓSpec_preim_basicOpen_eq (r : Γ.obj (op X)) :
84+
theorem toΓSpec_preimage_basicOpen_eq (r : Γ.obj (op X)) :
8585
X.toΓSpecFun ⁻¹' (basicOpen r).1 = (X.toRingedSpace.basicOpen r).1 := by
8686
ext
8787
erw [X.toRingedSpace.mem_top_basicOpen]; apply not_mem_prime_iff_unit_in_stalk
88-
#align algebraic_geometry.LocallyRingedSpace.to_Γ_Spec_preim_basic_open_eq AlgebraicGeometry.LocallyRingedSpace.toΓSpec_preim_basicOpen_eq
88+
#align algebraic_geometry.LocallyRingedSpace.to_Γ_Spec_preim_basic_open_eq AlgebraicGeometry.LocallyRingedSpace.toΓSpec_preimage_basicOpen_eq
8989

9090
/-- `toΓSpecFun` is continuous. -/
9191
theorem toΓSpec_continuous : Continuous X.toΓSpecFun := by
9292
rw [isTopologicalBasis_basic_opens.continuous_iff]
9393
rintro _ ⟨r, rfl⟩
94-
erw [X.toΓSpec_preim_basicOpen_eq r]
94+
erw [X.toΓSpec_preimage_basicOpen_eq r]
9595
exact (X.toRingedSpace.basicOpen r).2
9696
#align algebraic_geometry.LocallyRingedSpace.to_Γ_Spec_continuous AlgebraicGeometry.LocallyRingedSpace.toΓSpec_continuous
9797

@@ -115,7 +115,7 @@ abbrev toΓSpecMapBasicOpen : Opens X :=
115115

116116
/-- The preimage is the basic open in `X` defined by the same element `r`. -/
117117
theorem toΓSpecMapBasicOpen_eq : X.toΓSpecMapBasicOpen r = X.toRingedSpace.basicOpen r :=
118-
Opens.ext (X.toΓSpec_preim_basicOpen_eq r)
118+
Opens.ext (X.toΓSpec_preimage_basicOpen_eq r)
119119
#align algebraic_geometry.LocallyRingedSpace.to_Γ_Spec_map_basic_open_eq AlgebraicGeometry.LocallyRingedSpace.toΓSpecMapBasicOpen_eq
120120

121121
/-- The map from the global sections `Γ(X)` to the sections on the (preimage of) a basic open. -/
@@ -255,6 +255,23 @@ def toΓSpec : X ⟶ Spec.locallyRingedSpaceObj (Γ.obj (op X)) where
255255
exact ht.mul <| this.map _
256256
#align algebraic_geometry.LocallyRingedSpace.to_Γ_Spec AlgebraicGeometry.LocallyRingedSpace.toΓSpec
257257

258+
/-- On a locally ringed space `X`, the preimage of the zero locus of the prime spectrum
259+
of `Γ(X, ⊤)` under `toΓSpec` agrees with the associated zero locus on `X`. -/
260+
lemma toΓSpec_preimage_zeroLocus_eq {X : LocallyRingedSpace.{u}}
261+
(s : Set (X.presheaf.obj (op ⊤))) :
262+
X.toΓSpec.val.base ⁻¹' PrimeSpectrum.zeroLocus s = X.toRingedSpace.zeroLocus s := by
263+
simp only [RingedSpace.zeroLocus]
264+
have (i : LocallyRingedSpace.Γ.obj (op X)) (_ : i ∈ s) :
265+
((X.toRingedSpace.basicOpen i).carrier)ᶜ =
266+
X.toΓSpec.val.base ⁻¹' (PrimeSpectrum.basicOpen i).carrierᶜ := by
267+
symm
268+
erw [Set.preimage_compl, X.toΓSpec_preimage_basicOpen_eq i]
269+
erw [Set.iInter₂_congr this]
270+
simp_rw [← Set.preimage_iInter₂, Opens.carrier_eq_coe, PrimeSpectrum.basicOpen_eq_zeroLocus_compl,
271+
compl_compl]
272+
rw [← PrimeSpectrum.zeroLocus_iUnion₂]
273+
simp
274+
258275
theorem comp_ring_hom_ext {X : LocallyRingedSpace.{u}} {R : CommRingCat.{u}} {f : R ⟶ Γ.obj (op X)}
259276
{β : X ⟶ Spec.locallyRingedSpaceObj R}
260277
(w : X.toΓSpec.1.base ≫ (Spec.locallyRingedSpaceMap f).1.base = β.1.base)
@@ -596,4 +613,8 @@ instance Spec.reflective : Reflective Scheme.Spec where
596613
adj := ΓSpec.adjunction
597614
#align algebraic_geometry.Spec.reflective AlgebraicGeometry.Spec.reflective
598615

616+
@[deprecated (since := "2024-07-02")]
617+
alias LocallyRingedSpace.toΓSpec_preim_basicOpen_eq :=
618+
LocallyRingedSpace.toΓSpec_preimage_basicOpen_eq
619+
599620
end AlgebraicGeometry

Mathlib/AlgebraicGeometry/Morphisms/QuasiCompact.lean

+26
Original file line numberDiff line numberDiff line change
@@ -341,4 +341,30 @@ theorem exists_pow_mul_eq_zero_of_res_basicOpen_eq_zero_of_isCompact (X : Scheme
341341
apply Finset.le_sup (Finset.mem_univ i)
342342
#align algebraic_geometry.exists_pow_mul_eq_zero_of_res_basic_open_eq_zero_of_is_compact AlgebraicGeometry.exists_pow_mul_eq_zero_of_res_basicOpen_eq_zero_of_isCompact
343343

344+
/-- A section over a compact open of a scheme is nilpotent if and only if its associated
345+
basic open is empty. -/
346+
lemma Scheme.isNilpotent_iff_basicOpen_eq_bot_of_isCompact {X : Scheme.{u}}
347+
{U : Opens X} (hU : IsCompact U.carrier) (f : Γ(X, U)) :
348+
IsNilpotent f ↔ X.basicOpen f = ⊥ := by
349+
refine ⟨X.basicOpen_eq_bot_of_isNilpotent U f, fun hf ↦ ?_⟩
350+
have h : (1 : Γ(X, U)) |_ X.basicOpen f = (0 : Γ(X, X.basicOpen f)) := by
351+
have e : X.basicOpen f ≤ ⊥ := by rw [hf]
352+
rw [← X.presheaf.restrict_restrict e bot_le]
353+
have : Subsingleton Γ(X, ⊥) :=
354+
CommRingCat.subsingleton_of_isTerminal X.sheaf.isTerminalOfEmpty
355+
rw [Subsingleton.eq_zero (1 |_ ⊥)]
356+
show X.presheaf.map _ 0 = 0
357+
rw [map_zero]
358+
obtain ⟨n, hn⟩ := exists_pow_mul_eq_zero_of_res_basicOpen_eq_zero_of_isCompact X hU 1 f h
359+
rw [mul_one] at hn
360+
use n
361+
362+
/-- The zero locus of a set of sections over a compact open of a scheme is `X` if and only if
363+
`s` is contained in the nilradical of `Γ(X, U)`. -/
364+
lemma Scheme.zeroLocus_eq_top_iff_subset_nilradical_of_isCompact {X : Scheme.{u}} {U : Opens X}
365+
(hU : IsCompact U.carrier) (s : Set Γ(X, U)) :
366+
X.zeroLocus s = ⊤ ↔ s ⊆ (nilradical Γ(X, U)).carrier := by
367+
simp [Scheme.zeroLocus_def, ← Scheme.isNilpotent_iff_basicOpen_eq_bot_of_isCompact hU,
368+
← mem_nilradical, Set.subset_def]
369+
344370
end AlgebraicGeometry

Mathlib/AlgebraicGeometry/OpenImmersion.lean

+61
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,29 @@ abbrev opensFunctor : Opens X ⥤ Opens Y :=
9494
/-- `f ''ᵁ U` is notation for the image (as an open set) of `U` under an open immersion `f`. -/
9595
scoped[AlgebraicGeometry] notation3:90 f:91 " ''ᵁ " U:90 => (Scheme.Hom.opensFunctor f).obj U
9696

97+
lemma image_le_image_of_le {U V : Opens X} (e : U ≤ V) : f ''ᵁ U ≤ f ''ᵁ V := by
98+
rintro a ⟨u, hu, rfl⟩
99+
exact Set.mem_image_of_mem (⇑f.val.base) (e hu)
100+
101+
@[simp]
102+
lemma opensFunctor_map_homOfLE {U V : Opens X} (e : U ≤ V) :
103+
(Scheme.Hom.opensFunctor f).map (homOfLE e) = homOfLE (f.image_le_image_of_le e) :=
104+
rfl
105+
106+
@[simp]
107+
lemma image_top_eq_opensRange : f ''ᵁ ⊤ = f.opensRange := by
108+
apply Opens.ext
109+
simp
110+
111+
@[simp]
112+
lemma preimage_image_eq (U : Opens X) : f ⁻¹ᵁ f ''ᵁ U = U := by
113+
apply Opens.ext
114+
simp [Set.preimage_image_eq _ f.openEmbedding.inj]
115+
116+
lemma image_preimage_eq_opensRange_inter (U : Opens Y) : f ''ᵁ f ⁻¹ᵁ U = f.opensRange ⊓ U := by
117+
apply Opens.ext
118+
simp [Set.image_preimage_eq_range_inter]
119+
97120
/-- The isomorphism `Γ(X, U) ⟶ Γ(Y, f(U))` induced by an open immersion `f : X ⟶ Y`. -/
98121
def invApp (U) : Γ(X, U) ⟶ Γ(Y, f ''ᵁ U) :=
99122
LocallyRingedSpace.IsOpenImmersion.invApp f U
@@ -131,6 +154,17 @@ theorem invApp_app (U) :
131154
(eqToHom (Opens.ext <| by exact Set.preimage_image_eq U.1 H.base_open.inj)).op :=
132155
(PresheafedSpace.IsOpenImmersion.invApp_app _ _).trans (by rw [eqToHom_op])
133156

157+
@[reassoc (attr := simp), elementwise]
158+
lemma appLE_invApp {X Y : Scheme.{u}} (f : X ⟶ Y) [IsOpenImmersion f] {U : Opens Y}
159+
{V : Opens X} (e : V ≤ f ⁻¹ᵁ U) :
160+
Scheme.Hom.appLE f U V e ≫ Scheme.Hom.invApp f V =
161+
Y.presheaf.map (homOfLE <| (f.image_le_image_of_le e).trans
162+
(f.image_preimage_eq_opensRange_inter U ▸ inf_le_right)).op := by
163+
simp only [Scheme.Hom.appLE, Category.assoc, Scheme.Hom.invApp_naturality, Functor.op_obj,
164+
Functor.op_map, Quiver.Hom.unop_op, Scheme.Hom.opensFunctor_map_homOfLE,
165+
Scheme.Hom.app_invApp_assoc, Opens.carrier_eq_coe]
166+
erw [← Functor.map_comp, ← op_comp, homOfLE_comp]
167+
134168
end Scheme.Hom
135169

136170
/-- The open sets of an open subscheme corresponds to the open sets containing in the image. -/
@@ -547,6 +581,33 @@ theorem lift_app {X Y U : Scheme.{u}} (f : U ⟶ Y) (g : X ⟶ Y) [IsOpenImmersi
547581
IsOpenImmersion.app_eq_invApp_app_of_comp_eq _ _ _ (lift_fac _ _ _).symm _
548582
#align algebraic_geometry.IsOpenImmersion.lift_app AlgebraicGeometry.IsOpenImmersion.lift_app
549583

584+
/-- If `f` is an open immersion `X ⟶ Y`, the global sections of `X`
585+
are naturally isomorphic to the sections of `Y` over the image of `f`. -/
586+
noncomputable
587+
def ΓIso {X Y : Scheme.{u}} (f : X ⟶ Y) [IsOpenImmersion f] (U : Opens Y) :
588+
Γ(X, f⁻¹ᵁ U) ≅ Γ(Y, f.opensRange ⊓ U) :=
589+
asIso (Scheme.Hom.invApp f <| f⁻¹ᵁ U) ≪≫
590+
Y.presheaf.mapIso (eqToIso <| (f.image_preimage_eq_opensRange_inter U).symm).op
591+
592+
@[simp]
593+
lemma ΓIso_inv {X Y : Scheme.{u}} (f : X ⟶ Y) [IsOpenImmersion f] (U : Opens Y) :
594+
(ΓIso f U).inv = f.appLE (f.opensRange ⊓ U) (f⁻¹ᵁ U)
595+
(by rw [← f.image_preimage_eq_opensRange_inter, f.preimage_image_eq]) := by
596+
simp only [ΓIso, Iso.trans_inv, Functor.mapIso_inv, Iso.op_inv, eqToIso.inv, eqToHom_op,
597+
asIso_inv, IsIso.comp_inv_eq, Scheme.Hom.appLE_invApp]
598+
rfl
599+
600+
@[reassoc, elementwise]
601+
lemma map_ΓIso_inv {X Y : Scheme.{u}} (f : X ⟶ Y) [IsOpenImmersion f] (U : Opens Y) :
602+
Y.presheaf.map (homOfLE inf_le_right).op ≫ (ΓIso f U).inv = f.app U := by
603+
simp [Scheme.Hom.appLE_eq_app]
604+
605+
@[reassoc, elementwise]
606+
lemma ΓIso_hom_map {X Y : Scheme.{u}} (f : X ⟶ Y) [IsOpenImmersion f] (U : Opens Y) :
607+
f.app U ≫ (ΓIso f U).hom = Y.presheaf.map (homOfLE inf_le_right).op := by
608+
rw [← map_ΓIso_inv]
609+
simp [-ΓIso_inv]
610+
550611
end IsOpenImmersion
551612

552613
namespace Scheme

Mathlib/AlgebraicGeometry/PrimeSpectrum/Basic.lean

+17
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,19 @@ theorem vanishingIdeal_eq_top_iff {s : Set (PrimeSpectrum R)} : vanishingIdeal s
320320
Set.subset_empty_iff]
321321
#align prime_spectrum.vanishing_ideal_eq_top_iff PrimeSpectrum.vanishingIdeal_eq_top_iff
322322

323+
theorem zeroLocus_eq_top_iff (s : Set R) :
324+
zeroLocus s = ⊤ ↔ s ⊆ nilradical R := by
325+
constructor
326+
· intro h x hx
327+
refine nilpotent_iff_mem_prime.mpr (fun J hJ ↦ ?_)
328+
have hJz : ⟨J, hJ⟩ ∈ zeroLocus s := by
329+
rw [h]
330+
trivial
331+
exact (mem_zeroLocus _ _).mpr hJz hx
332+
· rw [eq_top_iff]
333+
intro h p _
334+
apply Set.Subset.trans h (nilradical_le_prime p.asIdeal)
335+
323336
theorem zeroLocus_sup (I J : Ideal R) :
324337
zeroLocus ((I ⊔ J : Ideal R) : Set R) = zeroLocus I ∩ zeroLocus J :=
325338
(gc R).l_sup
@@ -344,6 +357,10 @@ theorem zeroLocus_iUnion {ι : Sort*} (s : ι → Set R) :
344357
(gc_set R).l_iSup
345358
#align prime_spectrum.zero_locus_Union PrimeSpectrum.zeroLocus_iUnion
346359

360+
theorem zeroLocus_iUnion₂ {ι : Sort*} {κ : (i : ι) → Sort*} (s : ∀ i, κ i → Set R) :
361+
zeroLocus (⋃ (i) (j), s i j) = ⋂ (i) (j), zeroLocus (s i j) :=
362+
(gc_set R).l_iSup₂
363+
347364
theorem zeroLocus_bUnion (s : Set (Set R)) :
348365
zeroLocus (⋃ s' ∈ s, s' : Set R) = ⋂ s' ∈ s, zeroLocus s' := by simp only [zeroLocus_iUnion]
349366
#align prime_spectrum.zero_locus_bUnion PrimeSpectrum.zeroLocus_bUnion

Mathlib/AlgebraicGeometry/Restrict.lean

+10-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ notation3:60 X:60 " ∣_ᵤ " U:61 => Scheme.restrict X (U : Opens X).openEmbedd
4444
/-- The restriction of a scheme to an open subset. -/
4545
abbrev Scheme.ιOpens {X : Scheme.{u}} (U : Opens X) : X ∣_ᵤ U ⟶ X := X.ofRestrict _
4646

47+
lemma Scheme.ιOpens_image_top {X : Scheme.{u}} (U : Opens X) : (Scheme.ιOpens U) ''ᵁ ⊤ = U :=
48+
U.openEmbedding_obj_top
49+
50+
instance Scheme.ιOpens_appLE_isIso {X : Scheme.{u}} (U : Opens X) :
51+
IsIso ((Scheme.ιOpens U).appLE U ⊤ (by simp)) := by
52+
simp only [restrict_presheaf_obj, ofRestrict_appLE]
53+
have : IsIso (homOfLE <| le_of_eq (ιOpens_image_top U)) :=
54+
homOfLE_isIso_of_eq _ <| ιOpens_image_top U
55+
infer_instance
56+
4757
lemma Scheme.ofRestrict_app_self {X : Scheme.{u}} (U : Opens X) :
4858
(ιOpens U).app U = X.presheaf.map (eqToHom (by simp)).op := rfl
4959

@@ -86,7 +96,6 @@ lemma Scheme.map_basicOpen_map (X : Scheme.{u}) (U : Opens X) (r : Γ(X, U)) :
8696
X.presheaf.map (eqToHom U.openEmbedding_obj_top).op r) = X.basicOpen r := by
8797
rw [Scheme.map_basicOpen', Scheme.basicOpen_res_eq, Scheme.basicOpen_res_eq]
8898

89-
9099
-- Porting note: `simps` can't synthesize `obj_left, obj_hom, mapLeft`
91100
/-- The functor taking open subsets of `X` to open subschemes of `X`. -/
92101
-- @[simps obj_left obj_hom mapLeft]

0 commit comments

Comments
 (0)