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

Commit 7316286

Browse files
committed
feat(algebraic_geometry/morphisms/basic): Morphism properties on the diagonal morphism. (#16111)
1 parent fd4806c commit 7316286

File tree

4 files changed

+239
-3
lines changed

4 files changed

+239
-3
lines changed

src/algebraic_geometry/morphisms/basic.lean

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,4 +436,128 @@ end
436436

437437
end affine_target_morphism_property
438438

439+
/--
440+
The `affine_target_morphism_property` associated to `(target_affine_locally P).diagonal`.
441+
See `diagonal_target_affine_locally_eq_target_affine_locally`.
442+
-/
443+
def affine_target_morphism_property.diagonal (P : affine_target_morphism_property) :
444+
affine_target_morphism_property :=
445+
λ X Y f hf, ∀ {U₁ U₂ : Scheme} (f₁ : U₁ ⟶ X) (f₂ : U₂ ⟶ X) [is_affine U₁] [is_affine U₂]
446+
[is_open_immersion f₁] [is_open_immersion f₂],
447+
by exactI P (pullback.map_desc f₁ f₂ f)
448+
449+
lemma affine_target_morphism_property.diagonal_respects_iso (P : affine_target_morphism_property)
450+
(hP : P.to_property.respects_iso) :
451+
P.diagonal.to_property.respects_iso :=
452+
begin
453+
delta affine_target_morphism_property.diagonal,
454+
apply affine_target_morphism_property.respects_iso_mk,
455+
{ introv H _ _,
456+
resetI,
457+
rw [pullback.map_desc_comp, affine_cancel_left_is_iso hP, affine_cancel_right_is_iso hP],
458+
apply H },
459+
{ introv H _ _,
460+
resetI,
461+
rw [pullback.map_desc_comp, affine_cancel_right_is_iso hP],
462+
apply H }
463+
end
464+
465+
lemma diagonal_target_affine_locally_of_open_cover (P : affine_target_morphism_property)
466+
(hP : P.is_local)
467+
{X Y : Scheme.{u}} (f : X ⟶ Y)
468+
(𝒰 : Scheme.open_cover.{u} Y)
469+
[∀ i, is_affine (𝒰.obj i)] (𝒰' : Π i, Scheme.open_cover.{u} (pullback f (𝒰.map i)))
470+
[∀ i j, is_affine ((𝒰' i).obj j)]
471+
(h𝒰' : ∀ i j k, P (pullback.map_desc ((𝒰' i).map j) ((𝒰' i).map k) pullback.snd)) :
472+
(target_affine_locally P).diagonal f :=
473+
begin
474+
refine (hP.affine_open_cover_iff _ _).mpr _,
475+
{ exact ((Scheme.pullback.open_cover_of_base 𝒰 f f).bind (λ i,
476+
Scheme.pullback.open_cover_of_left_right.{u u} (𝒰' i) (𝒰' i) pullback.snd pullback.snd)) },
477+
{ intro i,
478+
dsimp at *,
479+
apply_instance },
480+
{ rintro ⟨i, j, k⟩,
481+
dsimp,
482+
convert (affine_cancel_left_is_iso hP.1
483+
(pullback_diagonal_map_iso _ _ ((𝒰' i).map j) ((𝒰' i).map k)).inv pullback.snd).mp _,
484+
swap 3,
485+
{ convert h𝒰' i j k, apply pullback.hom_ext; simp, },
486+
all_goals
487+
{ apply pullback.hom_ext; simp only [category.assoc, pullback.lift_fst, pullback.lift_snd,
488+
pullback.lift_fst_assoc, pullback.lift_snd_assoc] } }
489+
end
490+
491+
lemma affine_target_morphism_property.diagonal_of_target_affine_locally
492+
(P : affine_target_morphism_property)
493+
(hP : P.is_local) {X Y U : Scheme.{u}} (f : X ⟶ Y) (g : U ⟶ Y)
494+
[is_affine U] [is_open_immersion g] (H : (target_affine_locally P).diagonal f) :
495+
P.diagonal (pullback.snd : pullback f g ⟶ _) :=
496+
begin
497+
rintros U V f₁ f₂ _ _ _ _,
498+
resetI,
499+
replace H := ((hP.affine_open_cover_tfae (pullback.diagonal f)).out 0 3).mp H,
500+
let g₁ := pullback.map (f₁ ≫ pullback.snd)
501+
(f₂ ≫ pullback.snd) f f
502+
(f₁ ≫ pullback.fst)
503+
(f₂ ≫ pullback.fst) g
504+
(by rw [category.assoc, category.assoc, pullback.condition])
505+
(by rw [category.assoc, category.assoc, pullback.condition]),
506+
let g₂ : pullback f₁ f₂ ⟶ pullback f g := pullback.fst ≫ f₁,
507+
specialize H g₁,
508+
rw ← affine_cancel_left_is_iso hP.1 (pullback_diagonal_map_iso f _ f₁ f₂).hom,
509+
convert H,
510+
{ apply pullback.hom_ext; simp only [category.assoc, pullback.lift_fst, pullback.lift_snd,
511+
pullback.lift_fst_assoc, pullback.lift_snd_assoc, category.comp_id,
512+
pullback_diagonal_map_iso_hom_fst, pullback_diagonal_map_iso_hom_snd], }
513+
end
514+
515+
lemma affine_target_morphism_property.is_local.diagonal_affine_open_cover_tfae
516+
{P : affine_target_morphism_property}
517+
(hP : P.is_local) {X Y : Scheme.{u}} (f : X ⟶ Y) :
518+
tfae [(target_affine_locally P).diagonal f,
519+
∃ (𝒰 : Scheme.open_cover.{u} Y) [∀ i, is_affine (𝒰.obj i)], by exactI
520+
∀ (i : 𝒰.J), P.diagonal (pullback.snd : pullback f (𝒰.map i) ⟶ _),
521+
∀ (𝒰 : Scheme.open_cover.{u} Y) [∀ i, is_affine (𝒰.obj i)] (i : 𝒰.J), by exactI
522+
P.diagonal (pullback.snd : pullback f (𝒰.map i) ⟶ _),
523+
∀ {U : Scheme} (g : U ⟶ Y) [is_affine U] [is_open_immersion g], by exactI
524+
P.diagonal (pullback.snd : pullback f g ⟶ _),
525+
∃ (𝒰 : Scheme.open_cover.{u} Y) [∀ i, is_affine (𝒰.obj i)]
526+
(𝒰' : Π i, Scheme.open_cover.{u} (pullback f (𝒰.map i))) [∀ i j, is_affine ((𝒰' i).obj j)],
527+
by exactI ∀ i j k, P (pullback.map_desc ((𝒰' i).map j) ((𝒰' i).map k) pullback.snd)] :=
528+
begin
529+
tfae_have : 14,
530+
{ introv H hU hg _ _, resetI, apply P.diagonal_of_target_affine_locally; assumption },
531+
tfae_have : 43,
532+
{ introv H h𝒰, resetI, apply H },
533+
tfae_have : 32,
534+
{ exact λ H, ⟨Y.affine_cover, infer_instance, H Y.affine_cover⟩ },
535+
tfae_have : 25,
536+
{ rintro ⟨𝒰, h𝒰, H⟩,
537+
resetI,
538+
refine ⟨𝒰, infer_instance, λ _, Scheme.affine_cover _, infer_instance, _⟩,
539+
intros i j k,
540+
apply H },
541+
tfae_have : 51,
542+
{ rintro ⟨𝒰, _, 𝒰', _, H⟩,
543+
exactI diagonal_target_affine_locally_of_open_cover P hP f 𝒰 𝒰' H, },
544+
tfae_finish
545+
end
546+
547+
lemma affine_target_morphism_property.is_local.diagonal {P : affine_target_morphism_property}
548+
(hP : P.is_local) : P.diagonal.is_local :=
549+
affine_target_morphism_property.is_local_of_open_cover_imply
550+
P.diagonal
551+
(P.diagonal_respects_iso hP.1)
552+
(λ _ _ f, ((hP.diagonal_affine_open_cover_tfae f).out 1 3).mp)
553+
554+
lemma diagonal_target_affine_locally_eq_target_affine_locally (P : affine_target_morphism_property)
555+
(hP : P.is_local) :
556+
(target_affine_locally P).diagonal = target_affine_locally P.diagonal :=
557+
begin
558+
ext _ _ f,
559+
exact ((hP.diagonal_affine_open_cover_tfae f).out 0 1).trans
560+
((hP.diagonal.affine_open_cover_tfae f).out 1 0),
561+
end
562+
439563
end algebraic_geometry

src/algebraic_geometry/pullbacks.lean

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ Authors: Andrew Yang
55
-/
66
import algebraic_geometry.gluing
77
import category_theory.limits.opposites
8-
import algebraic_geometry.Gamma_Spec_adjunction
8+
import algebraic_geometry.AffineScheme
9+
import category_theory.limits.shapes.diagonal
910

1011
/-!
1112
# Fibred products of schemes
@@ -245,7 +246,8 @@ def gluing : Scheme.glue_data.{u} :=
245246
t_fac := λ i j k, begin
246247
apply pullback.hom_ext,
247248
apply pullback.hom_ext,
248-
all_goals { simp }
249+
all_goals { simp only [t'_snd_fst_fst, t'_snd_fst_snd, t'_snd_snd,
250+
t_fst_fst, t_fst_snd, t_snd, category.assoc] }
249251
end,
250252
cocycle := λ i j k, cocycle 𝒰 f g i j k }
251253

@@ -558,6 +560,13 @@ has_pullback_of_cover (Z.affine_cover.pullback_cover f) f g
558560

559561
instance : has_pullbacks Scheme := has_pullbacks_of_has_limit_cospan _
560562

563+
instance {X Y Z : Scheme} (f : X ⟶ Z) (g : Y ⟶ Z) [is_affine X] [is_affine Y] [is_affine Z] :
564+
is_affine (pullback f g) :=
565+
is_affine_of_iso (pullback.map f g (Spec.map (Γ.map f.op).op) (Spec.map (Γ.map g.op).op)
566+
(Γ_Spec.adjunction.unit.app X) (Γ_Spec.adjunction.unit.app Y) (Γ_Spec.adjunction.unit.app Z)
567+
(Γ_Spec.adjunction.unit.naturality f) (Γ_Spec.adjunction.unit.naturality g) ≫
568+
(preserves_pullback.iso Spec _ _).inv)
569+
561570
/-- Given an open cover `{ Xᵢ }` of `X`, then `X ×[Z] Y` is covered by `Xᵢ ×[Z] Y`. -/
562571
@[simps J obj map]
563572
def open_cover_of_left (𝒰 : open_cover X) (f : X ⟶ Z) (g : Y ⟶ Z) : open_cover (pullback f g) :=
@@ -592,6 +601,23 @@ begin
592601
apply pullback.hom_ext; simp,
593602
end
594603

604+
/-- Given an open cover `{ Xᵢ }` of `X` and an open cover `{ Yⱼ }` of `Y`, then
605+
`X ×[Z] Y` is covered by `Xᵢ ×[Z] Yⱼ`. -/
606+
@[simps J obj map]
607+
def open_cover_of_left_right (𝒰X : X.open_cover) (𝒰Y : Y.open_cover)
608+
(f : X ⟶ Z) (g : Y ⟶ Z) : (pullback f g).open_cover :=
609+
begin
610+
fapply ((open_cover_of_left 𝒰X f g).bind (λ x, open_cover_of_right 𝒰Y (𝒰X.map x ≫ f) g)).copy
611+
(𝒰X.J × 𝒰Y.J)
612+
(λ ij, pullback (𝒰X.map ij.1 ≫ f) (𝒰Y.map ij.2 ≫ g))
613+
(λ ij, pullback.map _ _ _ _ (𝒰X.map ij.1) (𝒰Y.map ij.2) (𝟙 _)
614+
(category.comp_id _) (category.comp_id _))
615+
(equiv.sigma_equiv_prod _ _).symm
616+
(λ _, iso.refl _),
617+
rintro ⟨i, j⟩,
618+
apply pullback.hom_ext; simpa,
619+
end
620+
595621
/-- (Implementation). Use `open_cover_of_base` instead. -/
596622
def open_cover_of_base' (𝒰 : open_cover Z) (f : X ⟶ Z) (g : Y ⟶ Z) : open_cover (pullback f g) :=
597623
begin
@@ -639,3 +665,16 @@ end
639665
end pullback
640666

641667
end algebraic_geometry.Scheme
668+
669+
namespace algebraic_geometry
670+
671+
instance {X Y S X' Y' S' : Scheme} (f : X ⟶ S) (g : Y ⟶ S) (f' : X' ⟶ S')
672+
(g' : Y' ⟶ S') (i₁ : X ⟶ X') (i₂ : Y ⟶ Y') (i₃ : S ⟶ S') (e₁ : f ≫ i₃ = i₁ ≫ f')
673+
(e₂ : g ≫ i₃ = i₂ ≫ g') [is_open_immersion i₁] [is_open_immersion i₂] [mono i₃] :
674+
is_open_immersion (pullback.map f g f' g' i₁ i₂ i₃ e₁ e₂) :=
675+
begin
676+
rw pullback_map_eq_pullback_fst_fst_iso_inv,
677+
apply_instance
678+
end
679+
680+
end algebraic_geometry

src/category_theory/limits/shapes/pullbacks.lean

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,12 @@ abbreviation pullback.map {W X Y Z S T : C} (f₁ : W ⟶ S) (f₂ : X ⟶ S) [h
946946
pullback.lift (pullback.fst ≫ i₁) (pullback.snd ≫ i₂)
947947
(by simp [← eq₁, ← eq₂, pullback.condition_assoc])
948948

949+
/-- The canonical map `X ×ₛ Y ⟶ X ×ₜ Y` given `S ⟶ T`. -/
950+
abbreviation pullback.map_desc {X Y S T : C} (f : X ⟶ S) (g : Y ⟶ S) (i : S ⟶ T)
951+
[has_pullback f g] [has_pullback (f ≫ i) (g ≫ i)] :
952+
pullback f g ⟶ pullback (f ≫ i) (g ≫ i) :=
953+
pullback.map f g (f ≫ i) (g ≫ i) (𝟙 _) (𝟙 _) i (category.id_comp _).symm (category.id_comp _).symm
954+
949955

950956
/--
951957
Given such a diagram, then there is a natural morphism `W ⨿ₛ X ⟶ Y ⨿ₜ Z`.
@@ -963,6 +969,11 @@ abbreviation pushout.map {W X Y Z S T : C} (f₁ : S ⟶ W) (f₂ : S ⟶ X) [ha
963969
pushout.desc (i₁ ≫ pushout.inl) (i₂ ≫ pushout.inr)
964970
(by { simp only [← category.assoc, eq₁, eq₂], simp [pushout.condition] })
965971

972+
/-- The canonical map `X ⨿ₛ Y ⟶ X ⨿ₜ Y` given `S ⟶ T`. -/
973+
abbreviation pushout.map_lift {X Y S T : C} (f : T ⟶ X) (g : T ⟶ Y) (i : S ⟶ T)
974+
[has_pushout f g] [has_pushout (i ≫ f) (i ≫ g)] :
975+
pushout (i ≫ f) (i ≫ g) ⟶ pushout f g :=
976+
pushout.map (i ≫ f) (i ≫ g) f g (𝟙 _) (𝟙 _) i (category.comp_id _) (category.comp_id _)
966977

967978
/-- Two morphisms into a pullback are equal if their compositions with the pullback morphisms are
968979
equal -/
@@ -1077,6 +1088,13 @@ begin
10771088
tidy
10781089
end
10791090

1091+
lemma pullback.map_desc_comp {X Y S T S' : C} (f : X ⟶ T) (g : Y ⟶ T) (i : T ⟶ S)
1092+
(i' : S ⟶ S') [has_pullback f g] [has_pullback (f ≫ i) (g ≫ i)]
1093+
[has_pullback (f ≫ i ≫ i') (g ≫ i ≫ i')] [has_pullback ((f ≫ i) ≫ i') ((g ≫ i) ≫ i')] :
1094+
pullback.map_desc f g (i ≫ i') = pullback.map_desc f g i ≫ pullback.map_desc _ _ i' ≫
1095+
(pullback.congr_hom (category.assoc _ _ _) (category.assoc _ _ _)).hom :=
1096+
by { ext; simp }
1097+
10801098
/-- If `f₁ = f₂` and `g₁ = g₂`, we may construct a canonical
10811099
isomorphism `pushout f₁ g₁ ≅ pullback f₂ g₂` -/
10821100
@[simps hom]
@@ -1102,6 +1120,14 @@ begin
11021120
rw category.id_comp }
11031121
end
11041122

1123+
lemma pushout.map_lift_comp {X Y S T S' : C} (f : T ⟶ X) (g : T ⟶ Y) (i : S ⟶ T)
1124+
(i' : S' ⟶ S) [has_pushout f g] [has_pushout (i ≫ f) (i ≫ g)]
1125+
[has_pushout (i' ≫ i ≫ f) (i' ≫ i ≫ g)] [has_pushout ((i' ≫ i) ≫ f) ((i' ≫ i) ≫ g)] :
1126+
pushout.map_lift f g (i' ≫ i) =
1127+
(pushout.congr_hom (category.assoc _ _ _) (category.assoc _ _ _)).hom ≫
1128+
pushout.map_lift _ _ i' ≫ pushout.map_lift f g i :=
1129+
by { ext; simp }
1130+
11051131
section
11061132

11071133
variables (G : C ⥤ D)

src/category_theory/morphism_property.lean

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Copyright (c) 2022 Andrew Yang. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Andrew Yang
55
-/
6-
import category_theory.limits.shapes.pullbacks
6+
import category_theory.limits.shapes.diagonal
77
import category_theory.arrow
88
import category_theory.limits.shapes.comm_sq
99

@@ -373,6 +373,53 @@ full_subcategory (λ (F : C ⥤ D), W.is_inverted_by F)
373373
def functors_inverting.mk {W : morphism_property C} {D : Type*} [category D]
374374
(F : C ⥤ D) (hF : W.is_inverted_by F) : W.functors_inverting D := ⟨F, hF⟩
375375

376+
section diagonal
377+
378+
variables [has_pullbacks C] {P : morphism_property C}
379+
380+
/-- For `P : morphism_property C`, `P.diagonal` is a morphism property that holds for `f : X ⟶ Y`
381+
whenever `P` holds for `X ⟶ Y xₓ Y`. -/
382+
def diagonal (P : morphism_property C) : morphism_property C :=
383+
λ X Y f, P (pullback.diagonal f)
384+
385+
lemma diagonal_iff {X Y : C} {f : X ⟶ Y} : P.diagonal f ↔ P (pullback.diagonal f) := iff.rfl
386+
387+
lemma respects_iso.diagonal (hP : P.respects_iso) : P.diagonal.respects_iso :=
388+
begin
389+
split,
390+
{ introv H,
391+
rwa [diagonal_iff, pullback.diagonal_comp, hP.cancel_left_is_iso, hP.cancel_left_is_iso,
392+
← hP.cancel_right_is_iso _ _, ← pullback.condition, hP.cancel_left_is_iso],
393+
apply_instance },
394+
{ introv H,
395+
delta diagonal,
396+
rwa [pullback.diagonal_comp, hP.cancel_right_is_iso] }
397+
end
398+
399+
lemma stable_under_composition.diagonal
400+
(hP : stable_under_composition P) (hP' : respects_iso P) (hP'' : stable_under_base_change P) :
401+
P.diagonal.stable_under_composition :=
402+
begin
403+
introv X h₁ h₂,
404+
rw [diagonal_iff, pullback.diagonal_comp],
405+
apply hP, { assumption },
406+
rw hP'.cancel_left_is_iso,
407+
apply hP''.snd,
408+
assumption
409+
end
410+
411+
lemma stable_under_base_change.diagonal
412+
(hP : stable_under_base_change P) (hP' : respects_iso P) :
413+
P.diagonal.stable_under_base_change :=
414+
stable_under_base_change.mk hP'.diagonal
415+
begin
416+
introv h,
417+
rw [diagonal_iff, diagonal_pullback_fst, hP'.cancel_left_is_iso, hP'.cancel_right_is_iso],
418+
convert hP.base_change_map f _ _; simp; assumption
419+
end
420+
421+
end diagonal
422+
376423
end morphism_property
377424

378425
end category_theory

0 commit comments

Comments
 (0)