@@ -96,6 +96,115 @@ begin
96
96
rw [comp_apply, e', map_zero]
97
97
end
98
98
99
+ lemma is_reduced_of_open_immersion {X Y : Scheme} (f : X ⟶ Y) [H : is_open_immersion f]
100
+ [is_reduced Y] : is_reduced X :=
101
+ begin
102
+ constructor,
103
+ intro U,
104
+ have : U = (opens.map f.1 .base).obj (H.base_open.is_open_map.functor.obj U),
105
+ { ext1, exact (set.preimage_image_eq _ H.base_open.inj).symm },
106
+ rw this ,
107
+ exact is_reduced_of_injective (inv $ f.1 .c.app (op $ H.base_open.is_open_map.functor.obj U))
108
+ (as_iso $ f.1 .c.app (op $ H.base_open.is_open_map.functor.obj U) : Y.presheaf.obj _ ≅ _).symm
109
+ .CommRing_iso_to_ring_equiv.injective
110
+ end
111
+
112
+ local attribute [elementwise] category_theory.is_iso.hom_inv_id
113
+
114
+ lemma basic_open_eq_of_affine {R : CommRing} (f : R) :
115
+ RingedSpace.basic_open (Spec.to_SheafedSpace.obj (op R)) ((Spec_Γ_identity.app R).inv f) =
116
+ prime_spectrum.basic_open f :=
117
+ begin
118
+ ext,
119
+ change ↑(⟨x, trivial⟩ : (⊤ : opens _)) ∈
120
+ RingedSpace.basic_open (Spec.to_SheafedSpace.obj (op R)) _ ↔ _,
121
+ rw RingedSpace.mem_basic_open,
122
+ suffices : is_unit (structure_sheaf.to_stalk R x f) ↔ f ∉ prime_spectrum.as_ideal x,
123
+ { exact this },
124
+ erw [← is_unit_map_iff (structure_sheaf.stalk_to_fiber_ring_hom R x),
125
+ structure_sheaf.stalk_to_fiber_ring_hom_to_stalk],
126
+ exact (is_localization.at_prime.is_unit_to_map_iff
127
+ (localization.at_prime (prime_spectrum.as_ideal x)) (prime_spectrum.as_ideal x) f : _)
128
+ end
129
+
130
+ lemma basic_open_eq_of_affine' {R : CommRing}
131
+ (f : (Spec.to_SheafedSpace.obj (op R)).presheaf.obj (op ⊤)) :
132
+ RingedSpace.basic_open (Spec.to_SheafedSpace.obj (op R)) f =
133
+ prime_spectrum.basic_open ((Spec_Γ_identity.app R).hom f) :=
134
+ begin
135
+ convert basic_open_eq_of_affine ((Spec_Γ_identity.app R).hom f),
136
+ exact (coe_hom_inv_id _ _).symm
137
+ end
138
+
139
+ lemma reduce_to_affine_global (P : ∀ (X : Scheme) (U : opens X.carrier), Prop )
140
+ (h₁ : ∀ (X : Scheme) (U : opens X.carrier),
141
+ (∀ (x : U), ∃ {V} (h : x.1 ∈ V) (i : V ⟶ U), P X V) → P X U)
142
+ (h₂ : ∀ {X Y} (f : X ⟶ Y) [hf : is_open_immersion f], ∃ {U : set X.carrier} {V : set Y.carrier}
143
+ (hU : U = ⊤) (hV : V = set.range f.1 .base), P X ⟨U, hU.symm ▸ is_open_univ⟩ →
144
+ P Y ⟨V, hV.symm ▸ hf.base_open.open_range⟩)
145
+ (h₃ : ∀ (R : CommRing), P (Scheme.Spec.obj $ op R) ⊤) :
146
+ ∀ (X : Scheme) (U : opens X.carrier), P X U :=
147
+ begin
148
+ intros X U,
149
+ apply h₁,
150
+ intro x,
151
+ obtain ⟨_,⟨j,rfl⟩,hx,i⟩ := X.affine_basis_cover_is_basis.exists_subset_of_mem_open x.prop U.2 ,
152
+ let U' : opens _ := ⟨_, (X.affine_basis_cover.is_open j).base_open.open_range⟩,
153
+ let i' : U' ⟶ U :=
154
+ hom_of_le i,
155
+ refine ⟨U', hx, i', _⟩,
156
+ obtain ⟨_,_,rfl,rfl,h₂'⟩ := h₂ (X.affine_basis_cover.map j),
157
+ apply h₂',
158
+ apply h₃
159
+ end
160
+
161
+ lemma eq_zero_of_basic_open_empty {X : Scheme} [hX : is_reduced X] {U : opens X.carrier}
162
+ (s : X.presheaf.obj (op U)) (hs : X.to_LocallyRingedSpace.to_RingedSpace.basic_open s = ∅) :
163
+ s = 0 :=
164
+ begin
165
+ apply Top.presheaf.section_ext X.sheaf U,
166
+ simp_rw ring_hom.map_zero,
167
+ tactic.unfreeze_local_instances,
168
+ revert X U hX s,
169
+ refine reduce_to_affine_global _ _ _ _,
170
+ { intros X U hx hX s hs x,
171
+ obtain ⟨V, hx, i, H⟩ := hx x,
172
+ specialize H (X.presheaf.map i.op s),
173
+ erw RingedSpace.basic_open_res at H,
174
+ rw [hs, ← subtype.coe_injective.eq_iff, opens.empty_eq, opens.inter_eq, inf_bot_eq] at H,
175
+ specialize H rfl ⟨x, hx⟩,
176
+ erw Top.presheaf.germ_res_apply at H,
177
+ exact H },
178
+ { rintros X Y f hf,
179
+ have e : (f.val.base) ⁻¹' set.range ⇑(f.val.base) = ⊤,
180
+ { rw [← set.image_univ, set.preimage_image_eq _ hf.base_open.inj, set.top_eq_univ] },
181
+ refine ⟨_, _, e, rfl, _⟩,
182
+ rintros H hX s hs ⟨_, x, rfl⟩,
183
+ haveI := is_reduced_of_open_immersion f,
184
+ specialize H (f.1 .c.app _ s) _ ⟨x, by { change x ∈ (f.val.base) ⁻¹' _, rw e, trivial }⟩,
185
+ { rw [← LocallyRingedSpace.preimage_basic_open, hs], ext1, simp [opens.map] },
186
+ { erw ← PresheafedSpace.stalk_map_germ_apply f.1 ⟨_,_⟩ ⟨x,_⟩ at H,
187
+ apply_fun (inv $ PresheafedSpace.stalk_map f.val x) at H,
188
+ erw [category_theory.is_iso.hom_inv_id_apply, map_zero] at H,
189
+ exact H } },
190
+ { intros R hX s hs x,
191
+ erw [basic_open_eq_of_affine', prime_spectrum.basic_open_eq_bot_iff] at hs,
192
+ replace hs := (hs.map (Spec_Γ_identity.app R).inv).eq_zero,
193
+ rw coe_hom_inv_id at hs,
194
+ rw [hs, map_zero],
195
+ exact @@is_reduced.component_reduced hX ⊤ }
196
+ end
197
+
198
+ @[simp]
199
+ lemma basic_open_eq_bot_iff {X : Scheme} [is_reduced X] {U : opens X.carrier}
200
+ (s : X.presheaf.obj $ op U) :
201
+ X.to_LocallyRingedSpace.to_RingedSpace.basic_open s = ⊥ ↔ s = 0 :=
202
+ begin
203
+ refine ⟨eq_zero_of_basic_open_empty s, _⟩,
204
+ rintro rfl,
205
+ simp,
206
+ end
207
+
99
208
@[priority 900 ]
100
209
instance is_reduced_of_is_integral [is_integral X] : is_reduced X :=
101
210
begin
0 commit comments