Skip to content

Commit 4f8d8ef

Browse files
tb65536michaellee94
authored andcommitted
feat(CategoryTheory/Sites/Over): add Presieve.overEquiv (leanprover-community#41510)
This PR adds `Presieve.overEquiv`, the presieve version of the existing `Sieve.overEquiv`. I also upgraded these equivs to order isomorphisms, and fixed some defeq abuse at the same time. Partial help from Claude on a couple of the proofs, all code was ultimately written and golfed by me. Co-authored-by: tb65536 <thomas.l.browning@gmail.com>
1 parent 311aee1 commit 4f8d8ef

6 files changed

Lines changed: 76 additions & 66 deletions

File tree

Mathlib/AlgebraicGeometry/Sites/Small.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ lemma Cover.toPresieveOver_le_arrows_iff {X : Over S} (R : Sieve X)
7272
(𝒰 : Cover.{u} (precoverage P) X.left) [𝒰.Over S] :
7373
𝒰.toPresieveOver ≤ R.arrows ↔
7474
Presieve.ofArrows 𝒰.X 𝒰.f ≤ (Sieve.overEquiv X R).arrows := by
75-
simp_rw [← Sieve.giGenerate.gc.le_iff_le, ← Sieve.overEquiv_le_overEquiv_iff]
75+
simp_rw [← Sieve.giGenerate.gc.le_iff_le, ← (Sieve.overEquiv X).map_rel_iff]
7676
rw [overEquiv_generate_toPresieveOver_eq_ofArrows]
7777

7878
variable [P.IsMultiplicative] [P.RespectsIso]

Mathlib/CategoryTheory/Sites/Descent/DescentData.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ noncomputable def fullyFaithfulToDescentData [F.IsPrestack J] (hf : Sieve.ofArro
616616
intro M N
617617
refine ((isSheaf_iff_isSheaf_of_type _ _).1
618618
(IsPrestack.isSheaf J M N)).isSheafFor _ ?_
619-
rwa [GrothendieckTopology.mem_over_iff, Sieve.generate_sieve, Equiv.apply_symm_apply])
619+
rwa [GrothendieckTopology.mem_over_iff, Sieve.generate_sieve, OrderIso.apply_symm_apply])
620620

621621
lemma isPrestackFor [F.IsPrestack J] {S : C} (R : Presieve S) (hR : Sieve.generate R ∈ J S) :
622622
F.IsPrestackFor R := by

Mathlib/CategoryTheory/Sites/Descent/Precoverage.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public lemma faithful_pullFunctor :
6464
refine F.presheafHomObjHomEquiv.injective ?_i
6565
have : (Sieve.overEquiv (Over.mk (𝟙 (X i)))).symm
6666
(Sieve.pullback (f i) (Sieve.ofArrows X' f')) ∈ J.over (X i) _ := by
67-
simpa only [J.mem_over_iff, Equiv.apply_symm_apply] using! J.pullback_stable (f i) hf'
67+
simpa only [J.mem_over_iff, OrderIso.apply_symm_apply] using! J.pullback_stable (f i) hf'
6868
refine (((isSheaf_iff_isSheaf_of_type _ _).1
6969
(IsPrestack.isSheaf _ _ _)).isSeparated _ this).ext ?_
7070
rintro Z g ⟨Y, p, c, ⟨j⟩, hp⟩
@@ -104,7 +104,7 @@ abbrev sieve (i : ι) : Sieve (Over.mk (𝟙 (X i))) :=
104104
include hf' in
105105
variable (f) in
106106
lemma sieve_mem (i : ι) : sieve f f' i ∈ J.over _ _ := by
107-
simpa only [J.mem_over_iff, Equiv.apply_symm_apply] using! J.pullback_stable (f i) hf'
107+
simpa only [J.mem_over_iff, OrderIso.apply_symm_apply] using! J.pullback_stable (f i) hf'
108108

109109
set_option backward.defeqAttrib.useBackward true in
110110
lemma mem_sieve {i : ι} {Z : C} (q : Z ⟶ X i) ⦃j : ι'⦄ (a : Z ⟶ X' j)
@@ -275,7 +275,7 @@ lemma comm ⦃W : C⦄ (q : W ⟶ S) ⦃i₁ i₂ : ι⦄
275275
Category.assoc, DescentData.hom_comp, D₂.hom_self _ _ hf₁, Category.comp_id]
276276
have H : (Sieve.overEquiv (Over.mk f₁)).symm
277277
(Sieve.pullback q (Sieve.ofArrows X' f')) ∈ J.over _ _ := by
278-
rw [J.mem_over_iff, Equiv.apply_symm_apply]
278+
rw [J.mem_over_iff, OrderIso.apply_symm_apply]
279279
exact J.pullback_stable _ hf'
280280
refine ((isSheaf_iff_isSheaf_of_type _ _).1
281281
(IsPrestack.isSheaf J (D₁.obj i₁) (D₂.obj i₁)) _ H).isSeparatedFor.ext ?_

Mathlib/CategoryTheory/Sites/Over.lean

Lines changed: 61 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -33,70 +33,74 @@ open Category
3333

3434
variable {C : Type u} [Category.{v} C]
3535

36+
namespace Presieve
37+
3638
@[simp]
37-
lemma Presieve.map_functorPullback_overForget {X : C} {Y : Over X} (R : Presieve Y.left) :
38-
Presieve.map (Over.forget X) (.functorPullback (Over.forget X) R) = R := by
39-
refine le_antisymm (map_functorPullback _) fun Z g hg ↦ ?_
40-
let g' : Over.mk (g ≫ Y.hom) ⟶ Y := Over.homMk g
41-
exact Presieve.map.of (u := g') hg
39+
lemma functorPullback_map_overForget {X : C} {Y : Over X} (S : Presieve Y) :
40+
(S.map (Over.forget X)).functorPullback (Over.forget X) = S := by
41+
let R : Presieve Y.left := fun Z g ↦ S (Over.homMk g : Over.mk (g ≫ Y.hom) ⟶ Y)
42+
suffices hR : (R.functorPullback (Over.forget X)) = S by
43+
rw [← hR, functorPullback_map_functorPullback]
44+
funext Z f
45+
obtain ⟨Z, fZ, rfl⟩ := Z.mk_surjective
46+
obtain ⟨g : Z ⟶ Y.left, rfl : g ≫ Y.hom = fZ, rfl⟩ := Over.homMk_surjective f
47+
rfl
4248

43-
namespace Sieve
49+
@[simp]
50+
lemma map_functorPullback_overForget {X : C} {Y : Over X} (R : Presieve Y.left) :
51+
(R.functorPullback (Over.forget X)).map (Over.forget X) = R :=
52+
le_antisymm (map_functorPullback _) fun Z g hg ↦
53+
map.of (u := (Over.homMk g : Over.mk (g ≫ Y.hom) ⟶ Y)) hg
4454

45-
set_option backward.defeqAttrib.useBackward true in
46-
/-- The equivalence `Sieve Y ≃ Sieve Y.left` for all `Y : Over X`. -/
47-
def overEquiv {X : C} (Y : Over X) :
48-
Sieve Y ≃ Sieve Y.left where
49-
toFun S := Sieve.functorPushforward (Over.forget X) S
50-
invFun S' := Sieve.functorPullback (Over.forget X) S'
51-
left_inv S := by
52-
ext Z g
53-
dsimp [Presieve.functorPullback, Presieve.functorPushforward]
54-
constructor
55-
· rintro ⟨W, a, b, h, w⟩
56-
let c : Z ⟶ W := Over.homMk b
57-
(by rw [← Over.w g, w, assoc, Over.w a])
58-
rw [show g = c ≫ a by ext; exact w]
59-
exact S.downward_closed h _
60-
· intro h
61-
exact ⟨Z, g, 𝟙 _, h, by simp⟩
62-
right_inv S := by
63-
ext Z g
64-
dsimp [Presieve.functorPullback, Presieve.functorPushforward]
65-
constructor
66-
· rintro ⟨W, a, b, h, rfl⟩
67-
exact S.downward_closed h _
68-
· intro h
69-
exact ⟨Over.mk ((g ≫ Y.hom)), Over.homMk g, 𝟙 _, h, by simp⟩
55+
/-- The equivalence `Presieve Y ≃ Presieve Y.left` for all `Y : Over X`. -/
56+
@[simps]
57+
def overEquiv {X : C} (Y : Over X) : Presieve Y ≃o Presieve Y.left where
58+
toFun S := map (Over.forget X) S
59+
invFun S' := functorPullback (Over.forget X) S'
60+
left_inv := functorPullback_map_overForget
61+
right_inv := map_functorPullback_overForget
62+
map_rel_iff' := ⟨fun h ↦ by simpa using functorPullback_monotone h, fun h ↦ map_monotone h⟩
7063

71-
@[simp]
72-
lemma overEquiv_top {X : C} (Y : Over X) :
73-
overEquiv Y ⊤ = ⊤ := by
74-
ext Z g
75-
simp only [top_apply, iff_true]
76-
dsimp [overEquiv, Presieve.functorPushforward]
77-
exact ⟨Y, 𝟙 Y, g, by simp, by simp⟩
64+
end Presieve
65+
66+
namespace Sieve
7867

7968
@[simp]
80-
lemma overEquiv_symm_top {X : C} (Y : Over X) :
81-
(overEquiv Y).symm ⊤ = ⊤ :=
82-
(overEquiv Y).injective (by simp)
69+
lemma functorPushforward_overForget_arrows {X : C} {Y : Over X} (S : Sieve Y) :
70+
S.arrows.functorPushforward (Over.forget X) = S.arrows.map (Over.forget X) := by
71+
refine le_antisymm ?_ (S.arrows.map_le_functorPushforward (Over.forget X))
72+
rintro Z - ⟨W, fW, fZ, h, rfl⟩
73+
exact Presieve.map_map (S.downward_closed h (Over.homMk fZ : Over.mk (fZ ≫ W.hom) ⟶ W))
8374

84-
set_option backward.isDefEq.respectTransparency false in
8575
@[simp]
86-
lemma overEquiv_bot {X : C} (Y : Over X) : overEquiv Y ⊥ = ⊥ := by
87-
simp [overEquiv]
76+
lemma functorPullback_functorPushforward_overForget {X : C} {Y : Over X} (S : Sieve Y) :
77+
(S.functorPushforward (Over.forget X)).functorPullback (Over.forget X) = S := by
78+
apply arrows_ext
79+
simp
8880

89-
set_option backward.isDefEq.respectTransparency false in
9081
@[simp]
91-
lemma overEquiv_symm_bot {X : C} (Y : Over X) : (overEquiv Y).symm ⊥ = ⊥ := by
92-
rw [overEquiv, Equiv.coe_fn_symm_mk, functorPullback_bot]
82+
lemma functorPushforward_functorPullback_overForget {X : C} {Y : Over X} (S : Sieve Y.left) :
83+
(S.functorPullback (Over.forget X)).functorPushforward (Over.forget X) = S := by
84+
apply arrows_ext
85+
simp [← arrows_generate_map_eq_functorPushforward]
9386

94-
lemma overEquiv_le_overEquiv_iff {X : C} {Y : Over X} (R₁ R₂ : Sieve Y) :
95-
R₁.overEquiv Y ≤ R₂.overEquiv Y ↔ R₁ ≤ R₂ := by
96-
refine ⟨fun h ↦ ?_, fun h ↦ Sieve.functorPushforward_monotone _ _ h⟩
97-
replace h : (overEquiv Y).symm (R₁.overEquiv Y) ≤ (overEquiv Y).symm (R₂.overEquiv Y) :=
98-
Sieve.functorPullback_monotone _ _ h
99-
simpa using h
87+
/-- The equivalence `Sieve Y ≃ Sieve Y.left` for all `Y : Over X`. -/
88+
@[simps -isSimp] -- working with `overEquiv` is useful enough that we don't want `simp` unfolding it
89+
def overEquiv {X : C} (Y : Over X) : Sieve Y ≃o Sieve Y.left where
90+
toFun := functorPushforward (Over.forget X)
91+
invFun := functorPullback (Over.forget X)
92+
left_inv := functorPullback_functorPushforward_overForget
93+
right_inv := functorPushforward_functorPullback_overForget
94+
map_rel_iff' := by
95+
rw [Equiv.coe_fn_mk]
96+
exact ⟨fun h ↦ by simpa using functorPullback_monotone _ _ h,
97+
fun h ↦ functorPushforward_monotone _ _ h⟩
98+
99+
@[deprecated (since := "2026-07-08")] alias overEquiv_top := map_top
100+
@[deprecated (since := "2026-07-08")] alias overEquiv_symm_top := map_top
101+
@[deprecated (since := "2026-07-08")] alias overEquiv_bot := map_bot
102+
@[deprecated (since := "2026-07-08")] alias overEquiv_symm_bot := map_bot
103+
@[deprecated (since := "2026-07-08")] alias overEquiv_le_overEquiv_iff := RelIso.map_rel_iff
100104

101105
set_option backward.defeqAttrib.useBackward true in
102106
lemma overEquiv_pullback {X : C} {Y₁ Y₂ : Over X} (f : Y₁ ⟶ Y₂) (S : Sieve Y₂) :
@@ -245,7 +249,7 @@ lemma mem_over_iff {X : C} {Y : Over X} (S : Sieve Y) :
245249

246250
lemma overEquiv_symm_mem_over {X : C} (Y : Over X) (S : Sieve Y.left) (hS : S ∈ J Y.left) :
247251
(Sieve.overEquiv Y).symm S ∈ (J.over X) Y := by
248-
simpa only [mem_over_iff, Equiv.apply_symm_apply] using hS
252+
simpa only [mem_over_iff, OrderIso.apply_symm_apply] using hS
249253

250254
lemma over_forget_coverPreserving (X : C) :
251255
CoverPreserving (J.over X) J (Over.forget X) where
@@ -528,15 +532,14 @@ lemma over_toGrothendieck_eq_toGrothendieck_comap_forget (X : C) :
528532
refine le_antisymm ?_ ?_
529533
· intro ⟨Y, right, (s : Y ⟶ X)⟩ R hR
530534
obtain ⟨(R : Sieve Y), rfl⟩ := (Sieve.overEquiv _).symm.surjective R
531-
simp +instances only [GrothendieckTopology.mem_over_iff, Equiv.apply_symm_apply,
535+
simp +instances only [GrothendieckTopology.mem_over_iff, OrderIso.apply_symm_apply,
532536
← Precoverage.toGrothendieck_toCoverage, Coverage.mem_toGrothendieck,
533537
Over.left] at hR
534538
induction hR with
535539
| of Z S hS =>
536540
rw [Sieve.overEquiv_symm_generate]
537541
exact .of _ _ (by simpa)
538542
| top =>
539-
rw [Sieve.overEquiv_symm_top]
540543
simp
541544
| transitive Y R S hR H ih ih' =>
542545
refine GrothendieckTopology.transitive _ (ih s) _ fun Z g hg ↦ ?_
@@ -547,7 +550,8 @@ lemma over_toGrothendieck_eq_toGrothendieck_comap_forget (X : C) :
547550
intro Y R hR
548551
rw [Precoverage.mem_comap_iff] at hR
549552
rw [GrothendieckTopology.mem_toPrecoverage_iff, GrothendieckTopology.mem_over_iff,
550-
Sieve.overEquiv, Equiv.coe_fn_mk, ← Sieve.generate_map_eq_functorPushforward]
553+
Sieve.overEquiv, RelIso.coe_fn_mk, Equiv.coe_fn_mk,
554+
← Sieve.generate_map_eq_functorPushforward]
551555
exact Precoverage.Saturate.of _ _ hR
552556

553557
end

Mathlib/CategoryTheory/Sites/Point/Over.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def over : Point.{w} (J.over X) where
5050
jointly_surjective := by
5151
rintro U R hR ⟨u, hu⟩
5252
obtain ⟨R, rfl⟩ := (Sieve.overEquiv _).symm.surjective R
53-
simp only [mem_over_iff, Equiv.apply_symm_apply] at hR
53+
simp only [mem_over_iff, OrderIso.apply_symm_apply] at hR
5454
obtain ⟨Y, f, hf, v, rfl⟩ := Φ.jointly_surjective R hR u
5555
refine ⟨Over.mk (f ≫ U.hom), Over.homMk f, hf, ⟨v, ?_⟩, rfl⟩
5656
rw [FunctorToTypes.mem_fromOverSubfunctor_iff] at hu ⊢
@@ -71,7 +71,7 @@ lemma IsConservativeFamilyOfPoints.over
7171
mk' (fun Y S hS ↦ by
7272
obtain ⟨Y, f, rfl⟩ := Over.mk_surjective Y
7373
obtain ⟨S, rfl⟩ := (Sieve.overEquiv _).symm.surjective S
74-
rw [mem_over_iff, Equiv.apply_symm_apply]
74+
rw [mem_over_iff, OrderIso.apply_symm_apply]
7575
obtain ⟨ι, Z, g, rfl⟩ := S.exists_eq_ofArrows
7676
rw [hP.jointly_reflect_ofArrows_mem_of_small]
7777
intro Φ y

Mathlib/CategoryTheory/Sites/Sieves.lean

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -757,8 +757,11 @@ theorem le_generate (R : Presieve X) : R ≤ generate R :=
757757
theorem generate_sieve (S : Sieve X) : generate S = S :=
758758
giGenerate.l_u_eq S
759759

760-
lemma generate_mono : Monotone (generate : Presieve X → _) :=
761-
(giGenerate (X := X)).gc.monotone_l
760+
@[gcongr]
761+
theorem generate_mono : Monotone (generate : Presieve X → Sieve X) := giGenerate.gc.monotone_l
762+
763+
@[gcongr]
764+
theorem arrows_mono : Monotone (arrows : Sieve X → Presieve X) := giGenerate.gc.monotone_u
762765

763766
/-- If the identity arrow is in a sieve, the sieve is maximal. -/
764767
theorem id_mem_iff_eq_top : S (𝟙 X) ↔ S = ⊤ :=
@@ -1469,6 +1472,9 @@ lemma Presieve.functorPullback_arrows {X : C} (S : Sieve (F.obj X)) :
14691472
Presieve.functorPullback F S.arrows = Sieve.functorPullback F S :=
14701473
rfl
14711474

1475+
theorem Presieve.map_le_functorPushforward (S : Presieve X) : S.map F ≤ S.functorPushforward F := by
1476+
grw [← Sieve.arrows_generate_map_eq_functorPushforward, ← Sieve.le_generate]
1477+
14721478
lemma Presieve.bind_ofArrows_le_bindOfArrows {ι : Type*} {X : C} (Z : ι → C)
14731479
(f : ∀ i, Z i ⟶ X) (R : ∀ i, Presieve (Z i)) :
14741480
Sieve.bind (Sieve.ofArrows Z f)

0 commit comments

Comments
 (0)