algebraic_geometry.morphisms.quasi_separated
⟷
Mathlib.AlgebraicGeometry.Morphisms.QuasiSeparated
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
(last sync)
(no changes)
This reverts commit 13361559.
These are just too difficult to forward port as is because of the max u v =?= max u ?v
issue https://github.com/leanprover/lean4/issues/2297.
We have another candidate approach to this, using a new UnivLE
typeclass, and I would prefer if we investigated that without the pressure of the port at the same time.
This will delay @hrmacbeth's plans to define meromorphic functions, perhaps.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
@@ -345,7 +345,7 @@ begin
exact e
end
-lemma exists_eq_pow_mul_of_is_compact_of_is_quasi_separated (X : Scheme.{u})
+lemma exists_eq_pow_mul_of_is_compact_of_is_quasi_separated (X : Scheme)
(U : opens X.carrier) (hU : is_compact U.1) (hU' : is_quasi_separated U.1)
(f : X.presheaf.obj (op U)) (x : X.presheaf.obj (op $ X.basic_open f)) :
∃ (n : ℕ) (y : X.presheaf.obj (op U)), y |_ X.basic_open f = (f |_ X.basic_open f) ^ n * x :=
@@ -401,7 +401,7 @@ begin
((X.presheaf.map (hom_of_le le_sup_left).op f) ^ (finset.univ.sup n + n₂) * y₁) =
X.presheaf.map (hom_of_le $ inf_le_right).op
((X.presheaf.map (hom_of_le le_sup_right).op f) ^ (finset.univ.sup n + n₁) * y₂),
- { fapply Top.sheaf.eq_of_locally_eq'.{(u+1) u} X.sheaf (λ i : s, i.1.1),
+ { fapply X.sheaf.eq_of_locally_eq' (λ i : s, i.1.1),
{ refine λ i, hom_of_le _, erw hs, exact le_supr _ _ },
{ exact le_of_eq hs },
{ intro i,
@@ -419,7 +419,7 @@ begin
-- By the sheaf condition, since `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`, it can be glued into
-- the desired section on `S ∪ U`.
use (X.sheaf.obj_sup_iso_prod_eq_locus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩,
- refine Top.sheaf.eq_of_locally_eq₂.{(u+1) u} X.sheaf
+ refine X.sheaf.eq_of_locally_eq₂
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_left).op f) ≤ _))
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_right).op f) ≤ _)) _ _ _ _ _,
{ rw X.basic_open_res, exact inf_le_right },
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -104,8 +104,8 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
pullback.fst ≫ X.of_restrict _
have : is_open_immersion g := inferInstance
have e := Homeomorph.ofEmbedding _ this.base_open.to_embedding
- rw [is_open_immersion.range_pullback_to_base_of_left] at e
- erw [Subtype.range_coe, Subtype.range_coe] at e
+ rw [is_open_immersion.range_pullback_to_base_of_left] at e
+ erw [Subtype.range_coe, Subtype.range_coe] at e
rw [isCompact_iff_compactSpace]
exact @Homeomorph.compactSpace _ _ (H _ _) e
· introv H h₁ h₂
@@ -113,8 +113,8 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
let g : pullback f₁ f₂ ⟶ X := pullback.fst ≫ f₁
have : is_open_immersion g := inferInstance
have e := Homeomorph.ofEmbedding _ this.base_open.to_embedding
- rw [is_open_immersion.range_pullback_to_base_of_left] at e
- simp_rw [isCompact_iff_compactSpace] at H
+ rw [is_open_immersion.range_pullback_to_base_of_left] at e
+ simp_rw [isCompact_iff_compactSpace] at H
exact
@Homeomorph.compactSpace _ _
(H ⟨⟨_, h₁.base_open.open_range⟩, range_is_affine_open_of_open_immersion _⟩
@@ -214,7 +214,7 @@ theorem QuasiSeparated.affine_openCover_TFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
by
have := quasi_compact.affine_property_is_local.diagonal_affine_open_cover_tfae f
simp_rw [← quasi_compact_eq_affine_property, ← quasi_separated_eq_diagonal_is_quasi_compact,
- quasi_compact_affine_property_diagonal_eq] at this
+ quasi_compact_affine_property_diagonal_eq] at this
exact this
#align algebraic_geometry.quasi_separated.affine_open_cover_tfae AlgebraicGeometry.QuasiSeparated.affine_openCover_TFAE
-/
@@ -332,7 +332,7 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
QuasiSeparated f :=
by
rw [(quasi_separated.affine_open_cover_tfae f).out 0 1]
- rw [(quasi_separated.affine_open_cover_tfae (f ≫ g)).out 0 2] at H
+ rw [(quasi_separated.affine_open_cover_tfae (f ≫ g)).out 0 2] at H
use(Z.affine_cover.pullback_cover g).bind fun x => Scheme.affine_cover _
constructor; · intro i; dsimp; infer_instance
rintro ⟨i, j⟩; dsimp at *
@@ -447,7 +447,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
obtain ⟨n₂, y₂, hy₂⟩ :=
exists_eq_pow_mul_of_is_affine_open X _ U.2 (X.presheaf.map (hom_of_le le_sup_right).op f)
(X.presheaf.map (hom_of_le _).op x)
- delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict at hy₂
+ delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict at hy₂
swap; · rw [X.basic_open_res]; exact inf_le_right
-- Since `S ∪ U` is quasi-separated, `S ∩ U` can be covered by finite affine opens.
obtain ⟨s, hs', hs⟩ :=
@@ -498,12 +498,12 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
(finset.univ.sup n - n i) *
x)
(hn i)
- dsimp only at hn
+ dsimp only at hn
delta Scheme.sheaf SheafedSpace.sheaf
simp only [← map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp, ← mul_assoc] at
hn ⊢
- erw [← map_mul, ← map_mul] at hn
- rw [← pow_add, ← pow_add, ← add_assoc, ← add_assoc, tsub_add_cancel_of_le] at hn
+ erw [← map_mul, ← map_mul] at hn
+ rw [← pow_add, ← pow_add, ← add_assoc, ← add_assoc, tsub_add_cancel_of_le] at hn
convert hn
exact Finset.le_sup (Finset.mem_univ _)
use finset.univ.sup n + n₁ + n₂
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,8 +3,8 @@ Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-/
-import Mathbin.AlgebraicGeometry.Morphisms.QuasiCompact
-import Mathbin.Topology.QuasiSeparated
+import AlgebraicGeometry.Morphisms.QuasiCompact
+import Topology.QuasiSeparated
#align_import algebraic_geometry.morphisms.quasi_separated from "leanprover-community/mathlib"@"1a51edf13debfcbe223fa06b1cb353b9ed9751cc"
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -333,7 +333,7 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
by
rw [(quasi_separated.affine_open_cover_tfae f).out 0 1]
rw [(quasi_separated.affine_open_cover_tfae (f ≫ g)).out 0 2] at H
- use (Z.affine_cover.pullback_cover g).bind fun x => Scheme.affine_cover _
+ use(Z.affine_cover.pullback_cover g).bind fun x => Scheme.affine_cover _
constructor; · intro i; dsimp; infer_instance
rintro ⟨i, j⟩; dsimp at *
specialize H _ i
@@ -509,7 +509,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
use finset.univ.sup n + n₁ + n₂
-- By the sheaf condition, since `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`, it can be glued into
-- the desired section on `S ∪ U`.
- use (X.sheaf.obj_sup_iso_prod_eq_locus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩
+ use(X.sheaf.obj_sup_iso_prod_eq_locus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩
refine'
X.sheaf.eq_of_locally_eq₂
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_left).op f) ≤ _))
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,15 +2,12 @@
Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-
-! This file was ported from Lean 3 source module algebraic_geometry.morphisms.quasi_separated
-! leanprover-community/mathlib commit 1a51edf13debfcbe223fa06b1cb353b9ed9751cc
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.AlgebraicGeometry.Morphisms.QuasiCompact
import Mathbin.Topology.QuasiSeparated
+#align_import algebraic_geometry.morphisms.quasi_separated from "leanprover-community/mathlib"@"1a51edf13debfcbe223fa06b1cb353b9ed9751cc"
+
/-!
# Quasi-separated morphisms
mathlib commit https://github.com/leanprover-community/mathlib/commit/2fe465deb81bcd7ccafa065bb686888a82f15372
@@ -229,8 +229,8 @@ theorem QuasiSeparated.is_local_at_target : PropertyIsLocalAtTarget @QuasiSepara
#align algebraic_geometry.quasi_separated.is_local_at_target AlgebraicGeometry.QuasiSeparated.is_local_at_target
-/
-#print AlgebraicGeometry.QuasiSeparated.openCover_tFAE /-
-theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
+#print AlgebraicGeometry.QuasiSeparated.openCover_TFAE /-
+theorem QuasiSeparated.openCover_TFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
TFAE
[QuasiSeparated f,
∃ 𝒰 : Scheme.OpenCover.{u} Y,
@@ -243,7 +243,7 @@ theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
∃ (ι : Type u) (U : ι → Opens Y.carrier) (hU : iSup U = ⊤),
∀ i, QuasiSeparated (f ∣_ U i)] :=
QuasiSeparated.is_local_at_target.openCover_TFAE f
-#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_tFAE
+#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_TFAE
-/
#print AlgebraicGeometry.quasiSeparated_over_affine_iff /-
mathlib commit https://github.com/leanprover-community/mathlib/commit/1a51edf13debfcbe223fa06b1cb353b9ed9751cc
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
! This file was ported from Lean 3 source module algebraic_geometry.morphisms.quasi_separated
-! leanprover-community/mathlib commit 5dc6092d09e5e489106865241986f7f2ad28d4c8
+! leanprover-community/mathlib commit 1a51edf13debfcbe223fa06b1cb353b9ed9751cc
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -14,6 +14,9 @@ import Mathbin.Topology.QuasiSeparated
/-!
# Quasi-separated morphisms
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
A morphism of schemes `f : X ⟶ Y` is quasi-separated if the diagonal morphism `X ⟶ X ×[Y] X` is
quasi-compact.
mathlib commit https://github.com/leanprover-community/mathlib/commit/5dc6092d09e5e489106865241986f7f2ad28d4c8
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
! This file was ported from Lean 3 source module algebraic_geometry.morphisms.quasi_separated
-! leanprover-community/mathlib commit 13361559d66b84f80b6d5a1c4a26aa5054766725
+! leanprover-community/mathlib commit 5dc6092d09e5e489106865241986f7f2ad28d4c8
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -420,7 +420,7 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
-/
#print AlgebraicGeometry.exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated /-
-theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U : Opens X.carrier)
+theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Opens X.carrier)
(hU : IsCompact U.1) (hU' : IsQuasiSeparated U.1) (f : X.Presheaf.obj (op U))
(x : X.Presheaf.obj (op <| X.basicOpen f)) :
∃ (n : ℕ) (y : X.Presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x :=
@@ -487,7 +487,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
X.presheaf.map (hom_of_le <| inf_le_right).op
(X.presheaf.map (hom_of_le le_sup_right).op f ^ (finset.univ.sup n + n₁) * y₂) :=
by
- fapply TopCat.Sheaf.eq_of_locally_eq'.{u + 1, u} X.sheaf fun i : s => i.1.1
+ fapply X.sheaf.eq_of_locally_eq' fun i : s => i.1.1
· refine' fun i => hom_of_le _; erw [hs]; exact le_iSup _ _
· exact le_of_eq hs
· intro i
@@ -511,7 +511,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
-- the desired section on `S ∪ U`.
use (X.sheaf.obj_sup_iso_prod_eq_locus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩
refine'
- TopCat.Sheaf.eq_of_locally_eq₂.{u + 1, u} X.sheaf
+ X.sheaf.eq_of_locally_eq₂
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_left).op f) ≤ _))
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_right).op f) ≤ _)) _ _ _ _ _
· rw [X.basic_open_res]; exact inf_le_right
mathlib commit https://github.com/leanprover-community/mathlib/commit/728ef9dbb281241906f25cbeb30f90d83e0bb451
@@ -44,18 +44,23 @@ namespace AlgebraicGeometry
variable {X Y : Scheme.{u}} (f : X ⟶ Y)
+#print AlgebraicGeometry.QuasiSeparated /-
/-- A morphism is `quasi_separated` if diagonal map is quasi-compact. -/
@[mk_iff]
class QuasiSeparated (f : X ⟶ Y) : Prop where
diagonal_quasiCompact : QuasiCompact (pullback.diagonal f)
#align algebraic_geometry.quasi_separated AlgebraicGeometry.QuasiSeparated
+-/
+#print AlgebraicGeometry.QuasiSeparated.affineProperty /-
/-- The `affine_target_morphism_property` corresponding to `quasi_separated`, asserting that the
domain is a quasi-separated scheme. -/
def QuasiSeparated.affineProperty : AffineTargetMorphismProperty := fun X Y f _ =>
QuasiSeparatedSpace X.carrier
#align algebraic_geometry.quasi_separated.affine_property AlgebraicGeometry.QuasiSeparated.affineProperty
+-/
+#print AlgebraicGeometry.quasiSeparatedSpace_iff_affine /-
theorem quasiSeparatedSpace_iff_affine (X : Scheme) :
QuasiSeparatedSpace X.carrier ↔ ∀ U V : X.affineOpens, IsCompact (U ∩ V : Set X.carrier) :=
by
@@ -83,7 +88,9 @@ theorem quasiSeparatedSpace_iff_affine (X : Scheme) :
apply hW.union
apply H
#align algebraic_geometry.quasi_separated_space_iff_affine AlgebraicGeometry.quasiSeparatedSpace_iff_affine
+-/
+#print AlgebraicGeometry.quasi_compact_affineProperty_iff_quasiSeparatedSpace /-
theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsAffine Y]
(f : X ⟶ Y) : QuasiCompact.affineProperty.diagonal f ↔ QuasiSeparatedSpace X.carrier :=
by
@@ -114,16 +121,22 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
⟨⟨_, h₂.base_open.open_range⟩, range_is_affine_open_of_open_immersion _⟩)
e.symm
#align algebraic_geometry.quasi_compact_affine_property_iff_quasi_separated_space AlgebraicGeometry.quasi_compact_affineProperty_iff_quasiSeparatedSpace
+-/
+#print AlgebraicGeometry.quasiSeparated_eq_diagonal_is_quasiCompact /-
theorem quasiSeparated_eq_diagonal_is_quasiCompact :
@QuasiSeparated = MorphismProperty.diagonal @QuasiCompact := by ext; exact quasi_separated_iff _
#align algebraic_geometry.quasi_separated_eq_diagonal_is_quasi_compact AlgebraicGeometry.quasiSeparated_eq_diagonal_is_quasiCompact
+-/
+#print AlgebraicGeometry.quasi_compact_affineProperty_diagonal_eq /-
theorem quasi_compact_affineProperty_diagonal_eq :
QuasiCompact.affineProperty.diagonal = QuasiSeparated.affineProperty := by ext;
rw [quasi_compact_affine_property_iff_quasi_separated_space]; rfl
#align algebraic_geometry.quasi_compact_affine_property_diagonal_eq AlgebraicGeometry.quasi_compact_affineProperty_diagonal_eq
+-/
+#print AlgebraicGeometry.quasiSeparated_eq_affineProperty_diagonal /-
theorem quasiSeparated_eq_affineProperty_diagonal :
@QuasiSeparated = targetAffineLocally QuasiCompact.affineProperty.diagonal :=
by
@@ -131,44 +144,60 @@ theorem quasiSeparated_eq_affineProperty_diagonal :
exact
diagonal_target_affine_locally_eq_target_affine_locally _ quasi_compact.affine_property_is_local
#align algebraic_geometry.quasi_separated_eq_affine_property_diagonal AlgebraicGeometry.quasiSeparated_eq_affineProperty_diagonal
+-/
+#print AlgebraicGeometry.quasiSeparated_eq_affineProperty /-
theorem quasiSeparated_eq_affineProperty :
@QuasiSeparated = targetAffineLocally QuasiSeparated.affineProperty := by
rw [quasi_separated_eq_affine_property_diagonal, quasi_compact_affine_property_diagonal_eq]
#align algebraic_geometry.quasi_separated_eq_affine_property AlgebraicGeometry.quasiSeparated_eq_affineProperty
+-/
+#print AlgebraicGeometry.QuasiSeparated.affineProperty_isLocal /-
theorem QuasiSeparated.affineProperty_isLocal : QuasiSeparated.affineProperty.IsLocal :=
quasi_compact_affineProperty_diagonal_eq ▸ QuasiCompact.affineProperty_isLocal.diagonal
#align algebraic_geometry.quasi_separated.affine_property_is_local AlgebraicGeometry.QuasiSeparated.affineProperty_isLocal
+-/
+#print AlgebraicGeometry.quasiSeparatedOfMono /-
instance (priority := 900) quasiSeparatedOfMono {X Y : Scheme} (f : X ⟶ Y) [Mono f] :
QuasiSeparated f :=
⟨inferInstance⟩
#align algebraic_geometry.quasi_separated_of_mono AlgebraicGeometry.quasiSeparatedOfMono
+-/
+#print AlgebraicGeometry.quasiSeparated_stableUnderComposition /-
theorem quasiSeparated_stableUnderComposition :
MorphismProperty.StableUnderComposition @QuasiSeparated :=
quasiSeparated_eq_diagonal_is_quasiCompact.symm ▸
quasiCompact_stableUnderComposition.diagonal quasiCompact_respectsIso
quasiCompact_stableUnderBaseChange
#align algebraic_geometry.quasi_separated_stable_under_composition AlgebraicGeometry.quasiSeparated_stableUnderComposition
+-/
+#print AlgebraicGeometry.quasiSeparated_stableUnderBaseChange /-
theorem quasiSeparated_stableUnderBaseChange :
MorphismProperty.StableUnderBaseChange @QuasiSeparated :=
quasiSeparated_eq_diagonal_is_quasiCompact.symm ▸
quasiCompact_stableUnderBaseChange.diagonal quasiCompact_respectsIso
#align algebraic_geometry.quasi_separated_stable_under_base_change AlgebraicGeometry.quasiSeparated_stableUnderBaseChange
+-/
+#print AlgebraicGeometry.quasiSeparatedComp /-
instance quasiSeparatedComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [QuasiSeparated f]
[QuasiSeparated g] : QuasiSeparated (f ≫ g) :=
quasiSeparated_stableUnderComposition f g inferInstance inferInstance
#align algebraic_geometry.quasi_separated_comp AlgebraicGeometry.quasiSeparatedComp
+-/
+#print AlgebraicGeometry.quasiSeparated_respectsIso /-
theorem quasiSeparated_respectsIso : MorphismProperty.RespectsIso @QuasiSeparated :=
quasiSeparated_eq_diagonal_is_quasiCompact.symm ▸ quasiCompact_respectsIso.diagonal
#align algebraic_geometry.quasi_separated_respects_iso AlgebraicGeometry.quasiSeparated_respectsIso
+-/
-theorem QuasiSeparated.affine_openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
+#print AlgebraicGeometry.QuasiSeparated.affine_openCover_TFAE /-
+theorem QuasiSeparated.affine_openCover_TFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
TFAE
[QuasiSeparated f,
∃ (𝒰 : Scheme.OpenCover.{u} Y) (_ : ∀ i, IsAffine (𝒰.obj i)),
@@ -187,13 +216,17 @@ theorem QuasiSeparated.affine_openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
simp_rw [← quasi_compact_eq_affine_property, ← quasi_separated_eq_diagonal_is_quasi_compact,
quasi_compact_affine_property_diagonal_eq] at this
exact this
-#align algebraic_geometry.quasi_separated.affine_open_cover_tfae AlgebraicGeometry.QuasiSeparated.affine_openCover_tFAE
+#align algebraic_geometry.quasi_separated.affine_open_cover_tfae AlgebraicGeometry.QuasiSeparated.affine_openCover_TFAE
+-/
+#print AlgebraicGeometry.QuasiSeparated.is_local_at_target /-
theorem QuasiSeparated.is_local_at_target : PropertyIsLocalAtTarget @QuasiSeparated :=
quasiSeparated_eq_affineProperty_diagonal.symm ▸
QuasiCompact.affineProperty_isLocal.diagonal.targetAffineLocallyIsLocal
#align algebraic_geometry.quasi_separated.is_local_at_target AlgebraicGeometry.QuasiSeparated.is_local_at_target
+-/
+#print AlgebraicGeometry.QuasiSeparated.openCover_tFAE /-
theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
TFAE
[QuasiSeparated f,
@@ -208,18 +241,24 @@ theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
∀ i, QuasiSeparated (f ∣_ U i)] :=
QuasiSeparated.is_local_at_target.openCover_TFAE f
#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_tFAE
+-/
+#print AlgebraicGeometry.quasiSeparated_over_affine_iff /-
theorem quasiSeparated_over_affine_iff {X Y : Scheme} (f : X ⟶ Y) [IsAffine Y] :
QuasiSeparated f ↔ QuasiSeparatedSpace X.carrier := by
rw [quasi_separated_eq_affine_property,
quasi_separated.affine_property_is_local.affine_target_iff f, quasi_separated.affine_property]
#align algebraic_geometry.quasi_separated_over_affine_iff AlgebraicGeometry.quasiSeparated_over_affine_iff
+-/
+#print AlgebraicGeometry.quasiSeparatedSpace_iff_quasiSeparated /-
theorem quasiSeparatedSpace_iff_quasiSeparated (X : Scheme) :
QuasiSeparatedSpace X.carrier ↔ QuasiSeparated (terminal.from X) :=
(quasiSeparated_over_affine_iff _).symm
#align algebraic_geometry.quasi_separated_space_iff_quasi_separated AlgebraicGeometry.quasiSeparatedSpace_iff_quasiSeparated
+-/
+#print AlgebraicGeometry.QuasiSeparated.affine_openCover_iff /-
theorem QuasiSeparated.affine_openCover_iff {X Y : Scheme.{u}} (𝒰 : Scheme.OpenCover.{u} Y)
[∀ i, IsAffine (𝒰.obj i)] (f : X ⟶ Y) :
QuasiSeparated f ↔ ∀ i, QuasiSeparatedSpace (pullback f (𝒰.map i)).carrier :=
@@ -228,11 +267,14 @@ theorem QuasiSeparated.affine_openCover_iff {X Y : Scheme.{u}} (𝒰 : Scheme.Op
quasi_separated.affine_property_is_local.affine_open_cover_iff f 𝒰]
rfl
#align algebraic_geometry.quasi_separated.affine_open_cover_iff AlgebraicGeometry.QuasiSeparated.affine_openCover_iff
+-/
+#print AlgebraicGeometry.QuasiSeparated.openCover_iff /-
theorem QuasiSeparated.openCover_iff {X Y : Scheme.{u}} (𝒰 : Scheme.OpenCover.{u} Y) (f : X ⟶ Y) :
QuasiSeparated f ↔ ∀ i, QuasiSeparated (pullback.snd : pullback f (𝒰.map i) ⟶ _) :=
QuasiSeparated.is_local_at_target.openCover_iff f 𝒰
#align algebraic_geometry.quasi_separated.open_cover_iff AlgebraicGeometry.QuasiSeparated.openCover_iff
+-/
instance {X Y S : Scheme} (f : X ⟶ S) (g : Y ⟶ S) [QuasiSeparated g] :
QuasiSeparated (pullback.fst : pullback f g ⟶ X) :=
@@ -246,6 +288,7 @@ instance {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [QuasiSeparated f] [QuasiS
QuasiSeparated (f ≫ g) :=
quasiSeparated_stableUnderComposition f g inferInstance inferInstance
+#print AlgebraicGeometry.quasiSeparatedSpace_of_quasiSeparated /-
theorem quasiSeparatedSpace_of_quasiSeparated {X Y : Scheme} (f : X ⟶ Y)
[hY : QuasiSeparatedSpace Y.carrier] [QuasiSeparated f] : QuasiSeparatedSpace X.carrier :=
by
@@ -254,7 +297,9 @@ theorem quasiSeparatedSpace_of_quasiSeparated {X Y : Scheme} (f : X ⟶ Y)
rw [← this]
skip; infer_instance
#align algebraic_geometry.quasi_separated_space_of_quasi_separated AlgebraicGeometry.quasiSeparatedSpace_of_quasiSeparated
+-/
+#print AlgebraicGeometry.quasiSeparatedSpace_of_isAffine /-
instance quasiSeparatedSpace_of_isAffine (X : Scheme) [IsAffine X] :
QuasiSeparatedSpace X.carrier := by
constructor
@@ -271,14 +316,18 @@ instance quasiSeparatedSpace_of_isAffine (X : Scheme) [IsAffine X] :
rw [← Scheme.basic_open_mul]
exact ((top_is_affine_open _).basicOpenIsAffine _).IsCompact
#align algebraic_geometry.quasi_separated_space_of_is_affine AlgebraicGeometry.quasiSeparatedSpace_of_isAffine
+-/
+#print AlgebraicGeometry.IsAffineOpen.isQuasiSeparated /-
theorem IsAffineOpen.isQuasiSeparated {X : Scheme} {U : Opens X.carrier} (hU : IsAffineOpen U) :
IsQuasiSeparated (U : Set X.carrier) :=
by
rw [isQuasiSeparated_iff_quasiSeparatedSpace]
exacts [@AlgebraicGeometry.quasiSeparatedSpace_of_isAffine _ hU, U.is_open]
#align algebraic_geometry.is_affine_open.is_quasi_separated AlgebraicGeometry.IsAffineOpen.isQuasiSeparated
+-/
+#print AlgebraicGeometry.quasiSeparatedOfComp /-
theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : QuasiSeparated (f ≫ g)] :
QuasiSeparated f :=
by
@@ -295,7 +344,9 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
(pullback_right_pullback_fst_iso g (Z.affine_cover.map i) f).Hom
· apply AlgebraicGeometry.quasiSeparatedOfMono
#align algebraic_geometry.quasi_separated_of_comp AlgebraicGeometry.quasiSeparatedOfComp
+-/
+#print AlgebraicGeometry.exists_eq_pow_mul_of_isAffineOpen /-
theorem exists_eq_pow_mul_of_isAffineOpen (X : Scheme) (U : Opens X.carrier) (hU : IsAffineOpen U)
(f : X.Presheaf.obj (op U)) (x : X.Presheaf.obj (op <| X.basicOpen f)) :
∃ (n : ℕ) (y : X.Presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x :=
@@ -306,7 +357,9 @@ theorem exists_eq_pow_mul_of_isAffineOpen (X : Scheme) (U : Opens X.carrier) (hU
delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict
simpa [mul_comm x] using d.symm
#align algebraic_geometry.exists_eq_pow_mul_of_is_affine_open AlgebraicGeometry.exists_eq_pow_mul_of_isAffineOpen
+-/
+#print AlgebraicGeometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux /-
theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme)
(S : X.affineOpens) (U₁ U₂ : Opens X.carrier) {n₁ n₂ : ℕ} {y₁ : X.Presheaf.obj (op U₁)}
{y₂ : X.Presheaf.obj (op U₂)} {f : X.Presheaf.obj (op <| U₁ ⊔ U₂)}
@@ -364,7 +417,9 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
Subtype.coe_mk] at e ⊢
exact e
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux AlgebraicGeometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux
+-/
+#print AlgebraicGeometry.exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated /-
theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U : Opens X.carrier)
(hU : IsCompact U.1) (hU' : IsQuasiSeparated U.1) (f : X.Presheaf.obj (op U))
(x : X.Presheaf.obj (op <| X.basicOpen f)) :
@@ -490,7 +545,9 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
pow_add]
erw [hy₂]; rw [← comp_apply, ← functor.map_comp]; congr
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_is_quasi_separated AlgebraicGeometry.exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated
+-/
+#print AlgebraicGeometry.is_localization_basicOpen_of_qcqs /-
/-- If `U` is qcqs, then `Γ(X, D(f)) ≃ Γ(X, U)_f` for every `f : Γ(X, U)`.
This is known as the **Qcqs lemma** in [R. Vakil, *The rising sea*][RisingSea]. -/
theorem is_localization_basicOpen_of_qcqs {X : Scheme} {U : Opens X.carrier} (hU : IsCompact U.1)
@@ -518,6 +575,7 @@ theorem is_localization_basicOpen_of_qcqs {X : Scheme} {U : Opens X.carrier} (hU
rw [← ((RingedSpace.is_unit_res_basic_open _ f).pow n).mul_right_inj, MulZeroClass.mul_zero, ←
map_pow, ← map_mul, e, map_zero]
#align algebraic_geometry.is_localization_basic_open_of_qcqs AlgebraicGeometry.is_localization_basicOpen_of_qcqs
+-/
end AlgebraicGeometry
mathlib commit https://github.com/leanprover-community/mathlib/commit/9240e8be927a0955b9a82c6c85ef499ee3a626b8
@@ -47,7 +47,7 @@ variable {X Y : Scheme.{u}} (f : X ⟶ Y)
/-- A morphism is `quasi_separated` if diagonal map is quasi-compact. -/
@[mk_iff]
class QuasiSeparated (f : X ⟶ Y) : Prop where
- diagonalQuasiCompact : QuasiCompact (pullback.diagonal f)
+ diagonal_quasiCompact : QuasiCompact (pullback.diagonal f)
#align algebraic_geometry.quasi_separated AlgebraicGeometry.QuasiSeparated
/-- The `affine_target_morphism_property` corresponding to `quasi_separated`, asserting that the
mathlib commit https://github.com/leanprover-community/mathlib/commit/9240e8be927a0955b9a82c6c85ef499ee3a626b8
@@ -137,9 +137,9 @@ theorem quasiSeparated_eq_affineProperty :
rw [quasi_separated_eq_affine_property_diagonal, quasi_compact_affine_property_diagonal_eq]
#align algebraic_geometry.quasi_separated_eq_affine_property AlgebraicGeometry.quasiSeparated_eq_affineProperty
-theorem QuasiSeparated.affinePropertyIsLocal : QuasiSeparated.affineProperty.IsLocal :=
- quasi_compact_affineProperty_diagonal_eq ▸ QuasiCompact.affinePropertyIsLocal.diagonal
-#align algebraic_geometry.quasi_separated.affine_property_is_local AlgebraicGeometry.QuasiSeparated.affinePropertyIsLocal
+theorem QuasiSeparated.affineProperty_isLocal : QuasiSeparated.affineProperty.IsLocal :=
+ quasi_compact_affineProperty_diagonal_eq ▸ QuasiCompact.affineProperty_isLocal.diagonal
+#align algebraic_geometry.quasi_separated.affine_property_is_local AlgebraicGeometry.QuasiSeparated.affineProperty_isLocal
instance (priority := 900) quasiSeparatedOfMono {X Y : Scheme} (f : X ⟶ Y) [Mono f] :
QuasiSeparated f :=
@@ -189,10 +189,10 @@ theorem QuasiSeparated.affine_openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
exact this
#align algebraic_geometry.quasi_separated.affine_open_cover_tfae AlgebraicGeometry.QuasiSeparated.affine_openCover_tFAE
-theorem QuasiSeparated.isLocalAtTarget : PropertyIsLocalAtTarget @QuasiSeparated :=
+theorem QuasiSeparated.is_local_at_target : PropertyIsLocalAtTarget @QuasiSeparated :=
quasiSeparated_eq_affineProperty_diagonal.symm ▸
- QuasiCompact.affinePropertyIsLocal.diagonal.targetAffineLocallyIsLocal
-#align algebraic_geometry.quasi_separated.is_local_at_target AlgebraicGeometry.QuasiSeparated.isLocalAtTarget
+ QuasiCompact.affineProperty_isLocal.diagonal.targetAffineLocallyIsLocal
+#align algebraic_geometry.quasi_separated.is_local_at_target AlgebraicGeometry.QuasiSeparated.is_local_at_target
theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
TFAE
@@ -206,7 +206,7 @@ theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
QuasiSeparated (pullback.snd : pullback f g ⟶ _),
∃ (ι : Type u) (U : ι → Opens Y.carrier) (hU : iSup U = ⊤),
∀ i, QuasiSeparated (f ∣_ U i)] :=
- QuasiSeparated.isLocalAtTarget.openCover_tFAE f
+ QuasiSeparated.is_local_at_target.openCover_TFAE f
#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_tFAE
theorem quasiSeparated_over_affine_iff {X Y : Scheme} (f : X ⟶ Y) [IsAffine Y] :
@@ -231,7 +231,7 @@ theorem QuasiSeparated.affine_openCover_iff {X Y : Scheme.{u}} (𝒰 : Scheme.Op
theorem QuasiSeparated.openCover_iff {X Y : Scheme.{u}} (𝒰 : Scheme.OpenCover.{u} Y) (f : X ⟶ Y) :
QuasiSeparated f ↔ ∀ i, QuasiSeparated (pullback.snd : pullback f (𝒰.map i) ⟶ _) :=
- QuasiSeparated.isLocalAtTarget.openCover_iff f 𝒰
+ QuasiSeparated.is_local_at_target.openCover_iff f 𝒰
#align algebraic_geometry.quasi_separated.open_cover_iff AlgebraicGeometry.QuasiSeparated.openCover_iff
instance {X Y S : Scheme} (f : X ⟶ S) (g : Y ⟶ S) [QuasiSeparated g] :
mathlib commit https://github.com/leanprover-community/mathlib/commit/6285167a053ad0990fc88e56c48ccd9fae6550eb
@@ -175,7 +175,7 @@ theorem QuasiSeparated.affine_openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
∀ i : 𝒰.J, QuasiSeparatedSpace (pullback f (𝒰.map i)).carrier,
∀ (𝒰 : Scheme.OpenCover.{u} Y) [∀ i, IsAffine (𝒰.obj i)] (i : 𝒰.J),
QuasiSeparatedSpace (pullback f (𝒰.map i)).carrier,
- ∀ {U : Scheme} (g : U ⟶ Y) [IsAffine U] [IsOpenImmersion g],
+ ∀ {U : Scheme} (g : U ⟶ Y) [IsAffine U] [IsOpenImmersionCat g],
QuasiSeparatedSpace (pullback f g).carrier,
∃ (𝒰 : Scheme.OpenCover.{u} Y) (_ : ∀ i, IsAffine (𝒰.obj i)) (𝒰' :
∀ i : 𝒰.J, Scheme.OpenCover.{u} (pullback f (𝒰.map i))) (_ :
@@ -202,7 +202,7 @@ theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
∀ (𝒰 : Scheme.OpenCover.{u} Y) (i : 𝒰.J),
QuasiSeparated (pullback.snd : (𝒰.pullbackCover f).obj i ⟶ 𝒰.obj i),
∀ U : Opens Y.carrier, QuasiSeparated (f ∣_ U),
- ∀ {U : Scheme} (g : U ⟶ Y) [IsOpenImmersion g],
+ ∀ {U : Scheme} (g : U ⟶ Y) [IsOpenImmersionCat g],
QuasiSeparated (pullback.snd : pullback f g ⟶ _),
∃ (ι : Type u) (U : ι → Opens Y.carrier) (hU : iSup U = ⊤),
∀ i, QuasiSeparated (f ∣_ U i)] :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/13361559d66b84f80b6d5a1c4a26aa5054766725
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
! This file was ported from Lean 3 source module algebraic_geometry.morphisms.quasi_separated
-! leanprover-community/mathlib commit d39590fc8728fbf6743249802486f8c91ffe07bc
+! leanprover-community/mathlib commit 13361559d66b84f80b6d5a1c4a26aa5054766725
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -365,7 +365,7 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
exact e
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux AlgebraicGeometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux
-theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Opens X.carrier)
+theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U : Opens X.carrier)
(hU : IsCompact U.1) (hU' : IsQuasiSeparated U.1) (f : X.Presheaf.obj (op U))
(x : X.Presheaf.obj (op <| X.basicOpen f)) :
∃ (n : ℕ) (y : X.Presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x :=
@@ -432,7 +432,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
X.presheaf.map (hom_of_le <| inf_le_right).op
(X.presheaf.map (hom_of_le le_sup_right).op f ^ (finset.univ.sup n + n₁) * y₂) :=
by
- fapply X.sheaf.eq_of_locally_eq' fun i : s => i.1.1
+ fapply TopCat.Sheaf.eq_of_locally_eq'.{u + 1, u} X.sheaf fun i : s => i.1.1
· refine' fun i => hom_of_le _; erw [hs]; exact le_iSup _ _
· exact le_of_eq hs
· intro i
@@ -456,7 +456,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
-- the desired section on `S ∪ U`.
use (X.sheaf.obj_sup_iso_prod_eq_locus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩
refine'
- X.sheaf.eq_of_locally_eq₂
+ TopCat.Sheaf.eq_of_locally_eq₂.{u + 1, u} X.sheaf
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_left).op f) ≤ _))
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_right).op f) ≤ _)) _ _ _ _ _
· rw [X.basic_open_res]; exact inf_le_right
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -464,8 +464,10 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
· rw [X.basic_open_res, X.basic_open_res]
erw [← inf_sup_right]
refine' le_inf_iff.mpr ⟨X.basic_open_le f, le_of_eq rfl⟩
- · convert congr_arg (X.presheaf.map (hom_of_le _).op)
- (X.sheaf.obj_sup_iso_prod_eq_locus_inv_fst S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1
+ · convert
+ congr_arg (X.presheaf.map (hom_of_le _).op)
+ (X.sheaf.obj_sup_iso_prod_eq_locus_inv_fst S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using
+ 1
· delta Scheme.sheaf SheafedSpace.sheaf
simp only [← comp_apply (X.presheaf.map _) (X.presheaf.map _), ← functor.map_comp, ←
op_comp]
@@ -475,8 +477,10 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
pow_add]
erw [hy₁]; congr 1; rw [← mul_assoc, ← mul_assoc]; congr 1
rw [mul_comm, ← comp_apply, ← functor.map_comp]; congr
- · convert congr_arg (X.presheaf.map (hom_of_le _).op)
- (X.sheaf.obj_sup_iso_prod_eq_locus_inv_snd S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1
+ · convert
+ congr_arg (X.presheaf.map (hom_of_le _).op)
+ (X.sheaf.obj_sup_iso_prod_eq_locus_inv_snd S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using
+ 1
· delta Scheme.sheaf SheafedSpace.sheaf
simp only [← comp_apply (X.presheaf.map _) (X.presheaf.map _), ← functor.map_comp, ←
op_comp]
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -97,8 +97,8 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
pullback.fst ≫ X.of_restrict _
have : is_open_immersion g := inferInstance
have e := Homeomorph.ofEmbedding _ this.base_open.to_embedding
- rw [is_open_immersion.range_pullback_to_base_of_left] at e
- erw [Subtype.range_coe, Subtype.range_coe] at e
+ rw [is_open_immersion.range_pullback_to_base_of_left] at e
+ erw [Subtype.range_coe, Subtype.range_coe] at e
rw [isCompact_iff_compactSpace]
exact @Homeomorph.compactSpace _ _ (H _ _) e
· introv H h₁ h₂
@@ -106,8 +106,8 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
let g : pullback f₁ f₂ ⟶ X := pullback.fst ≫ f₁
have : is_open_immersion g := inferInstance
have e := Homeomorph.ofEmbedding _ this.base_open.to_embedding
- rw [is_open_immersion.range_pullback_to_base_of_left] at e
- simp_rw [isCompact_iff_compactSpace] at H
+ rw [is_open_immersion.range_pullback_to_base_of_left] at e
+ simp_rw [isCompact_iff_compactSpace] at H
exact
@Homeomorph.compactSpace _ _
(H ⟨⟨_, h₁.base_open.open_range⟩, range_is_affine_open_of_open_immersion _⟩
@@ -171,21 +171,21 @@ theorem quasiSeparated_respectsIso : MorphismProperty.RespectsIso @QuasiSeparate
theorem QuasiSeparated.affine_openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
TFAE
[QuasiSeparated f,
- ∃ (𝒰 : Scheme.OpenCover.{u} Y)(_ : ∀ i, IsAffine (𝒰.obj i)),
+ ∃ (𝒰 : Scheme.OpenCover.{u} Y) (_ : ∀ i, IsAffine (𝒰.obj i)),
∀ i : 𝒰.J, QuasiSeparatedSpace (pullback f (𝒰.map i)).carrier,
∀ (𝒰 : Scheme.OpenCover.{u} Y) [∀ i, IsAffine (𝒰.obj i)] (i : 𝒰.J),
QuasiSeparatedSpace (pullback f (𝒰.map i)).carrier,
∀ {U : Scheme} (g : U ⟶ Y) [IsAffine U] [IsOpenImmersion g],
QuasiSeparatedSpace (pullback f g).carrier,
- ∃ (𝒰 : Scheme.OpenCover.{u} Y)(_ : ∀ i, IsAffine (𝒰.obj i))(𝒰' :
- ∀ i : 𝒰.J, Scheme.OpenCover.{u} (pullback f (𝒰.map i)))(_ :
+ ∃ (𝒰 : Scheme.OpenCover.{u} Y) (_ : ∀ i, IsAffine (𝒰.obj i)) (𝒰' :
+ ∀ i : 𝒰.J, Scheme.OpenCover.{u} (pullback f (𝒰.map i))) (_ :
∀ i j, IsAffine ((𝒰' i).obj j)),
∀ (i : 𝒰.J) (j k : (𝒰' i).J),
CompactSpace (pullback ((𝒰' i).map j) ((𝒰' i).map k)).carrier] :=
by
have := quasi_compact.affine_property_is_local.diagonal_affine_open_cover_tfae f
simp_rw [← quasi_compact_eq_affine_property, ← quasi_separated_eq_diagonal_is_quasi_compact,
- quasi_compact_affine_property_diagonal_eq] at this
+ quasi_compact_affine_property_diagonal_eq] at this
exact this
#align algebraic_geometry.quasi_separated.affine_open_cover_tfae AlgebraicGeometry.QuasiSeparated.affine_openCover_tFAE
@@ -204,7 +204,8 @@ theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
∀ U : Opens Y.carrier, QuasiSeparated (f ∣_ U),
∀ {U : Scheme} (g : U ⟶ Y) [IsOpenImmersion g],
QuasiSeparated (pullback.snd : pullback f g ⟶ _),
- ∃ (ι : Type u)(U : ι → Opens Y.carrier)(hU : iSup U = ⊤), ∀ i, QuasiSeparated (f ∣_ U i)] :=
+ ∃ (ι : Type u) (U : ι → Opens Y.carrier) (hU : iSup U = ⊤),
+ ∀ i, QuasiSeparated (f ∣_ U i)] :=
QuasiSeparated.isLocalAtTarget.openCover_tFAE f
#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_tFAE
@@ -248,7 +249,7 @@ instance {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [QuasiSeparated f] [QuasiS
theorem quasiSeparatedSpace_of_quasiSeparated {X Y : Scheme} (f : X ⟶ Y)
[hY : QuasiSeparatedSpace Y.carrier] [QuasiSeparated f] : QuasiSeparatedSpace X.carrier :=
by
- rw [quasi_separated_space_iff_quasi_separated] at hY⊢
+ rw [quasi_separated_space_iff_quasi_separated] at hY ⊢
have : f ≫ terminal.from Y = terminal.from X := terminal_is_terminal.hom_ext _ _
rw [← this]
skip; infer_instance
@@ -275,14 +276,14 @@ theorem IsAffineOpen.isQuasiSeparated {X : Scheme} {U : Opens X.carrier} (hU : I
IsQuasiSeparated (U : Set X.carrier) :=
by
rw [isQuasiSeparated_iff_quasiSeparatedSpace]
- exacts[@AlgebraicGeometry.quasiSeparatedSpace_of_isAffine _ hU, U.is_open]
+ exacts [@AlgebraicGeometry.quasiSeparatedSpace_of_isAffine _ hU, U.is_open]
#align algebraic_geometry.is_affine_open.is_quasi_separated AlgebraicGeometry.IsAffineOpen.isQuasiSeparated
theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : QuasiSeparated (f ≫ g)] :
QuasiSeparated f :=
by
rw [(quasi_separated.affine_open_cover_tfae f).out 0 1]
- rw [(quasi_separated.affine_open_cover_tfae (f ≫ g)).out 0 2] at H
+ rw [(quasi_separated.affine_open_cover_tfae (f ≫ g)).out 0 2] at H
use (Z.affine_cover.pullback_cover g).bind fun x => Scheme.affine_cover _
constructor; · intro i; dsimp; infer_instance
rintro ⟨i, j⟩; dsimp at *
@@ -297,7 +298,7 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
theorem exists_eq_pow_mul_of_isAffineOpen (X : Scheme) (U : Opens X.carrier) (hU : IsAffineOpen U)
(f : X.Presheaf.obj (op U)) (x : X.Presheaf.obj (op <| X.basicOpen f)) :
- ∃ (n : ℕ)(y : X.Presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x :=
+ ∃ (n : ℕ) (y : X.Presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x :=
by
have := (is_localization_basic_open hU f).2
obtain ⟨⟨y, _, n, rfl⟩, d⟩ := this x
@@ -360,14 +361,14 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
rintro x ⟨H₁, H₂⟩; exact ⟨h₂ H₁, H₂⟩
use n
simp only [pow_add, map_pow, map_mul, ← comp_apply, ← mul_assoc, ← functor.map_comp,
- Subtype.coe_mk] at e⊢
+ Subtype.coe_mk] at e ⊢
exact e
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux AlgebraicGeometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux
theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Opens X.carrier)
(hU : IsCompact U.1) (hU' : IsQuasiSeparated U.1) (f : X.Presheaf.obj (op U))
(x : X.Presheaf.obj (op <| X.basicOpen f)) :
- ∃ (n : ℕ)(y : X.Presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x :=
+ ∃ (n : ℕ) (y : X.Presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x :=
by
delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict
revert hU' f x
@@ -391,7 +392,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
obtain ⟨n₂, y₂, hy₂⟩ :=
exists_eq_pow_mul_of_is_affine_open X _ U.2 (X.presheaf.map (hom_of_le le_sup_right).op f)
(X.presheaf.map (hom_of_le _).op x)
- delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict at hy₂
+ delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict at hy₂
swap; · rw [X.basic_open_res]; exact inf_le_right
-- Since `S ∪ U` is quasi-separated, `S ∩ U` can be covered by finite affine opens.
obtain ⟨s, hs', hs⟩ :=
@@ -442,12 +443,12 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
(finset.univ.sup n - n i) *
x)
(hn i)
- dsimp only at hn
+ dsimp only at hn
delta Scheme.sheaf SheafedSpace.sheaf
simp only [← map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp, ← mul_assoc] at
- hn⊢
- erw [← map_mul, ← map_mul] at hn
- rw [← pow_add, ← pow_add, ← add_assoc, ← add_assoc, tsub_add_cancel_of_le] at hn
+ hn ⊢
+ erw [← map_mul, ← map_mul] at hn
+ rw [← pow_add, ← pow_add, ← add_assoc, ← add_assoc, tsub_add_cancel_of_le] at hn
convert hn
exact Finset.le_sup (Finset.mem_univ _)
use finset.univ.sup n + n₁ + n₂
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -38,7 +38,7 @@ open CategoryTheory CategoryTheory.Limits Opposite TopologicalSpace
universe u
-open AlgebraicGeometry
+open scoped AlgebraicGeometry
namespace AlgebraicGeometry
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -61,15 +61,12 @@ theorem quasiSeparatedSpace_iff_affine (X : Scheme) :
by
rw [quasiSeparatedSpace_iff]
constructor
- · intro H U V
- exact H U V U.1.2 U.2.IsCompact V.1.2 V.2.IsCompact
+ · intro H U V; exact H U V U.1.2 U.2.IsCompact V.1.2 V.2.IsCompact
· intro H
suffices
∀ (U : opens X.carrier) (hU : IsCompact U.1) (V : opens X.carrier) (hV : IsCompact V.1),
IsCompact (U ⊓ V).1
- by
- intro U V hU hU' hV hV'
- exact this ⟨U, hU⟩ hU' ⟨V, hV⟩ hV'
+ by intro U V hU hU' hV hV'; exact this ⟨U, hU⟩ hU' ⟨V, hV⟩ hV'
intro U hU V hV
apply compact_open_induction_on V hV
· simp
@@ -119,18 +116,12 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
#align algebraic_geometry.quasi_compact_affine_property_iff_quasi_separated_space AlgebraicGeometry.quasi_compact_affineProperty_iff_quasiSeparatedSpace
theorem quasiSeparated_eq_diagonal_is_quasiCompact :
- @QuasiSeparated = MorphismProperty.diagonal @QuasiCompact :=
- by
- ext
- exact quasi_separated_iff _
+ @QuasiSeparated = MorphismProperty.diagonal @QuasiCompact := by ext; exact quasi_separated_iff _
#align algebraic_geometry.quasi_separated_eq_diagonal_is_quasi_compact AlgebraicGeometry.quasiSeparated_eq_diagonal_is_quasiCompact
theorem quasi_compact_affineProperty_diagonal_eq :
- QuasiCompact.affineProperty.diagonal = QuasiSeparated.affineProperty :=
- by
- ext
- rw [quasi_compact_affine_property_iff_quasi_separated_space]
- rfl
+ QuasiCompact.affineProperty.diagonal = QuasiSeparated.affineProperty := by ext;
+ rw [quasi_compact_affine_property_iff_quasi_separated_space]; rfl
#align algebraic_geometry.quasi_compact_affine_property_diagonal_eq AlgebraicGeometry.quasi_compact_affineProperty_diagonal_eq
theorem quasiSeparated_eq_affineProperty_diagonal :
@@ -293,10 +284,7 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
rw [(quasi_separated.affine_open_cover_tfae f).out 0 1]
rw [(quasi_separated.affine_open_cover_tfae (f ≫ g)).out 0 2] at H
use (Z.affine_cover.pullback_cover g).bind fun x => Scheme.affine_cover _
- constructor;
- · intro i
- dsimp
- infer_instance
+ constructor; · intro i; dsimp; infer_instance
rintro ⟨i, j⟩; dsimp at *
specialize H _ i
refine' @quasi_separated_space_of_quasi_separated _ H _
@@ -325,35 +313,17 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
(e₁ :
X.Presheaf.map
(homOfLE <| X.basicOpen_le (X.Presheaf.map (homOfLE le_sup_left).op f) : _ ⟶ U₁).op y₁ =
- X.Presheaf.map
- (homOfLE
- (by
- erw [X.basic_open_res]
- exact inf_le_left)).op
+ X.Presheaf.map (homOfLE (by erw [X.basic_open_res]; exact inf_le_left)).op
(X.Presheaf.map (homOfLE le_sup_left).op f) ^
n₁ *
- (X.Presheaf.map
- (homOfLE
- (by
- erw [X.basic_open_res]
- exact inf_le_right)).op)
- x)
+ (X.Presheaf.map (homOfLE (by erw [X.basic_open_res]; exact inf_le_right)).op) x)
(e₂ :
X.Presheaf.map
(homOfLE <| X.basicOpen_le (X.Presheaf.map (homOfLE le_sup_right).op f) : _ ⟶ U₂).op y₂ =
- X.Presheaf.map
- (homOfLE
- (by
- rw [X.basic_open_res]
- exact inf_le_left)).op
+ X.Presheaf.map (homOfLE (by rw [X.basic_open_res]; exact inf_le_left)).op
(X.Presheaf.map (homOfLE le_sup_right).op f) ^
n₂ *
- (X.Presheaf.map
- (homOfLE
- (by
- rw [X.basic_open_res]
- exact inf_le_right)).op)
- x) :
+ (X.Presheaf.map (homOfLE (by rw [X.basic_open_res]; exact inf_le_right)).op) x) :
∃ n : ℕ,
X.Presheaf.map (homOfLE <| h₁).op
(X.Presheaf.map (homOfLE le_sup_left).op f ^ (n + n₂) * y₁) =
@@ -377,26 +347,17 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
trans
X.presheaf.map (hom_of_le <| h₃.trans <| h₁.trans le_sup_left).op f ^ (n₂ + n₁) *
X.presheaf.map (hom_of_le <| (X.basic_open_res f _).trans_le inf_le_right).op x
- · rw [pow_add, mul_assoc]
- congr 1
+ · rw [pow_add, mul_assoc]; congr 1
convert congr_arg (X.presheaf.map (hom_of_le _).op) e₁
- · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]
- congr
- · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]
- congr
- · rw [X.basic_open_res, X.basic_open_res]
- rintro x ⟨H₁, H₂⟩
- exact ⟨h₁ H₁, H₂⟩
- · rw [add_comm, pow_add, mul_assoc]
- congr 1
+ · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]; congr
+ · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]; congr
+ · rw [X.basic_open_res, X.basic_open_res]; rintro x ⟨H₁, H₂⟩; exact ⟨h₁ H₁, H₂⟩
+ · rw [add_comm, pow_add, mul_assoc]; congr 1
convert congr_arg (X.presheaf.map (hom_of_le _).op) e₂.symm
- · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]
- congr
- · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]
- congr
+ · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]; congr
+ · simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp]; congr
· simp only [X.basic_open_res]
- rintro x ⟨H₁, H₂⟩
- exact ⟨h₂ H₁, H₂⟩
+ rintro x ⟨H₁, H₂⟩; exact ⟨h₂ H₁, H₂⟩
use n
simp only [pow_add, map_pow, map_mul, ← comp_apply, ← mul_assoc, ← functor.map_comp,
Subtype.coe_mk] at e⊢
@@ -425,17 +386,13 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
obtain ⟨n₁, y₁, hy₁⟩ :=
hU (hSU.of_subset <| Set.subset_union_left _ _) (X.presheaf.map (hom_of_le le_sup_left).op f)
(X.presheaf.map (hom_of_le _).op x)
- swap
- · rw [X.basic_open_res]
- exact inf_le_right
+ swap; · rw [X.basic_open_res]; exact inf_le_right
-- We know that such `y₂, n₂` exists on `U` since `U` is affine.
obtain ⟨n₂, y₂, hy₂⟩ :=
exists_eq_pow_mul_of_is_affine_open X _ U.2 (X.presheaf.map (hom_of_le le_sup_right).op f)
(X.presheaf.map (hom_of_le _).op x)
delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict at hy₂
- swap
- · rw [X.basic_open_res]
- exact inf_le_right
+ swap; · rw [X.basic_open_res]; exact inf_le_right
-- Since `S ∪ U` is quasi-separated, `S ∩ U` can be covered by finite affine opens.
obtain ⟨s, hs', hs⟩ :=
(is_compact_open_iff_eq_finset_affine_union _).mp
@@ -444,24 +401,13 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
(S ⊓ U.1).2⟩
haveI := hs'.to_subtype
cases nonempty_fintype s
- replace hs : S ⊓ U.1 = iSup fun i : s => (i : opens X.carrier) :=
- by
- ext1
- simpa using hs
+ replace hs : S ⊓ U.1 = iSup fun i : s => (i : opens X.carrier) := by ext1; simpa using hs
have hs₁ : ∀ i : s, i.1.1 ≤ S := by
- intro i
- change (i : opens X.carrier) ≤ S
- refine' le_trans _ inf_le_left
- use U.1
- erw [hs]
- exact le_iSup _ _
+ intro i; change (i : opens X.carrier) ≤ S
+ refine' le_trans _ inf_le_left; use U.1; erw [hs]; exact le_iSup _ _
have hs₂ : ∀ i : s, i.1.1 ≤ U.1 := by
- intro i
- change (i : opens X.carrier) ≤ U
- refine' le_trans _ inf_le_right
- use S
- erw [hs]
- exact le_iSup _ _
+ intro i; change (i : opens X.carrier) ≤ U
+ refine' le_trans _ inf_le_right; use S; erw [hs]; exact le_iSup _ _
-- On each affine open in the intersection, we have `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
-- for some `n` since `f ^ n₂ * y₁ = f ^ (n₁ + n₂) * x = f ^ n₁ * y₂` on `X_f`.
have :
@@ -486,9 +432,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
(X.presheaf.map (hom_of_le le_sup_right).op f ^ (finset.univ.sup n + n₁) * y₂) :=
by
fapply X.sheaf.eq_of_locally_eq' fun i : s => i.1.1
- · refine' fun i => hom_of_le _
- erw [hs]
- exact le_iSup _ _
+ · refine' fun i => hom_of_le _; erw [hs]; exact le_iSup _ _
· exact le_of_eq hs
· intro i
replace hn :=
@@ -514,10 +458,8 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
X.sheaf.eq_of_locally_eq₂
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_left).op f) ≤ _))
(hom_of_le (_ : X.basic_open (X.presheaf.map (hom_of_le le_sup_right).op f) ≤ _)) _ _ _ _ _
- · rw [X.basic_open_res]
- exact inf_le_right
- · rw [X.basic_open_res]
- exact inf_le_right
+ · rw [X.basic_open_res]; exact inf_le_right
+ · rw [X.basic_open_res]; exact inf_le_right
· rw [X.basic_open_res, X.basic_open_res]
erw [← inf_sup_right]
refine' le_inf_iff.mpr ⟨X.basic_open_le f, le_of_eq rfl⟩
@@ -530,12 +472,8 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
· delta Scheme.sheaf SheafedSpace.sheaf
simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp, mul_assoc,
pow_add]
- erw [hy₁]
- congr 1
- rw [← mul_assoc, ← mul_assoc]
- congr 1
- rw [mul_comm, ← comp_apply, ← functor.map_comp]
- congr
+ erw [hy₁]; congr 1; rw [← mul_assoc, ← mul_assoc]; congr 1
+ rw [mul_comm, ← comp_apply, ← functor.map_comp]; congr
· convert congr_arg (X.presheaf.map (hom_of_le _).op)
(X.sheaf.obj_sup_iso_prod_eq_locus_inv_snd S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1
· delta Scheme.sheaf SheafedSpace.sheaf
@@ -545,9 +483,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
· delta Scheme.sheaf SheafedSpace.sheaf
simp only [map_pow, map_mul, ← comp_apply, ← functor.map_comp, ← op_comp, mul_assoc,
pow_add]
- erw [hy₂]
- rw [← comp_apply, ← functor.map_comp]
- congr
+ erw [hy₂]; rw [← comp_apply, ← functor.map_comp]; congr
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_is_quasi_separated AlgebraicGeometry.exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated
/-- If `U` is qcqs, then `Γ(X, D(f)) ≃ Γ(X, U)_f` for every `f : Γ(X, U)`.
mathlib commit https://github.com/leanprover-community/mathlib/commit/33c67ae661dd8988516ff7f247b0be3018cdd952
@@ -277,7 +277,7 @@ instance quasiSeparatedSpace_of_isAffine (X : Scheme) [IsAffine X] :
intro i' hi'
change IsCompact (X.basic_open i ⊓ X.basic_open i').1
rw [← Scheme.basic_open_mul]
- exact ((top_is_affine_open _).basicOpen_is_affine _).IsCompact
+ exact ((top_is_affine_open _).basicOpenIsAffine _).IsCompact
#align algebraic_geometry.quasi_separated_space_of_is_affine AlgebraicGeometry.quasiSeparatedSpace_of_isAffine
theorem IsAffineOpen.isQuasiSeparated {X : Scheme} {U : Opens X.carrier} (hU : IsAffineOpen U) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -213,7 +213,7 @@ theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
∀ U : Opens Y.carrier, QuasiSeparated (f ∣_ U),
∀ {U : Scheme} (g : U ⟶ Y) [IsOpenImmersion g],
QuasiSeparated (pullback.snd : pullback f g ⟶ _),
- ∃ (ι : Type u)(U : ι → Opens Y.carrier)(hU : supᵢ U = ⊤), ∀ i, QuasiSeparated (f ∣_ U i)] :=
+ ∃ (ι : Type u)(U : ι → Opens Y.carrier)(hU : iSup U = ⊤), ∀ i, QuasiSeparated (f ∣_ U i)] :=
QuasiSeparated.isLocalAtTarget.openCover_tFAE f
#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_tFAE
@@ -269,8 +269,8 @@ instance quasiSeparatedSpace_of_isAffine (X : Scheme) [IsAffine X] :
intro U V hU hU' hV hV'
obtain ⟨s, hs, e⟩ := (is_compact_open_iff_eq_basic_open_union _).mp ⟨hU', hU⟩
obtain ⟨s', hs', e'⟩ := (is_compact_open_iff_eq_basic_open_union _).mp ⟨hV', hV⟩
- rw [e, e', Set.unionᵢ₂_inter]
- simp_rw [Set.inter_unionᵢ₂]
+ rw [e, e', Set.iUnion₂_inter]
+ simp_rw [Set.inter_iUnion₂]
apply hs.is_compact_bUnion
· intro i hi
apply hs'.is_compact_bUnion
@@ -444,7 +444,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
(S ⊓ U.1).2⟩
haveI := hs'.to_subtype
cases nonempty_fintype s
- replace hs : S ⊓ U.1 = supᵢ fun i : s => (i : opens X.carrier) :=
+ replace hs : S ⊓ U.1 = iSup fun i : s => (i : opens X.carrier) :=
by
ext1
simpa using hs
@@ -454,14 +454,14 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
refine' le_trans _ inf_le_left
use U.1
erw [hs]
- exact le_supᵢ _ _
+ exact le_iSup _ _
have hs₂ : ∀ i : s, i.1.1 ≤ U.1 := by
intro i
change (i : opens X.carrier) ≤ U
refine' le_trans _ inf_le_right
use S
erw [hs]
- exact le_supᵢ _ _
+ exact le_iSup _ _
-- On each affine open in the intersection, we have `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
-- for some `n` since `f ^ n₂ * y₁ = f ^ (n₁ + n₂) * x = f ^ n₁ * y₂` on `X_f`.
have :
@@ -488,7 +488,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
fapply X.sheaf.eq_of_locally_eq' fun i : s => i.1.1
· refine' fun i => hom_of_le _
erw [hs]
- exact le_supᵢ _ _
+ exact le_iSup _ _
· exact le_of_eq hs
· intro i
replace hn :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -521,10 +521,8 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
· rw [X.basic_open_res, X.basic_open_res]
erw [← inf_sup_right]
refine' le_inf_iff.mpr ⟨X.basic_open_le f, le_of_eq rfl⟩
- · convert
- congr_arg (X.presheaf.map (hom_of_le _).op)
- (X.sheaf.obj_sup_iso_prod_eq_locus_inv_fst S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using
- 1
+ · convert congr_arg (X.presheaf.map (hom_of_le _).op)
+ (X.sheaf.obj_sup_iso_prod_eq_locus_inv_fst S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1
· delta Scheme.sheaf SheafedSpace.sheaf
simp only [← comp_apply (X.presheaf.map _) (X.presheaf.map _), ← functor.map_comp, ←
op_comp]
@@ -538,10 +536,8 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme) (U : Ope
congr 1
rw [mul_comm, ← comp_apply, ← functor.map_comp]
congr
- · convert
- congr_arg (X.presheaf.map (hom_of_le _).op)
- (X.sheaf.obj_sup_iso_prod_eq_locus_inv_snd S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using
- 1
+ · convert congr_arg (X.presheaf.map (hom_of_le _).op)
+ (X.sheaf.obj_sup_iso_prod_eq_locus_inv_snd S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1
· delta Scheme.sheaf SheafedSpace.sheaf
simp only [← comp_apply (X.presheaf.map _) (X.presheaf.map _), ← functor.map_comp, ←
op_comp]
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -578,8 +578,8 @@ theorem is_localization_basicOpen_of_qcqs {X : Scheme} {U : Opens X.carrier} (hU
refine' ⟨⟨_, n, rfl⟩, _⟩
simpa [mul_comm z] using e
· rintro ⟨⟨_, n, rfl⟩, e : f ^ n * z = 0⟩
- rw [← ((RingedSpace.is_unit_res_basic_open _ f).pow n).mul_right_inj, mul_zero, ← map_pow, ←
- map_mul, e, map_zero]
+ rw [← ((RingedSpace.is_unit_res_basic_open _ f).pow n).mul_right_inj, MulZeroClass.mul_zero, ←
+ map_pow, ← map_mul, e, map_zero]
#align algebraic_geometry.is_localization_basic_open_of_qcqs AlgebraicGeometry.is_localization_basicOpen_of_qcqs
end AlgebraicGeometry
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -393,12 +393,16 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
replace hs : S ⊓ U.1 = iSup fun i : s => (i : Opens X.carrier) := by ext1; simpa using hs
have hs₁ : ∀ i : s, i.1.1 ≤ S := by
intro i; change (i : Opens X.carrier) ≤ S
- refine' le_trans _ inf_le_left; swap; exact U.1; erw [hs]
+ refine' le_trans _ inf_le_left; swap
+ · exact U.1
+ erw [hs]
-- Porting note: have to add argument explicitly
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
have hs₂ : ∀ i : s, i.1.1 ≤ U.1 := by
intro i; change (i : Opens X.carrier) ≤ U
- refine' le_trans _ inf_le_right; swap; exact S; erw [hs]
+ refine' le_trans _ inf_le_right; swap
+ · exact S
+ erw [hs]
-- Porting note: have to add argument explicitly
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
-- On each affine open in the intersection, we have `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
The type class MorphismProperty.HasTwoOutOfThreeProperty
is introduced. The structure StableUnderComposition
is also changed into a type class IsStableUnderComposition
.
Co-authored-by: Joël Riou <37772949+joelriou@users.noreply.github.com>
@@ -144,12 +144,12 @@ instance (priority := 900) quasiSeparatedOfMono {X Y : Scheme} (f : X ⟶ Y) [Mo
⟨inferInstance⟩
#align algebraic_geometry.quasi_separated_of_mono AlgebraicGeometry.quasiSeparatedOfMono
-theorem quasiSeparated_stableUnderComposition :
- MorphismProperty.StableUnderComposition @QuasiSeparated :=
+instance quasiSeparated_isStableUnderComposition :
+ MorphismProperty.IsStableUnderComposition @QuasiSeparated :=
quasiSeparated_eq_diagonal_is_quasiCompact.symm ▸
- quasiCompact_stableUnderComposition.diagonal quasiCompact_respectsIso
- quasiCompact_stableUnderBaseChange
-#align algebraic_geometry.quasi_separated_stable_under_composition AlgebraicGeometry.quasiSeparated_stableUnderComposition
+ (MorphismProperty.diagonal_isStableUnderComposition
+ quasiCompact_respectsIso quasiCompact_stableUnderBaseChange)
+#align algebraic_geometry.quasi_separated_stable_under_composition AlgebraicGeometry.quasiSeparated_isStableUnderComposition
theorem quasiSeparated_stableUnderBaseChange :
MorphismProperty.StableUnderBaseChange @QuasiSeparated :=
@@ -159,7 +159,7 @@ theorem quasiSeparated_stableUnderBaseChange :
instance quasiSeparatedComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [QuasiSeparated f]
[QuasiSeparated g] : QuasiSeparated (f ≫ g) :=
- quasiSeparated_stableUnderComposition f g inferInstance inferInstance
+ MorphismProperty.comp_mem _ f g inferInstance inferInstance
#align algebraic_geometry.quasi_separated_comp AlgebraicGeometry.quasiSeparatedComp
theorem quasiSeparated_respectsIso : MorphismProperty.RespectsIso @QuasiSeparated :=
@@ -242,7 +242,7 @@ instance {X Y S : Scheme} (f : X ⟶ S) (g : Y ⟶ S) [QuasiSeparated f] :
instance {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [QuasiSeparated f] [QuasiSeparated g] :
QuasiSeparated (f ≫ g) :=
- quasiSeparated_stableUnderComposition f g inferInstance inferInstance
+ MorphismProperty.comp_mem _ f g inferInstance inferInstance
theorem quasiSeparatedSpace_of_quasiSeparated {X Y : Scheme} (f : X ⟶ Y)
[hY : QuasiSeparatedSpace Y.carrier] [QuasiSeparated f] : QuasiSeparatedSpace X.carrier := by
All these lemmas refer to the range of some function being open/range (i.e. isOpen
or isClosed
).
@@ -109,8 +109,8 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
simp_rw [isCompact_iff_compactSpace] at H
exact
@Homeomorph.compactSpace _ _ _ _
- (H ⟨⟨_, h₁.base_open.open_range⟩, rangeIsAffineOpenOfOpenImmersion _⟩
- ⟨⟨_, h₂.base_open.open_range⟩, rangeIsAffineOpenOfOpenImmersion _⟩)
+ (H ⟨⟨_, h₁.base_open.isOpen_range⟩, rangeIsAffineOpenOfOpenImmersion _⟩
+ ⟨⟨_, h₂.base_open.isOpen_range⟩, rangeIsAffineOpenOfOpenImmersion _⟩)
e.symm
#align algebraic_geometry.quasi_compact_affine_property_iff_quasi_separated_space AlgebraicGeometry.quasi_compact_affineProperty_iff_quasiSeparatedSpace
@@ -310,11 +310,11 @@ theorem exists_eq_pow_mul_of_isAffineOpen (X : Scheme) (U : Opens X.carrier) (hU
theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux_aux {X : TopCat}
(F : X.Presheaf CommRingCat) {U₁ U₂ U₃ U₄ U₅ U₆ U₇ : Opens X} {n₁ n₂ : ℕ}
- {y₁ : F.obj (op U₁)} {y₂ : F.obj (op U₂)} {f : F.obj (op <| U₁ ⊔ U₂)}
- {x : F.obj (op U₃)} (h₄₁ : U₄ ≤ U₁) (h₄₂ : U₄ ≤ U₂) (h₅₁ : U₅ ≤ U₁) (h₅₃ : U₅ ≤ U₃)
- (h₆₂ : U₆ ≤ U₂) (h₆₃ : U₆ ≤ U₃) (h₇₄ : U₇ ≤ U₄) (h₇₅ : U₇ ≤ U₅) (h₇₆ : U₇ ≤ U₆)
- (e₁ : y₁ |_ U₅ = (f |_ U₁ |_ U₅) ^ n₁ * x |_ U₅)
- (e₂ : y₂ |_ U₆ = (f |_ U₂ |_ U₆) ^ n₂ * x |_ U₆) :
+ {y₁ : F.obj (op U₁)} {y₂ : F.obj (op U₂)} {f : F.obj (op <| U₁ ⊔ U₂)}
+ {x : F.obj (op U₃)} (h₄₁ : U₄ ≤ U₁) (h₄₂ : U₄ ≤ U₂) (h₅₁ : U₅ ≤ U₁) (h₅₃ : U₅ ≤ U₃)
+ (h₆₂ : U₆ ≤ U₂) (h₆₃ : U₆ ≤ U₃) (h₇₄ : U₇ ≤ U₄) (h₇₅ : U₇ ≤ U₅) (h₇₆ : U₇ ≤ U₆)
+ (e₁ : y₁ |_ U₅ = (f |_ U₁ |_ U₅) ^ n₁ * x |_ U₅)
+ (e₂ : y₂ |_ U₆ = (f |_ U₂ |_ U₆) ^ n₂ * x |_ U₆) :
(((f |_ U₁) ^ n₂ * y₁) |_ U₄) |_ U₇ = (((f |_ U₂) ^ n₁ * y₂) |_ U₄) |_ U₇ := by
apply_fun (fun x : F.obj (op U₅) ↦ x |_ U₇) at e₁
apply_fun (fun x : F.obj (op U₆) ↦ x |_ U₇) at e₂
The FunLike hierarchy is very big and gets scanned through each time we need a coercion (via the CoeFun
instance). It looks like unbundled inheritance suits Lean 4 better here. The only class that still extends FunLike
is EquivLike
, since that has a custom coe_injective'
field that is easier to implement. All other classes should take FunLike
or EquivLike
as a parameter.
Previously, morphism classes would be Type
-valued and extend FunLike
:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
extends FunLike F A B :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
After this PR, they should be Prop
-valued and take FunLike
as a parameter:
/-- `MyHomClass F A B` states that `F` is a type of `MyClass.op`-preserving morphisms.
You should extend this class when you extend `MyHom`. -/
class MyHomClass (F : Type*) (A B : outParam <| Type*) [MyClass A] [MyClass B]
[FunLike F A B] : Prop :=
(map_op : ∀ (f : F) (x y : A), f (MyClass.op x y) = MyClass.op (f x) (f y))
(Note that A B
stay marked as outParam
even though they are not purely required to be so due to the FunLike
parameter already filling them in. This is required to see through type synonyms, which is important in the category theory library. Also, I think keeping them as outParam
is slightly faster.)
Similarly, MyEquivClass
should take EquivLike
as a parameter.
As a result, every mention of [MyHomClass F A B]
should become [FunLike F A B] [MyHomClass F A B]
.
While overall this gives some great speedups, there are some cases that are noticeably slower. In particular, a failing application of a lemma such as map_mul
is more expensive. This is due to suboptimal processing of arguments. For example:
variable [FunLike F M N] [Mul M] [Mul N] (f : F) (x : M) (y : M)
theorem map_mul [MulHomClass F M N] : f (x * y) = f x * f y
example [AddHomClass F A B] : f (x * y) = f x * f y := map_mul f _ _
Before this PR, applying map_mul f
gives the goals [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Since M
and N
are out_param
s, [MulHomClass F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found.
After this PR, the goals become [FunLike F ?M ?N] [Mul ?M] [Mul ?N] [MulHomClass F ?M ?N]
. Now [FunLike F ?M ?N]
is synthesized first, supplies values for ?M
and ?N
and then the Mul M
and Mul N
instances can be found, before trying MulHomClass F M N
which fails. Since the Mul
hierarchy is very big, this can be slow to fail, especially when there is no such Mul
instance.
A long-term but harder to achieve solution would be to specify the order in which instance goals get solved. For example, we'd like to change the arguments to map_mul
to look like [FunLike F M N] [Mul M] [Mul N] [highPriority <| MulHomClass F M N]
because MulHomClass
fails or succeeds much faster than the others.
As a consequence, the simpNF
linter is much slower since by design it tries and fails to apply many map_
lemmas. The same issue occurs a few times in existing calls to simp [map_mul]
, where map_mul
is tried "too soon" and fails. Thanks to the speedup of leanprover/lean4#2478 the impact is very limited, only in files that already were close to the timeout.
simp
not firing sometimesThis affects map_smulₛₗ
and related definitions. For simp
lemmas Lean apparently uses a slightly different mechanism to find instances, so that rw
can find every argument to map_smulₛₗ
successfully but simp
can't: leanprover/lean4#3701.
Especially in the category theory library, we might sometimes have a type A
which is also accessible as a synonym (Bundled A hA).1
. Instance synthesis doesn't always work if we have f : A →* B
but x * y : (Bundled A hA).1
or vice versa. This seems to be mostly fixed by keeping A B
as outParam
s in MulHomClass F A B
. (Presumably because Lean will do a definitional check A =?= (Bundled A hA).1
instead of using the syntax in the discrimination tree.)
The timeouts can be worked around for now by specifying which map_mul
we mean, either as map_mul f
for some explicit f
, or as e.g. MonoidHomClass.map_mul
.
map_smulₛₗ
not firing as simp
lemma can be worked around by going back to the pre-FunLike situation and making LinearMap.map_smulₛₗ
a simp
lemma instead of the generic map_smulₛₗ
. Writing simp [map_smulₛₗ _]
also works.
Co-authored-by: Matthew Ballard <matt@mrb.email> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Scott Morrison <scott@tqft.net> Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>
@@ -337,10 +337,12 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
(((f |_ U₂) ^ n₁ * y₂) |_ S.1)).mp <| by
apply exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux_aux (e₁ := e₁) (e₂ := e₂)
· show X.basicOpen _ ≤ _
- simp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict, Scheme.basicOpen_res]
+ simp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict]
+ repeat rw [Scheme.basicOpen_res] -- Note: used to be part of the `simp only`
exact inf_le_inf h₁ le_rfl
· show X.basicOpen _ ≤ _
- simp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict, Scheme.basicOpen_res]
+ simp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict]
+ repeat rw [Scheme.basicOpen_res] -- Note: used to be part of the `simp only`
exact inf_le_inf h₂ le_rfl
use n
intros m hm
@@ -418,7 +420,8 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
· exact le_of_eq hs
· intro i
delta Scheme.sheaf SheafedSpace.sheaf
- simp only [← comp_apply, ← Functor.map_comp, ← op_comp]
+ repeat rw [← comp_apply,]
+ simp only [← Functor.map_comp, ← op_comp]
apply hn
exact Finset.le_sup (Finset.mem_univ _)
use Finset.univ.sup n + n₁ + n₂
@@ -429,11 +432,15 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
(homOfLE le_sup_left).op) (X.basicOpen_res _ (homOfLE le_sup_right).op)).mpr ⟨_, _⟩
· delta Scheme.sheaf SheafedSpace.sheaf
rw [add_assoc, add_comm n₁]
- simp only [map_pow, map_mul, hy₁, pow_add, ← mul_assoc, ← comp_apply, ← Functor.map_comp,
- ← op_comp, Category.assoc, homOfLE_comp]
+ simp only [pow_add, map_pow, map_mul]
+ rw [hy₁] -- Note: `simp` can't use this
+ repeat rw [← comp_apply] -- Note: `simp` can't use this
+ simp only [← mul_assoc, ← Functor.map_comp, ← op_comp, homOfLE_comp]
· delta Scheme.sheaf SheafedSpace.sheaf
- simp only [map_pow, map_mul, hy₂, pow_add, ← mul_assoc, ← comp_apply, ← Functor.map_comp,
- ← op_comp, Category.assoc, homOfLE_comp]
+ simp only [pow_add, map_pow, map_mul]
+ rw [hy₂] -- Note: `simp` can't use this
+ repeat rw [← comp_apply] -- Note: `simp` can't use this
+ simp only [← mul_assoc, ← Functor.map_comp, ← op_comp, homOfLE_comp]
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_is_quasi_separated AlgebraicGeometry.exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated
/-- If `U` is qcqs, then `Γ(X, D(f)) ≃ Γ(X, U)_f` for every `f : Γ(X, U)`.
@@ -56,7 +56,7 @@ def QuasiSeparated.affineProperty : AffineTargetMorphismProperty := fun X _ _ _
theorem quasiSeparatedSpace_iff_affine (X : Scheme) :
QuasiSeparatedSpace X.carrier ↔ ∀ U V : X.affineOpens, IsCompact (U ∩ V : Set X.carrier) := by
- rw [QuasiSeparatedSpace_iff]
+ rw [quasiSeparatedSpace_iff]
constructor
· intro H U V; exact H U V U.1.2 U.2.isCompact V.1.2 V.2.isCompact
· intro H
@@ -115,7 +115,7 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
#align algebraic_geometry.quasi_compact_affine_property_iff_quasi_separated_space AlgebraicGeometry.quasi_compact_affineProperty_iff_quasiSeparatedSpace
theorem quasiSeparated_eq_diagonal_is_quasiCompact :
- @QuasiSeparated = MorphismProperty.diagonal @QuasiCompact := by ext; exact QuasiSeparated_iff _
+ @QuasiSeparated = MorphismProperty.diagonal @QuasiCompact := by ext; exact quasiSeparated_iff _
#align algebraic_geometry.quasi_separated_eq_diagonal_is_quasi_compact AlgebraicGeometry.quasiSeparated_eq_diagonal_is_quasiCompact
theorem quasi_compact_affineProperty_diagonal_eq :
@@ -291,7 +291,7 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
rintro ⟨i, j⟩; dsimp at i j
-- replace H := H (Scheme.OpenCover.pullbackCover (Scheme.affineCover Z) g) i
specialize H _ i
- -- rw [←isQuasiSeparated_iff_quasiSeparatedSpace] at H
+ -- rw [← isQuasiSeparated_iff_quasiSeparatedSpace] at H
refine @quasiSeparatedSpace_of_quasiSeparated _ _ ?_ H ?_
· exact pullback.map _ _ _ _ (𝟙 _) _ _ (by simp) (Category.comp_id _) ≫
(pullbackRightPullbackFstIso g (Z.affineCover.map i) f).hom
The other direction is a consequence of IsLocalization.map_units
.
Also do the same for LocalizationMap
and IsLocalizedModule
.
This means we have one less fact to prove when constructing an IsLocalization
(etc.) instance (thus many proofs are golfed), but once we construct it we still have access to the eq_iff_exists
lemmas (without the prime) so the API doesn't get less powerful.
Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>
@@ -453,17 +453,10 @@ theorem is_localization_basicOpen_of_qcqs {X : Scheme} {U : Opens X.carrier} (hU
rw [← sub_eq_zero, ← map_sub, RingHom.algebraMap_toAlgebra]
simp_rw [← @sub_eq_zero _ _ (_ * x) (_ * y), ← mul_sub]
generalize x - y = z
- constructor
- · intro H
- obtain ⟨n, e⟩ := exists_pow_mul_eq_zero_of_res_basicOpen_eq_zero_of_isCompact X hU _ _ H
- refine' ⟨⟨_, n, rfl⟩, _⟩
- simpa [mul_comm z] using e
- · rintro ⟨⟨_, n, rfl⟩, e : f ^ n * z = 0⟩
- rw [← ((RingedSpace.isUnit_res_basicOpen _ f).pow n).mul_right_inj, mul_zero, ←
- map_pow]
- -- Porting note: this one lemma needs `erw`
- erw [← map_mul]
- rw [e, map_zero]
+ intro H
+ obtain ⟨n, e⟩ := exists_pow_mul_eq_zero_of_res_basicOpen_eq_zero_of_isCompact X hU _ _ H
+ refine' ⟨⟨_, n, rfl⟩, _⟩
+ simpa [mul_comm z] using e
#align algebraic_geometry.is_localization_basic_open_of_qcqs AlgebraicGeometry.is_localization_basicOpen_of_qcqs
end AlgebraicGeometry
Fixed AlgebraicGeometry/AffineSchemes.lean
, AlgebraicGeometry/Morphisms/QuasiSeparated.lean
and AlgebraicGeometry/Morphisms/RingHomProperties.lean
.
Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Andrew Yang <36414270+erdOne@users.noreply.github.com> Co-authored-by: Johan Commelin <johan@commelin.net> Co-authored-by: Mauricio Collares <mauricio@collares.org>
@@ -301,76 +301,56 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
theorem exists_eq_pow_mul_of_isAffineOpen (X : Scheme) (U : Opens X.carrier) (hU : IsAffineOpen U)
(f : X.presheaf.obj (op U)) (x : X.presheaf.obj (op <| X.basicOpen f)) :
∃ (n : ℕ) (y : X.presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x := by
- have := (isLocalization_basicOpen hU f).2
+ have := (hU.isLocalization_basicOpen f).2
obtain ⟨⟨y, _, n, rfl⟩, d⟩ := this x
use n, y
delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict
simpa [mul_comm x] using d.symm
#align algebraic_geometry.exists_eq_pow_mul_of_is_affine_open AlgebraicGeometry.exists_eq_pow_mul_of_isAffineOpen
-set_option maxHeartbeats 500000 in
+theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux_aux {X : TopCat}
+ (F : X.Presheaf CommRingCat) {U₁ U₂ U₃ U₄ U₅ U₆ U₇ : Opens X} {n₁ n₂ : ℕ}
+ {y₁ : F.obj (op U₁)} {y₂ : F.obj (op U₂)} {f : F.obj (op <| U₁ ⊔ U₂)}
+ {x : F.obj (op U₃)} (h₄₁ : U₄ ≤ U₁) (h₄₂ : U₄ ≤ U₂) (h₅₁ : U₅ ≤ U₁) (h₅₃ : U₅ ≤ U₃)
+ (h₆₂ : U₆ ≤ U₂) (h₆₃ : U₆ ≤ U₃) (h₇₄ : U₇ ≤ U₄) (h₇₅ : U₇ ≤ U₅) (h₇₆ : U₇ ≤ U₆)
+ (e₁ : y₁ |_ U₅ = (f |_ U₁ |_ U₅) ^ n₁ * x |_ U₅)
+ (e₂ : y₂ |_ U₆ = (f |_ U₂ |_ U₆) ^ n₂ * x |_ U₆) :
+ (((f |_ U₁) ^ n₂ * y₁) |_ U₄) |_ U₇ = (((f |_ U₂) ^ n₁ * y₂) |_ U₄) |_ U₇ := by
+ apply_fun (fun x : F.obj (op U₅) ↦ x |_ U₇) at e₁
+ apply_fun (fun x : F.obj (op U₆) ↦ x |_ U₇) at e₂
+ dsimp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict] at e₁ e₂ ⊢
+ simp only [map_mul, map_pow, ← comp_apply, ← op_comp, ← F.map_comp, homOfLE_comp] at e₁ e₂ ⊢
+ rw [e₁, e₂, mul_left_comm]
+
theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme)
(S : X.affineOpens) (U₁ U₂ : Opens X.carrier) {n₁ n₂ : ℕ} {y₁ : X.presheaf.obj (op U₁)}
{y₂ : X.presheaf.obj (op U₂)} {f : X.presheaf.obj (op <| U₁ ⊔ U₂)}
{x : X.presheaf.obj (op <| X.basicOpen f)} (h₁ : S.1 ≤ U₁) (h₂ : S.1 ≤ U₂)
- (e₁ :
- X.presheaf.map
- (homOfLE <| X.basicOpen_le (X.presheaf.map (homOfLE le_sup_left).op f) : _ ⟶ U₁).op y₁ =
- X.presheaf.map (homOfLE (by erw [X.basicOpen_res]; exact inf_le_left)).op
- (X.presheaf.map (homOfLE le_sup_left).op f) ^
- n₁ *
- (X.presheaf.map (homOfLE (by erw [X.basicOpen_res]; exact inf_le_right)).op) x)
- (e₂ :
- X.presheaf.map
- (homOfLE <| X.basicOpen_le (X.presheaf.map (homOfLE le_sup_right).op f) : _ ⟶ U₂).op y₂ =
- X.presheaf.map (homOfLE (by rw [X.basicOpen_res]; exact inf_le_left)).op
- (X.presheaf.map (homOfLE le_sup_right).op f) ^
- n₂ *
- (X.presheaf.map (homOfLE (by rw [X.basicOpen_res]; exact inf_le_right)).op) x) :
- ∃ n : ℕ,
- X.presheaf.map (homOfLE <| h₁).op
- (X.presheaf.map (homOfLE le_sup_left).op f ^ (n + n₂) * y₁) =
- X.presheaf.map (homOfLE <| h₂).op
- (X.presheaf.map (homOfLE le_sup_right).op f ^ (n + n₁) * y₂) := by
- -- have : IsLocalization.Away _ _ :=
- -- isLocalization_basicOpen S.2 (X.presheaf.map (homOfLE <| le_trans h₁ le_sup_left).op f)
+ (e₁ : y₁ |_ X.basicOpen (f |_ U₁) = ((f |_ U₁ |_ X.basicOpen _) ^ n₁) * x |_ X.basicOpen _)
+ (e₂ : y₂ |_ X.basicOpen (f |_ U₂) = ((f |_ U₂ |_ X.basicOpen _) ^ n₂) * x |_ X.basicOpen _) :
+ ∃ n : ℕ, ∀ m, n ≤ m →
+ ((f |_ U₁) ^ (m + n₂) * y₁) |_ S.1 = ((f |_ U₂) ^ (m + n₁) * y₂) |_ S.1 := by
obtain ⟨⟨_, n, rfl⟩, e⟩ :=
(@IsLocalization.eq_iff_exists _ _ _ _ _ _
- (isLocalization_basicOpen S.2 (X.presheaf.map (homOfLE <| le_trans h₁ le_sup_left).op f))
- (X.presheaf.map (homOfLE <| h₁).op
- (X.presheaf.map (homOfLE le_sup_left).op f ^ n₂ * y₁))
- (X.presheaf.map (homOfLE <| h₂).op
- (X.presheaf.map (homOfLE le_sup_right).op f ^ n₁ * y₂))).mp <| by
- -- Porting note: was just a `simp`, but know as some lemmas need `erw`, just a `simp` does not
- -- leave the goal in a desired form
- rw [RingHom.algebraMap_toAlgebra, map_mul, map_mul, map_pow, map_pow, map_mul, map_pow, map_mul]
- erw [map_pow]
- rw [←comp_apply, ←comp_apply]
- erw [←comp_apply, ←comp_apply, ←comp_apply, ←comp_apply]
- simp only [← Functor.map_comp, ← op_comp, homOfLE_comp]
- have h₃ : X.basicOpen ((X.presheaf.map (homOfLE (h₁.trans le_sup_left)).op) f) ≤ S.val := by
- simpa only [X.basicOpen_res] using inf_le_left
- trans X.presheaf.map (homOfLE <| h₃.trans <| h₁.trans le_sup_left).op f ^ (n₂ + n₁) *
- X.presheaf.map (homOfLE <| (X.basicOpen_res f _).trans_le inf_le_right).op x
- · rw [pow_add, mul_assoc]; congr 1
- convert congr_arg (X.presheaf.map (homOfLE _).op) e₁ using 1
- pick_goal 3
- · rw [X.basicOpen_res, X.basicOpen_res]; rintro x ⟨H₁, H₂⟩; exact ⟨h₁ H₁, H₂⟩
- · simp only [map_pow, map_mul, ← comp_apply, ← Functor.map_comp, ← op_comp]; congr 1
- · simp only [map_pow, map_mul, ← comp_apply, ← Functor.map_comp, ← op_comp]; congr
- · rw [add_comm, pow_add, mul_assoc]; congr 1
- convert congr_arg (X.presheaf.map (homOfLE _).op) e₂.symm
- · simp only [map_pow, map_mul, ← comp_apply, ← Functor.map_comp, ← op_comp]; congr
- · simp only [map_pow, map_mul, ← comp_apply, ← Functor.map_comp, ← op_comp]; congr
- · simp only [X.basicOpen_res]
- rintro x ⟨H₁, H₂⟩; exact ⟨h₂ H₁, H₂⟩
+ (S.2.isLocalization_basicOpen (f |_ S.1))
+ (((f |_ U₁) ^ n₂ * y₁) |_ S.1)
+ (((f |_ U₂) ^ n₁ * y₂) |_ S.1)).mp <| by
+ apply exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux_aux (e₁ := e₁) (e₂ := e₂)
+ · show X.basicOpen _ ≤ _
+ simp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict, Scheme.basicOpen_res]
+ exact inf_le_inf h₁ le_rfl
+ · show X.basicOpen _ ≤ _
+ simp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict, Scheme.basicOpen_res]
+ exact inf_le_inf h₂ le_rfl
use n
- simp only [pow_add, map_pow, map_mul, ← comp_apply, ← mul_assoc, ← Functor.map_comp,
+ intros m hm
+ rw [← tsub_add_cancel_of_le hm]
+ simp only [TopCat.Presheaf.restrictOpen, TopCat.Presheaf.restrict,
+ pow_add, map_pow, map_mul, ← comp_apply, mul_assoc, ← Functor.map_comp, ← op_comp, homOfLE_comp,
Subtype.coe_mk] at e ⊢
- exact e
+ rw [e]
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux AlgebraicGeometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux
-set_option maxHeartbeats 1000000 in
theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U : Opens X.carrier)
(hU : IsCompact U.1) (hU' : IsQuasiSeparated U.1) (f : X.presheaf.obj (op U))
(x : X.presheaf.obj (op <| X.basicOpen f)) :
@@ -421,17 +401,8 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
-- On each affine open in the intersection, we have `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
-- for some `n` since `f ^ n₂ * y₁ = f ^ (n₁ + n₂) * x = f ^ n₁ * y₂` on `X_f`.
- have :
- ∀ i : s,
- ∃ n : ℕ,
- X.presheaf.map (homOfLE <| hs₁ i).op
- (X.presheaf.map (homOfLE le_sup_left).op f ^ (n + n₂) * y₁) =
- X.presheaf.map (homOfLE <| hs₂ i).op
- (X.presheaf.map (homOfLE le_sup_right).op f ^ (n + n₁) * y₂) := by
- intro i
- exact
- exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux X i.1 S U (hs₁ i) (hs₂ i) hy₁
- hy₂
+ have := fun i ↦ exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux
+ X i.1 S U (hs₁ i) (hs₂ i) hy₁ hy₂
choose n hn using this
-- We can thus choose a big enough `n` such that `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
-- on `S ∩ U`.
@@ -446,69 +417,23 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
· exact le_of_eq hs
· intro i
- replace hn :=
- congr_arg
- (fun x =>
- X.presheaf.map (homOfLE (le_trans (hs₁ i) le_sup_left)).op f ^
- (Finset.univ.sup n - n i) *
- x)
- (hn i)
- dsimp only at hn
delta Scheme.sheaf SheafedSpace.sheaf
- simp only [← map_pow, map_mul, ← comp_apply, ← Functor.map_comp, ← op_comp, ← mul_assoc]
- at hn ⊢
- erw [← map_mul, ← map_mul] at hn
- rw [← pow_add, ← pow_add, ← add_assoc, ← add_assoc, tsub_add_cancel_of_le] at hn
- convert hn
+ simp only [← comp_apply, ← Functor.map_comp, ← op_comp]
+ apply hn
exact Finset.le_sup (Finset.mem_univ _)
use Finset.univ.sup n + n₁ + n₂
-- By the sheaf condition, since `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`, it can be glued into
-- the desired section on `S ∪ U`.
use (X.sheaf.objSupIsoProdEqLocus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩
- refine' X.sheaf.eq_of_locally_eq₂
- (homOfLE (_ : X.basicOpen (X.presheaf.map (homOfLE le_sup_left).op f) ≤ _))
- (homOfLE (_ : X.basicOpen (X.presheaf.map (homOfLE le_sup_right).op f) ≤ _)) _ _ _ _ _
- · rw [X.basicOpen_res]; exact inf_le_right
- · rw [X.basicOpen_res]; exact inf_le_right
- · rw [X.basicOpen_res, X.basicOpen_res]
- erw [← inf_sup_right]
- refine' le_inf_iff.mpr ⟨X.basicOpen_le f, le_of_eq rfl⟩
- · convert congr_arg (X.presheaf.map
- -- Porting note: needs to be explicit here
- (homOfLE (by restrict_tac :
- X.basicOpen (X.presheaf.map (homOfLE (le_sup_left : S ≤ S ⊔ U.1)).op f) ≤ S)).op)
- (X.sheaf.objSupIsoProdEqLocus_inv_fst S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1
- · delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note: was just a single `simp only [...]`
- simp only
- erw [← comp_apply, ← comp_apply, ← comp_apply, ← comp_apply]
- simp only [← Functor.map_comp, ← op_comp]
- congr 1
- · delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note: was just a single `simp only [...]`
- simp only [map_pow, map_mul]
- erw [← comp_apply, ← comp_apply]
- simp only [← Functor.map_comp, ← op_comp, mul_assoc, pow_add]
- erw [hy₁]; congr 1; rw [← mul_assoc, ← mul_assoc]; congr 1
- rw [mul_comm, ← comp_apply, ← Functor.map_comp]; congr 1
- · convert
- congr_arg (X.presheaf.map (homOfLE _).op)
- (X.sheaf.objSupIsoProdEqLocus_inv_snd S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using
- 1
- pick_goal 3
- · rw [X.basicOpen_res]; restrict_tac
- · delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note: was just a single `simp only [...]`
- simp only
- erw [← comp_apply, ← comp_apply, ← comp_apply, ← comp_apply]
- simp only [← Functor.map_comp, ← op_comp]
- congr 1
- · delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note: was just a single `simp only [...]`
- simp only [map_pow, map_mul]
- erw [← comp_apply, ← comp_apply]
- simp only [← Functor.map_comp, ← op_comp, mul_assoc, pow_add]
- erw [hy₂]; rw [← comp_apply, ← Functor.map_comp]; congr 1
+ refine' (X.sheaf.objSupIsoProdEqLocus_inv_eq_iff _ _ _ (X.basicOpen_res _
+ (homOfLE le_sup_left).op) (X.basicOpen_res _ (homOfLE le_sup_right).op)).mpr ⟨_, _⟩
+ · delta Scheme.sheaf SheafedSpace.sheaf
+ rw [add_assoc, add_comm n₁]
+ simp only [map_pow, map_mul, hy₁, pow_add, ← mul_assoc, ← comp_apply, ← Functor.map_comp,
+ ← op_comp, Category.assoc, homOfLE_comp]
+ · delta Scheme.sheaf SheafedSpace.sheaf
+ simp only [map_pow, map_mul, hy₂, pow_add, ← mul_assoc, ← comp_apply, ← Functor.map_comp,
+ ← op_comp, Category.assoc, homOfLE_comp]
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_is_quasi_separated AlgebraicGeometry.exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated
/-- If `U` is qcqs, then `Γ(X, D(f)) ≃ Γ(X, U)_f` for every `f : Γ(X, U)`.
@@ -295,9 +295,7 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
refine @quasiSeparatedSpace_of_quasiSeparated _ _ ?_ H ?_
· exact pullback.map _ _ _ _ (𝟙 _) _ _ (by simp) (Category.comp_id _) ≫
(pullbackRightPullbackFstIso g (Z.affineCover.map i) f).hom
- · apply (config := {allowSynthFailures := true}) AlgebraicGeometry.quasiSeparatedOfMono
- -- Porting note: this instance was automatic
- apply mono_comp
+ · exact inferInstance
#align algebraic_geometry.quasi_separated_of_comp AlgebraicGeometry.quasiSeparatedOfComp
theorem exists_eq_pow_mul_of_isAffineOpen (X : Scheme) (U : Opens X.carrier) (hU : IsAffineOpen U)
Builds a framework to define widgets allowing users to select some sub-expressions of the main goal to generate a tactic call. Four examples using this framework are included, generating calls to tactics conv
, congrm
and gcongr
and generating new calc steps. Also includes a calc
tactic code action to start a calc proof.
Co-authored-by: Wojciech Nawrocki <wjnawrocki@protonmail.com>
@@ -372,7 +372,7 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
exact e
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux AlgebraicGeometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux
-set_option maxHeartbeats 700000 in
+set_option maxHeartbeats 1000000 in
theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U : Opens X.carrier)
(hU : IsCompact U.1) (hU' : IsQuasiSeparated U.1) (f : X.presheaf.obj (op U))
(x : X.presheaf.obj (op <| X.basicOpen f)) :
@@ -310,7 +310,7 @@ theorem exists_eq_pow_mul_of_isAffineOpen (X : Scheme) (U : Opens X.carrier) (hU
simpa [mul_comm x] using d.symm
#align algebraic_geometry.exists_eq_pow_mul_of_is_affine_open AlgebraicGeometry.exists_eq_pow_mul_of_isAffineOpen
-set_option maxHeartbeats 700000 in
+set_option maxHeartbeats 500000 in
theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme)
(S : X.affineOpens) (U₁ U₂ : Opens X.carrier) {n₁ n₂ : ℕ} {y₁ : X.presheaf.obj (op U₁)}
{y₂ : X.presheaf.obj (op U₂)} {f : X.presheaf.obj (op <| U₁ ⊔ U₂)}
@@ -372,7 +372,7 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
exact e
#align algebraic_geometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux AlgebraicGeometry.exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux
-set_option maxHeartbeats 7000000 in
+set_option maxHeartbeats 700000 in
theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U : Opens X.carrier)
(hU : IsCompact U.1) (hU' : IsQuasiSeparated U.1) (f : X.presheaf.obj (op U))
(x : X.presheaf.obj (op <| X.basicOpen f)) :
MulZeroClass.
in mul_zero
/zero_mul
(#6682)
Search&replace MulZeroClass.mul_zero
-> mul_zero
, MulZeroClass.zero_mul
-> zero_mul
.
These were introduced by Mathport, as the full name of mul_zero
is actually MulZeroClass.mul_zero
(it's exported with the short name).
@@ -536,7 +536,7 @@ theorem is_localization_basicOpen_of_qcqs {X : Scheme} {U : Opens X.carrier} (hU
refine' ⟨⟨_, n, rfl⟩, _⟩
simpa [mul_comm z] using e
· rintro ⟨⟨_, n, rfl⟩, e : f ^ n * z = 0⟩
- rw [← ((RingedSpace.isUnit_res_basicOpen _ f).pow n).mul_right_inj, MulZeroClass.mul_zero, ←
+ rw [← ((RingedSpace.isUnit_res_basicOpen _ f).pow n).mul_right_inj, mul_zero, ←
map_pow]
-- Porting note: this one lemma needs `erw`
erw [← map_mul]
@@ -2,15 +2,12 @@
Copyright (c) 2022 Andrew Yang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
-
-! This file was ported from Lean 3 source module algebraic_geometry.morphisms.quasi_separated
-! leanprover-community/mathlib commit 1a51edf13debfcbe223fa06b1cb353b9ed9751cc
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.AlgebraicGeometry.Morphisms.QuasiCompact
import Mathlib.Topology.QuasiSeparated
+#align_import algebraic_geometry.morphisms.quasi_separated from "leanprover-community/mathlib"@"1a51edf13debfcbe223fa06b1cb353b9ed9751cc"
+
/-!
# Quasi-separated morphisms
This doesn't forward-port the removal of .{u}
as this doesn't actually change the type, and just results in .{u_1}
being implied instead.
Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Andrew Yang
! This file was ported from Lean 3 source module algebraic_geometry.morphisms.quasi_separated
-! leanprover-community/mathlib commit 13361559d66b84f80b6d5a1c4a26aa5054766725
+! leanprover-community/mathlib commit 1a51edf13debfcbe223fa06b1cb353b9ed9751cc
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -445,7 +445,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
(X.presheaf.map (homOfLE le_sup_left).op f ^ (Finset.univ.sup n + n₂) * y₁) =
X.presheaf.map (homOfLE <| inf_le_right).op
(X.presheaf.map (homOfLE le_sup_right).op f ^ (Finset.univ.sup n + n₁) * y₂) := by
- fapply TopCat.Sheaf.eq_of_locally_eq' X.sheaf fun i : s => i.1.1
+ fapply X.sheaf.eq_of_locally_eq' fun i : s => i.1.1
· refine' fun i => homOfLE _; erw [hs];
-- Porting note: have to add argument explicitly
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
@@ -470,7 +470,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
-- By the sheaf condition, since `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`, it can be glued into
-- the desired section on `S ∪ U`.
use (X.sheaf.objSupIsoProdEqLocus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩
- refine' TopCat.Sheaf.eq_of_locally_eq₂ X.sheaf
+ refine' X.sheaf.eq_of_locally_eq₂
(homOfLE (_ : X.basicOpen (X.presheaf.map (homOfLE le_sup_left).op f) ≤ _))
(homOfLE (_ : X.basicOpen (X.presheaf.map (homOfLE le_sup_right).op f) ≤ _)) _ _ _ _ _
· rw [X.basicOpen_res]; exact inf_le_right
@@ -18,7 +18,7 @@ A morphism of schemes `f : X ⟶ Y` is quasi-separated if the diagonal morphism
quasi-compact.
A scheme is quasi-separated if the intersections of any two affine open sets is quasi-compact.
-(`algebraic_geometry.quasi_separated_space_iff_affine`)
+(`AlgebraicGeometry.quasiSeparatedSpace_iff_affine`)
We show that a morphism is quasi-separated if the preimage of every affine open is quasi-separated.
@@ -26,7 +26,7 @@ We also show that this property is local at the target,
and is stable under compositions and base-changes.
## Main result
-- `is_localization_basic_open_of_qcqs` (**Qcqs lemma**):
+- `AlgebraicGeometry.is_localization_basicOpen_of_qcqs` (**Qcqs lemma**):
If `U` is qcqs, then `Γ(X, D(f)) ≃ Γ(X, U)_f` for every `f : Γ(X, U)`.
-/
@@ -44,14 +44,14 @@ namespace AlgebraicGeometry
variable {X Y : Scheme.{u}} (f : X ⟶ Y)
-/-- A morphism is `quasi_separated` if diagonal map is quasi-compact. -/
+/-- A morphism is `QuasiSeparated` if diagonal map is quasi-compact. -/
@[mk_iff]
class QuasiSeparated (f : X ⟶ Y) : Prop where
- /-- A morphism is `quasi_separated` if diagonal map is quasi-compact. -/
+ /-- A morphism is `QuasiSeparated` if diagonal map is quasi-compact. -/
diagonalQuasiCompact : QuasiCompact (pullback.diagonal f)
#align algebraic_geometry.quasi_separated AlgebraicGeometry.QuasiSeparated
-/-- The `affine_target_morphism_property` corresponding to `quasi_separated`, asserting that the
+/-- The `AffineTargetMorphismProperty` corresponding to `QuasiSeparated`, asserting that the
domain is a quasi-separated scheme. -/
def QuasiSeparated.affineProperty : AffineTargetMorphismProperty := fun X _ _ _ =>
QuasiSeparatedSpace X.carrier
@@ -68,7 +68,7 @@ theorem quasiSeparatedSpace_iff_affine (X : Scheme) :
IsCompact (U ⊓ V).1
by intro U V hU hU' hV hV'; exact this ⟨U, hU⟩ hU' ⟨V, hV⟩ hV'
intro U hU V hV
- -- Porting note : it complains "unable to find motive", but telling Lean that motive is
+ -- Porting note: it complains "unable to find motive", but telling Lean that motive is
-- underscore is actually sufficient, weird
apply compact_open_induction_on (P := _) V hV
· simp
@@ -96,7 +96,7 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
haveI : IsAffine _ := V.2
let g : pullback (X.ofRestrict U.1.openEmbedding) (X.ofRestrict V.1.openEmbedding) ⟶ X :=
pullback.fst ≫ X.ofRestrict _
- -- Porting note : `infer_instance` does not work here
+ -- Porting note: `inferInstance` does not work here
have : IsOpenImmersion g := PresheafedSpace.IsOpenImmersion.comp _ _
have e := Homeomorph.ofEmbedding _ this.base_open.toEmbedding
rw [IsOpenImmersion.range_pullback_to_base_of_left] at e
@@ -105,7 +105,7 @@ theorem quasi_compact_affineProperty_iff_quasiSeparatedSpace {X Y : Scheme} [IsA
exact @Homeomorph.compactSpace _ _ _ _ (H _ _) e
· introv H h₁ h₂
let g : pullback f₁ f₂ ⟶ X := pullback.fst ≫ f₁
- -- Porting note : `infer_instance` does not work here
+ -- Porting note: `inferInstance` does not work here
have : IsOpenImmersion g := PresheafedSpace.IsOpenImmersion.comp _ _
have e := Homeomorph.ofEmbedding _ this.base_open.toEmbedding
rw [IsOpenImmersion.range_pullback_to_base_of_left] at e
@@ -196,7 +196,7 @@ theorem QuasiSeparated.is_local_at_target : PropertyIsLocalAtTarget @QuasiSepara
#align algebraic_geometry.quasi_separated.is_local_at_target AlgebraicGeometry.QuasiSeparated.is_local_at_target
open List in
-theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
+theorem QuasiSeparated.openCover_TFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
TFAE
[QuasiSeparated f,
∃ 𝒰 : Scheme.OpenCover.{u} Y,
@@ -209,7 +209,7 @@ theorem QuasiSeparated.openCover_tFAE {X Y : Scheme.{u}} (f : X ⟶ Y) :
∃ (ι : Type u) (U : ι → Opens Y.carrier) (_ : iSup U = ⊤),
∀ i, QuasiSeparated (f ∣_ U i)] :=
QuasiSeparated.is_local_at_target.openCover_TFAE f
-#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_tFAE
+#align algebraic_geometry.quasi_separated.open_cover_tfae AlgebraicGeometry.QuasiSeparated.openCover_TFAE
theorem quasiSeparated_over_affine_iff {X Y : Scheme} (f : X ⟶ Y) [IsAffine Y] :
QuasiSeparated f ↔ QuasiSeparatedSpace X.carrier := by
@@ -252,7 +252,7 @@ theorem quasiSeparatedSpace_of_quasiSeparated {X Y : Scheme} (f : X ⟶ Y)
rw [quasiSeparatedSpace_iff_quasiSeparated] at hY ⊢
have : f ≫ terminal.from Y = terminal.from X := terminalIsTerminal.hom_ext _ _
rw [← this]
- skip; infer_instance
+ infer_instance
#align algebraic_geometry.quasi_separated_space_of_quasi_separated AlgebraicGeometry.quasiSeparatedSpace_of_quasiSeparated
instance quasiSeparatedSpace_of_isAffine (X : Scheme) [IsAffine X] :
@@ -280,11 +280,11 @@ theorem IsAffineOpen.isQuasiSeparated {X : Scheme} {U : Opens X.carrier} (hU : I
theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : QuasiSeparated (f ≫ g)] :
QuasiSeparated f := by
- -- Porting note : rewrite `(QuasiSeparated.affine_openCover_TFAE f).out 0 1` directly fails, but
+ -- Porting note: rewrite `(QuasiSeparated.affine_openCover_TFAE f).out 0 1` directly fails, but
-- give it a name works
have h01 := (QuasiSeparated.affine_openCover_TFAE f).out 0 1
rw [h01]; clear h01
- -- Porting note : rewrite `(QuasiSeparated.affine_openCover_TFAE ...).out 0 2` directly fails, but
+ -- Porting note: rewrite `(QuasiSeparated.affine_openCover_TFAE ...).out 0 2` directly fails, but
-- give it a name works
have h02 := (QuasiSeparated.affine_openCover_TFAE (f ≫ g)).out 0 2
rw [h02] at H; clear h02
@@ -299,7 +299,7 @@ theorem quasiSeparatedOfComp {X Y Z : Scheme} (f : X ⟶ Y) (g : Y ⟶ Z) [H : Q
· exact pullback.map _ _ _ _ (𝟙 _) _ _ (by simp) (Category.comp_id _) ≫
(pullbackRightPullbackFstIso g (Z.affineCover.map i) f).hom
· apply (config := {allowSynthFailures := true}) AlgebraicGeometry.quasiSeparatedOfMono
- -- Porting note : this instance was automatic
+ -- Porting note: this instance was automatic
apply mono_comp
#align algebraic_geometry.quasi_separated_of_comp AlgebraicGeometry.quasiSeparatedOfComp
@@ -346,7 +346,7 @@ theorem exists_eq_pow_mul_of_is_compact_of_quasi_separated_space_aux (X : Scheme
(X.presheaf.map (homOfLE le_sup_left).op f ^ n₂ * y₁))
(X.presheaf.map (homOfLE <| h₂).op
(X.presheaf.map (homOfLE le_sup_right).op f ^ n₁ * y₂))).mp <| by
- -- Porting note : was just a `simp`, but know as some lemmas need `erw`, just a `simp` does not
+ -- Porting note: was just a `simp`, but know as some lemmas need `erw`, just a `simp` does not
-- leave the goal in a desired form
rw [RingHom.algebraMap_toAlgebra, map_mul, map_mul, map_pow, map_pow, map_mul, map_pow, map_mul]
erw [map_pow]
@@ -382,7 +382,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
∃ (n : ℕ) (y : X.presheaf.obj (op U)), y |_ X.basicOpen f = (f |_ X.basicOpen f) ^ n * x := by
delta TopCat.Presheaf.restrictOpen TopCat.Presheaf.restrict
revert hU' f x
- -- Porting note : complains `expected type is not available`, but tell Lean that it is underscore
+ -- Porting note: complains `expected type is not available`, but tell Lean that it is underscore
-- is sufficient
apply compact_open_induction_on (P := _) U hU
· intro _ f x
@@ -417,12 +417,12 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
have hs₁ : ∀ i : s, i.1.1 ≤ S := by
intro i; change (i : Opens X.carrier) ≤ S
refine' le_trans _ inf_le_left; swap; exact U.1; erw [hs]
- -- Porting note : have to add argument explicitly
+ -- Porting note: have to add argument explicitly
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
have hs₂ : ∀ i : s, i.1.1 ≤ U.1 := by
intro i; change (i : Opens X.carrier) ≤ U
refine' le_trans _ inf_le_right; swap; exact S; erw [hs]
- -- Porting note : have to add argument explicitly
+ -- Porting note: have to add argument explicitly
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
-- On each affine open in the intersection, we have `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`
-- for some `n` since `f ^ n₂ * y₁ = f ^ (n₁ + n₂) * x = f ^ n₁ * y₂` on `X_f`.
@@ -447,7 +447,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
(X.presheaf.map (homOfLE le_sup_right).op f ^ (Finset.univ.sup n + n₁) * y₂) := by
fapply TopCat.Sheaf.eq_of_locally_eq' X.sheaf fun i : s => i.1.1
· refine' fun i => homOfLE _; erw [hs];
- -- Porting note : have to add argument explicitly
+ -- Porting note: have to add argument explicitly
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
· exact le_of_eq hs
· intro i
@@ -479,18 +479,18 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
erw [← inf_sup_right]
refine' le_inf_iff.mpr ⟨X.basicOpen_le f, le_of_eq rfl⟩
· convert congr_arg (X.presheaf.map
- -- Porting note : needs to be explicit here
+ -- Porting note: needs to be explicit here
(homOfLE (by restrict_tac :
X.basicOpen (X.presheaf.map (homOfLE (le_sup_left : S ≤ S ⊔ U.1)).op f) ≤ S)).op)
(X.sheaf.objSupIsoProdEqLocus_inv_fst S U.1 ⟨⟨_ * _, _ * _⟩, this⟩) using 1
· delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note : was just a single `simp only [...]`
+ -- Porting note: was just a single `simp only [...]`
simp only
erw [← comp_apply, ← comp_apply, ← comp_apply, ← comp_apply]
simp only [← Functor.map_comp, ← op_comp]
congr 1
· delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note : was just a single `simp only [...]`
+ -- Porting note: was just a single `simp only [...]`
simp only [map_pow, map_mul]
erw [← comp_apply, ← comp_apply]
simp only [← Functor.map_comp, ← op_comp, mul_assoc, pow_add]
@@ -503,13 +503,13 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
pick_goal 3
· rw [X.basicOpen_res]; restrict_tac
· delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note : was just a single `simp only [...]`
+ -- Porting note: was just a single `simp only [...]`
simp only
erw [← comp_apply, ← comp_apply, ← comp_apply, ← comp_apply]
simp only [← Functor.map_comp, ← op_comp]
congr 1
· delta Scheme.sheaf SheafedSpace.sheaf
- -- Porting note : was just a single `simp only [...]`
+ -- Porting note: was just a single `simp only [...]`
simp only [map_pow, map_mul]
erw [← comp_apply, ← comp_apply]
simp only [← Functor.map_comp, ← op_comp, mul_assoc, pow_add]
@@ -541,7 +541,7 @@ theorem is_localization_basicOpen_of_qcqs {X : Scheme} {U : Opens X.carrier} (hU
· rintro ⟨⟨_, n, rfl⟩, e : f ^ n * z = 0⟩
rw [← ((RingedSpace.isUnit_res_basicOpen _ f).pow n).mul_right_inj, MulZeroClass.mul_zero, ←
map_pow]
- -- Porting note : this one lemma needs `erw`
+ -- Porting note: this one lemma needs `erw`
erw [← map_mul]
rw [e, map_zero]
#align algebraic_geometry.is_localization_basic_open_of_qcqs AlgebraicGeometry.is_localization_basicOpen_of_qcqs
This is a test of the UnivLE
proposal. The UniqueGluing
file was one place where we couldn't forward port the universe generalisations made in mathlib3 in https://github.com/leanprover-community/mathlib/pull/19153.
Diff relative to #5724 is https://github.com/leanprover-community/mathlib4/compare/UnivLE_types...UnivLE_UniqueGluing.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Johan Commelin <johan@commelin.net> Co-authored-by: Matthew Robert Ballard <matt@mrb.email> Co-authored-by: Bulhwi Cha <chabulhwi@semmalgil.com> Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: Pol'tta / Miyahara Kō <pol_tta@outlook.jp> Co-authored-by: Oliver Nash <github@olivernash.org> Co-authored-by: Anatole Dedecker <anatolededecker@gmail.com> Co-authored-by: Tobias Grosser <tobias@grosser.es> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com> Co-authored-by: Yury G. Kudryashov <urkud@urkud.name> Co-authored-by: Moritz Firsching <moritz.firsching@gmail.com> Co-authored-by: Jireh Loreaux <loreaujy@gmail.com> Co-authored-by: Christopher Hoskin <christopher.hoskin@gmail.com>
@@ -445,7 +445,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
(X.presheaf.map (homOfLE le_sup_left).op f ^ (Finset.univ.sup n + n₂) * y₁) =
X.presheaf.map (homOfLE <| inf_le_right).op
(X.presheaf.map (homOfLE le_sup_right).op f ^ (Finset.univ.sup n + n₁) * y₂) := by
- fapply TopCat.Sheaf.eq_of_locally_eq'.{u + 1, u} X.sheaf fun i : s => i.1.1
+ fapply TopCat.Sheaf.eq_of_locally_eq' X.sheaf fun i : s => i.1.1
· refine' fun i => homOfLE _; erw [hs];
-- Porting note : have to add argument explicitly
exact @le_iSup (Opens X) s _ (fun (i : s) => (i : Opens X)) i
@@ -470,7 +470,7 @@ theorem exists_eq_pow_mul_of_isCompact_of_isQuasiSeparated (X : Scheme.{u}) (U :
-- By the sheaf condition, since `f ^ (n + n₂) * y₁ = f ^ (n + n₁) * y₂`, it can be glued into
-- the desired section on `S ∪ U`.
use (X.sheaf.objSupIsoProdEqLocus S U.1).inv ⟨⟨_ * _, _ * _⟩, this⟩
- refine' TopCat.Sheaf.eq_of_locally_eq₂.{u + 1, u} X.sheaf
+ refine' TopCat.Sheaf.eq_of_locally_eq₂ X.sheaf
(homOfLE (_ : X.basicOpen (X.presheaf.map (homOfLE le_sup_left).op f) ≤ _))
(homOfLE (_ : X.basicOpen (X.presheaf.map (homOfLE le_sup_right).op f) ≤ _)) _ _ _ _ _
· rw [X.basicOpen_res]; exact inf_le_right
The unported dependencies are