Skip to content

Commit d45663d

Browse files
feat(AlgebraicGeometry/Birational): composition of rational maps (#39445)
Define composition of partial and rational maps. - [x] depends on: #39442 - [x] depends on: #39443 - [x] depends on: #39317 - [x] depends on: #40189
1 parent e3b7382 commit d45663d

5 files changed

Lines changed: 286 additions & 14 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,7 @@ public import Mathlib.AlgebraicGeometry.AlgClosed.Basic
13501350
public import Mathlib.AlgebraicGeometry.AlgebraicCycle.Basic
13511351
public import Mathlib.AlgebraicGeometry.Artinian
13521352
public import Mathlib.AlgebraicGeometry.Birational.Birational
1353+
public import Mathlib.AlgebraicGeometry.Birational.Composition
13531354
public import Mathlib.AlgebraicGeometry.Birational.Dominant
13541355
public import Mathlib.AlgebraicGeometry.Birational.RationalMap
13551356
public import Mathlib.AlgebraicGeometry.ColimitsOver
Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
/-
2+
Copyright (c) 2026 Justus Springer. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Justus Springer
5+
-/
6+
module
7+
8+
public import Mathlib.AlgebraicGeometry.Birational.Dominant
9+
10+
/-!
11+
# Composition of rational maps
12+
13+
This file defines composition for partial maps and rational maps between schemes.
14+
15+
## Main definitions
16+
17+
- `Scheme.PartialMap.comp`: given a dominant partial map `f : X.PartialMap Y` and any partial map
18+
`g : Y.PartialMap Z`, their composition `f.comp g : X.PartialMap Z` is defined on the preimage
19+
of `g`'s domain under `f`.
20+
- `Scheme.RationalMap.comp`: composition of rational maps, defined via a dominant representative.
21+
22+
## Main statements
23+
24+
- `Scheme.PartialMap.comp_equiv_of_equiv`: Composition respects equivalence of partial maps.
25+
- `Scheme.PartialMap.comp_assoc`: Composition of partial maps is associative.
26+
- `Scheme.RationalMap.comp_assoc`: Composition of rational maps is associative.
27+
28+
-/
29+
30+
@[expose] public section
31+
32+
universe u
33+
34+
open CategoryTheory
35+
36+
namespace AlgebraicGeometry.Scheme
37+
38+
variable {X Y Z : Scheme.{u}}
39+
40+
section PreirreducibleSpace
41+
42+
variable [PreirreducibleSpace X] [Nonempty Y]
43+
44+
namespace PartialMap
45+
46+
/-- Composition of partial maps. The domain of `f.comp g` is the preimage of `g.domain` under `f`,
47+
viewed as an open subscheme of `X`. Requires `f.hom` to be dominant so that the domain is dense. -/
48+
@[simps]
49+
noncomputable def comp (f : X.PartialMap Y) [IsDominant f.hom] (g : Y.PartialMap Z) :
50+
X.PartialMap Z where
51+
domain := f.domain.ι ''ᵁ f.hom ⁻¹ᵁ g.domain
52+
dense_domain := (f.domain.ι ''ᵁ f.hom ⁻¹ᵁ g.domain).2.dense <| by
53+
simpa [← Set.nonempty_preimage_iff] using
54+
f.hom.denseRange.inter_open_nonempty _ g.domain.2 g.dense_domain.nonempty
55+
hom := (f.domain.ι.isoImage _).inv ≫ f.hom ∣_ g.domain ≫ g.hom
56+
57+
set_option backward.defeqAttrib.useBackward true in
58+
lemma comp_restrict_left (f : X.PartialMap Y) [IsDominant f.hom] (U : X.Opens)
59+
(hU : Dense (U : Set X)) (hU' : U ≤ f.domain) (g : Y.PartialMap Z) :
60+
(f.restrict U hU hU').comp g = (f.comp g).restrict (f.domain.ι ''ᵁ f.hom ⁻¹ᵁ g.domain ⊓ U)
61+
((f.comp g).dense_domain.inter_of_isOpen_right hU U.2) inf_le_left := by
62+
ext
63+
· simp [ι_image_homOfLE_eq_ι_image_inf]
64+
· simp [morphismRestrict_comp, isoImage_ι_inv_morphismRestrict_homOfLE_assoc, isoOfEq_hom]
65+
66+
set_option backward.defeqAttrib.useBackward true in
67+
lemma comp_restrict_right (f : X.PartialMap Y) [IsDominant f.hom] (g : Y.PartialMap Z)
68+
(V : Y.Opens) (hV : Dense (V : Set Y)) (hV' : V ≤ g.domain) :
69+
f.comp (g.restrict V hV hV') = (f.comp g).restrict
70+
(f.domain.ι ''ᵁ (f.hom ⁻¹ᵁ V)) ((f.domain.ι ''ᵁ f.hom ⁻¹ᵁ V).2.dense <| by
71+
simpa [← Set.nonempty_preimage_iff] using
72+
f.hom.denseRange.inter_open_nonempty _ V.2 hV.nonempty)
73+
(f.domain.ι.image_mono (f.hom.preimage_mono hV')) := by
74+
ext
75+
· simp
76+
· simp [← f.domain.ι.isoImage_inv_homOfLE_assoc _ _ (f.hom.preimage_mono hV'),
77+
← morphismRestrict_homOfLE_assoc f.hom _ _ hV']
78+
79+
set_option backward.defeqAttrib.useBackward true in
80+
/-- Composition respects equivalence of partial maps on the left. -/
81+
lemma comp_equiv_of_equiv_left {f₁ f₂ : X.PartialMap Y} [IsDominant f₁.hom] [IsDominant f₂.hom]
82+
(h : f₁.equiv f₂) (g : Y.PartialMap Z) :
83+
(f₁.comp g).equiv (f₂.comp g) := by
84+
obtain ⟨W, hW, hW₁, hW₂, e⟩ := h
85+
replace e : f₁.restrict W hW hW₁ = f₂.restrict W hW hW₂ :=
86+
PartialMap.ext _ _ rfl (by simpa using e)
87+
replace e := congr($(e).comp g)
88+
rw [comp_restrict_left, comp_restrict_left] at e
89+
exact equiv_of_restrict_eq _ _ e
90+
91+
set_option backward.defeqAttrib.useBackward true in
92+
/-- Composition respects equivalence of partial maps on the right. -/
93+
lemma comp_equiv_of_equiv_right (f : X.PartialMap Y) [IsDominant f.hom] {g₁ g₂ : Y.PartialMap Z}
94+
(h : g₁.equiv g₂) : (f.comp g₁).equiv (f.comp g₂) := by
95+
obtain ⟨W, hW, hW₁, hW₂, e⟩ := h
96+
replace e : g₁.restrict W hW hW₁ = g₂.restrict W hW hW₂ :=
97+
PartialMap.ext _ _ rfl (by simpa using e)
98+
replace e := congr(f.comp $e)
99+
rw [comp_restrict_right, comp_restrict_right] at e
100+
exact equiv_of_restrict_eq _ _ e
101+
102+
/-- Composition respects equivalence of partial maps in both arguments. -/
103+
lemma comp_equiv_of_equiv (f₁ f₂ : X.PartialMap Y) [IsDominant f₁.hom] [IsDominant f₂.hom]
104+
(hf : f₁.equiv f₂) (g₁ g₂ : Y.PartialMap Z) (hg : g₁.equiv g₂) :
105+
(f₁.comp g₁).equiv (f₂.comp g₂) :=
106+
equivalence_rel.trans (comp_equiv_of_equiv_left hf _) (comp_equiv_of_equiv_right _ hg)
107+
108+
set_option backward.defeqAttrib.useBackward true in
109+
instance isDominant_comp_hom (f : X.PartialMap Y) [IsDominant f.hom] (g : Y.PartialMap Z)
110+
[IsDominant g.hom] : IsDominant (f.comp g).hom := by
111+
dsimp only [comp_domain, comp_hom]
112+
have := IsZariskiLocalAtTarget.restrict ‹IsDominant f.hom› g.domain
113+
infer_instance
114+
115+
set_option backward.defeqAttrib.useBackward true in
116+
@[simp]
117+
lemma comp_assoc {X₁ X₂ X₃ Y : Scheme.{u}} [PreirreducibleSpace X₁] [IrreducibleSpace X₂]
118+
[Nonempty X₃] (f : X₁.PartialMap X₂) [IsDominant f.hom] (g : X₂.PartialMap X₃)
119+
[IsDominant g.hom] (h : X₃.PartialMap Y) :
120+
(f.comp g).comp h = f.comp (g.comp h) := by
121+
ext
122+
· simp_rw [comp_domain, comp_hom, ← Category.assoc, Hom.comp_preimage, Hom.inv_preimage,
123+
← Hom.comp_image, Hom.isoImage_hom_ι, Hom.comp_image, image_morphismRestrict_preimage]
124+
· dsimp
125+
simp_rw [morphismRestrict_comp, morphismRestrict_ι_image_ι_isoImage_inv_assoc,
126+
Hom.comp_preimage, Category.assoc]
127+
conv_lhs => rw [← Category.assoc]
128+
conv_rhs => rw [← Category.assoc, ← Category.assoc, ← Category.assoc]
129+
congr 1
130+
simp [← cancel_mono (Opens.ι _)]
131+
132+
set_option backward.defeqAttrib.useBackward true in
133+
@[simp]
134+
lemma comp_toPartialMap (f : X.PartialMap Y) [IsDominant f.hom] (g : Y ⟶ Z) :
135+
f.comp g.toPartialMap = f.compHom g := by
136+
ext1
137+
· simp
138+
· simp_rw [comp_hom, Hom.toPartialMap_domain, Hom.toPartialMap_hom, compHom_hom, topIso_hom,
139+
morphismRestrict_ι_assoc, f.domain.isoImage_ι_inv_ι_assoc, isoOfEq_hom]
140+
rfl
141+
142+
set_option backward.defeqAttrib.useBackward true in
143+
lemma comp_id (f : X.PartialMap Y) [IsDominant f.hom] : f.comp (PartialMap.id Y) = f := by simp
144+
145+
end PartialMap
146+
147+
namespace RationalMap
148+
149+
-- If better def-eqs are required, consider refactoring this by using `Quotient.liftOn₂`
150+
-- and a bundled structure `DominantPartialMap`.
151+
/-- Composition of rational maps. Requires `f` to be dominant, so that we may choose
152+
a dominant representative. -/
153+
noncomputable def comp (f : X ⤏ Y) [f.IsDominant] (g : Y ⤏ Z) : X ⤏ Z :=
154+
Quotient.liftOn g (PartialMap.toRationalMap ∘ f.representative.comp) <| fun _ _ h ↦ by
155+
rw [Function.comp_apply, Function.comp_apply, PartialMap.toRationalMap_eq_iff]
156+
exact PartialMap.comp_equiv_of_equiv_right _ h
157+
158+
lemma comp_def (f : X ⤏ Y) [f.IsDominant] (g : Y.PartialMap Z) :
159+
f.comp g.toRationalMap = (f.representative.comp g).toRationalMap :=
160+
rfl
161+
162+
lemma toRationalMap_comp (f : X.PartialMap Y) [IsDominant f.hom] (g : Y.PartialMap Z) :
163+
f.toRationalMap.comp g.toRationalMap = (f.comp g).toRationalMap := by
164+
rw [RationalMap.comp_def, PartialMap.toRationalMap_eq_iff]
165+
exact PartialMap.comp_equiv_of_equiv_left f.representative_toRationalMap_equiv _
166+
167+
@[simp]
168+
lemma comp_id (f : X ⤏ Y) [f.IsDominant] : f.comp (RationalMap.id Y) = f := by
169+
simp [RationalMap.comp_def]
170+
171+
instance (f : X ⤏ Y) [f.IsDominant] (g : Y ⤏ Z) [g.IsDominant] : (f.comp g).IsDominant := by
172+
rw [← g.toRationalMap_representative, RationalMap.comp_def]
173+
infer_instance
174+
175+
lemma comp_toRationalMap (f : X ⤏ Y) [f.IsDominant] (h : Y ⟶ Z) :
176+
f.comp h.toRationalMap = f.compHom h := by
177+
simp [comp_def, PartialMap.comp_toPartialMap]
178+
179+
@[grind _=_]
180+
lemma comp_assoc {X₁ X₂ X₃ Y : Scheme.{u}} [PreirreducibleSpace X₁] [IrreducibleSpace X₂]
181+
[Nonempty X₃] (f₁ : X₁ ⤏ X₂) [f₁.IsDominant] (f₂ : X₂ ⤏ X₃) [f₂.IsDominant] (f₃ : X₃ ⤏ Y) :
182+
(f₁.comp f₂).comp f₃ = f₁.comp (f₂.comp f₃) := by
183+
rw [← f₃.toRationalMap_representative]
184+
simp_rw [comp_def, ← PartialMap.comp_assoc, PartialMap.toRationalMap_eq_iff]
185+
apply PartialMap.comp_equiv_of_equiv_left
186+
rw [← f₂.toRationalMap_representative, comp_def]
187+
apply (f₁.representative.comp f₂.representative).representative_toRationalMap_equiv.trans
188+
apply PartialMap.comp_equiv_of_equiv_right
189+
rw [toRationalMap_representative]
190+
191+
instance isOver_comp {S : Scheme.{u}} [IrreducibleSpace Y] [Nonempty Z] [X.Over S] [Y.Over S]
192+
[Z.Over S] (f : X ⤏ Y) [f.IsDominant] [f.IsOver S] (g : Y ⤏ Z) [g.IsDominant] [g.IsOver S] :
193+
(f.comp g).IsOver S := by
194+
rw [isOver_iff, ← comp_toRationalMap, comp_assoc, comp_toRationalMap,
195+
isOver_iff.mp ‹g.IsOver S›, comp_toRationalMap, RationalMap.isOver_iff.mp ‹f.IsOver S›]
196+
197+
end RationalMap
198+
199+
end PreirreducibleSpace
200+
201+
set_option backward.defeqAttrib.useBackward true in
202+
@[simp]
203+
lemma PartialMap.id_comp {X Y : Scheme.{u}} [IrreducibleSpace X] (f : X.PartialMap Y) :
204+
(PartialMap.id X).comp f = f := by
205+
ext1
206+
· simp_rw [comp_domain, Hom.toPartialMap_domain, Hom.toPartialMap_hom, Category.comp_id,
207+
← X.topIso_hom, ← Hom.inv_image, ← Hom.comp_image, Iso.inv_hom_id, Hom.id_image]
208+
· simp_rw [comp_hom, Hom.toPartialMap_hom, Hom.toPartialMap_domain, morphismRestrict_comp,
209+
morphismRestrict_id, ← X.topIso_hom, Hom.comp_preimage, Hom.id_preimage,
210+
Category.comp_id, ← X.topIso.hom.isoImage_preimage_hom_homOfLE, Category.assoc,
211+
Iso.inv_hom_id_assoc]
212+
rfl
213+
214+
@[simp, grind =]
215+
lemma RationalMap.id_comp {X Y : Scheme.{u}} [IrreducibleSpace X] (f : X ⤏ Y) :
216+
(RationalMap.id X).comp f = f := by
217+
rw [← f.toRationalMap_representative, toRationalMap_comp, PartialMap.id_comp]
218+
219+
end AlgebraicGeometry.Scheme

Mathlib/AlgebraicGeometry/Birational/Dominant.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace PartialMap
3636

3737
set_option backward.defeqAttrib.useBackward true in
3838
/-- Restricting a dominant partial map to a dense open yields a dominant partial map. -/
39-
lemma isDominant_restrict_hom (f : X.PartialMap Y) [IsDominant f.hom] (U : X.Opens)
39+
instance isDominant_restrict_hom (f : X.PartialMap Y) [IsDominant f.hom] (U : X.Opens)
4040
(hU : Dense (U : Set X)) (hU' : U ≤ f.domain) : IsDominant (f.restrict U hU hU').hom := by
4141
dsimp only [restrict_domain, restrict_hom]
4242
have : IsDominant (X.homOfLE hU') := Opens.isDominant_homOfLE hU hU'

Mathlib/AlgebraicGeometry/Birational/RationalMap.lean

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,38 @@ def compHom (f : X.PartialMap Y) (g : Y ⟶ Z) : X.PartialMap Z where
120120
dense_domain := f.dense_domain
121121
hom := f.hom ≫ g
122122

123+
set_option backward.defeqAttrib.useBackward true in
124+
@[simp]
125+
lemma compHom_id (f : X.PartialMap Y) : f.compHom (𝟙 Y) = f := by
126+
ext <;> simp
127+
123128
set_option backward.defeqAttrib.useBackward true in
124129
instance [X.Over S] [Y.Over S] [Z.Over S] (f : X.PartialMap Y) (g : Y ⟶ Z)
125130
[f.IsOver S] [g.IsOver S] : (f.compHom g).IsOver S where
126131

127132
/-- A scheme morphism as a partial map. -/
128133
@[simps]
129-
def _root_.AlgebraicGeometry.Scheme.Hom.toPartialMap (f : X.Hom Y) :
134+
def _root_.AlgebraicGeometry.Scheme.Hom.toPartialMap (f : X Y) :
130135
X.PartialMap Y := ⟨⊤, dense_univ, X.topIso.hom ≫ f⟩
131136

137+
set_option backward.defeqAttrib.useBackward true in
138+
instance (f : X ⟶ Y) [IsDominant f] : IsDominant f.toPartialMap.hom := by
139+
dsimp
140+
have := Opens.isDominant_ι (X := X) (U := ⊤) dense_univ
141+
infer_instance
142+
143+
lemma _root_.AlgebraicGeometry.Scheme.Hom.toPartialMap_compHom (f : X ⟶ Y) (g : Y ⟶ Z) :
144+
f.toPartialMap.compHom g = (f ≫ g).toPartialMap := rfl
145+
146+
variable (X) in
147+
/-- The identity partial map. -/
148+
protected abbrev id : X.PartialMap X := (𝟙 X : X ⟶ X).toPartialMap
149+
150+
@[simp]
151+
lemma id_compHom (f : X ⟶ Y) : (PartialMap.id X).compHom f = f.toPartialMap := by
152+
apply PartialMap.ext _ _ rfl
153+
simp
154+
132155
set_option backward.defeqAttrib.useBackward true in
133156
instance [X.Over S] [Y.Over S] (f : X ⟶ Y) [f.IsOver S] : f.toPartialMap.IsOver S where
134157

@@ -226,20 +249,37 @@ def equiv (f g : X.PartialMap Y) : Prop :=
226249
∃ (W : X.Opens) (hW : Dense (W : Set X)) (hWl : W ≤ f.domain) (hWr : W ≤ g.domain),
227250
(f.restrict W hW hWl).hom = (g.restrict W hW hWr).hom
228251

252+
lemma equiv_of_restrict_eq (f g : X.PartialMap Y) {W₁ W₂ : X.Opens} {hW₁ : Dense (W₁ : Set X)}
253+
{hW₂ : Dense (W₂ : Set X)} {hW₁' : W₁ ≤ f.domain} {hW₂' : W₂ ≤ g.domain}
254+
(H : f.restrict W₁ hW₁ hW₁' = g.restrict W₂ hW₂ hW₂') : f.equiv g := by
255+
have e : W₁ = W₂ := congr($(H).domain)
256+
subst e
257+
exact ⟨W₁, hW₁, hW₁', hW₂', congr($(H).hom)⟩
258+
259+
@[refl]
260+
lemma equiv.refl (f : X.PartialMap Y) : f.equiv f :=
261+
⟨f.domain, f.dense_domain, by simp⟩
262+
263+
@[symm]
264+
lemma equiv.symm {f g : X.PartialMap Y} : f.equiv g → g.equiv f := by
265+
intro ⟨W, hW, hWl, hWr, e⟩
266+
exact ⟨W, hW, hWr, hWl, e.symm⟩
267+
229268
set_option backward.defeqAttrib.useBackward true in
269+
@[trans]
270+
lemma equiv.trans {f g h : X.PartialMap Y} : f.equiv g → g.equiv h → f.equiv h := by
271+
intro ⟨W₁, hW₁, hW₁l, hW₁r, e₁⟩ ⟨W₂, hW₂, hW₂l, hW₂r, e₂⟩
272+
refine ⟨W₁ ⊓ W₂, hW₁.inter_of_isOpen_left hW₂ W₁.2, inf_le_left.trans hW₁l,
273+
inf_le_right.trans hW₂r, ?_⟩
274+
dsimp at e₁ e₂
275+
simp only [restrict_domain, restrict_hom, ← X.homOfLE_homOfLE (U := W₁ ⊓ W₂) inf_le_left hW₁l,
276+
Category.assoc, e₁, ← X.homOfLE_homOfLE (U := W₁ ⊓ W₂) inf_le_right hW₂r, ← e₂]
277+
simp only [homOfLE_homOfLE_assoc]
278+
230279
lemma equivalence_rel : Equivalence (@Scheme.PartialMap.equiv X Y) where
231-
refl f := ⟨f.domain, f.dense_domain, by simp⟩
232-
symm {f g} := by
233-
intro ⟨W, hW, hWl, hWr, e⟩
234-
exact ⟨W, hW, hWr, hWl, e.symm⟩
235-
trans {f g h} := by
236-
intro ⟨W₁, hW₁, hW₁l, hW₁r, e₁⟩ ⟨W₂, hW₂, hW₂l, hW₂r, e₂⟩
237-
refine ⟨W₁ ⊓ W₂, hW₁.inter_of_isOpen_left hW₂ W₁.2, inf_le_left.trans hW₁l,
238-
inf_le_right.trans hW₂r, ?_⟩
239-
dsimp at e₁ e₂
240-
simp only [restrict_domain, restrict_hom, ← X.homOfLE_homOfLE (U := W₁ ⊓ W₂) inf_le_left hW₁l,
241-
Category.assoc, e₁, ← X.homOfLE_homOfLE (U := W₁ ⊓ W₂) inf_le_right hW₂r, ← e₂]
242-
simp only [homOfLE_homOfLE_assoc]
280+
refl := equiv.refl
281+
symm := equiv.symm
282+
trans := equiv.trans
243283

244284
instance : Setoid (X.PartialMap Y) := ⟨@PartialMap.equiv X Y, equivalence_rel⟩
245285

@@ -334,6 +374,10 @@ def PartialMap.toRationalMap (f : X.PartialMap Y) : X ⤏ Y := Quotient.mk _ f
334374
/-- A scheme morphism as a rational map. -/
335375
abbrev Hom.toRationalMap (f : X.Hom Y) : X ⤏ Y := f.toPartialMap.toRationalMap
336376

377+
variable (X) in
378+
/-- The identity rational map. -/
379+
abbrev RationalMap.id : X ⤏ X := (PartialMap.id X).toRationalMap
380+
337381
variable (S) in
338382
/-- A rational map is an `S`-map if some partial map in the equivalence class is an `S`-map. -/
339383
class RationalMap.IsOver [X.Over S] [Y.Over S] (f : X ⤏ Y) : Prop where
@@ -391,6 +435,11 @@ def RationalMap.compHom (f : X ⤏ Y) (g : Y ⟶ Z) : X ⤏ Z := by
391435
lemma RationalMap.compHom_toRationalMap (f : X.PartialMap Y) (g : Y ⟶ Z) :
392436
(f.compHom g).toRationalMap = f.toRationalMap.compHom g := rfl
393437

438+
@[simp]
439+
lemma RationalMap.id_compHom (f : X ⟶ Y) :
440+
(RationalMap.id X).compHom f = f.toRationalMap := by
441+
rw [RationalMap.id, ← compHom_toRationalMap, PartialMap.id_compHom]
442+
394443
instance [X.Over S] [Y.Over S] [Z.Over S] (f : X ⤏ Y) (g : Y ⟶ Z)
395444
[f.IsOver S] [g.IsOver S] : (f.compHom g).IsOver S where
396445
exists_partialMap_over := by

Mathlib/AlgebraicGeometry/OpenImmersion.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ lemma id_image {X : Scheme} (U : X.Opens) : 𝟙 X ''ᵁ U = U :=
201201
lemma inv_image {X Y : Scheme} (e : X ≅ Y) (U : Y.Opens) : e.inv ''ᵁ U = e.hom ⁻¹ᵁ U :=
202202
TopologicalSpace.Opens.ext <| (Scheme.homeoOfIso e.symm).toEquiv.image_eq_preimage_symm _
203203

204+
lemma inv_preimage {X Y : Scheme} (e : X ≅ Y) (U : X.Opens) : e.inv ⁻¹ᵁ U = e.hom ''ᵁ U :=
205+
(inv_image e.symm U).symm
206+
204207
@[simp]
205208
lemma apply_mem_image_iff {X Y : Scheme} (f : X ⟶ Y) [IsOpenImmersion f]
206209
{U : X.Opens} {x : X} : f x ∈ f ''ᵁ U ↔ x ∈ U :=

0 commit comments

Comments
 (0)