@@ -33,70 +33,74 @@ open Category
3333
3434variable {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
101105set_option backward.defeqAttrib.useBackward true in
102106lemma 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
246250lemma 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
250254lemma 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
553557end
0 commit comments