Skip to content

Commit fbfd573

Browse files
committed
feat(CategoryTheory/Sites): various API additions for leanprover-community#34917 (leanprover-community#34921)
1 parent 81197a4 commit fbfd573

7 files changed

Lines changed: 103 additions & 11 deletions

File tree

Mathlib/CategoryTheory/Sites/Coverage.lean

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,30 @@ theorem isSheaf_sup (K L : Coverage C) (P : Cᵒᵖ ⥤ Type*) :
481481

482482
end Presieve
483483

484+
lemma Precoverage.isSheaf_toGrothendieck_iff_of_isStableUnderBaseChange
485+
{J : Precoverage C} [J.HasPullbacks] [J.IsStableUnderBaseChange] (P : Cᵒᵖ ⥤ Type*) :
486+
Presieve.IsSheaf J.toGrothendieck P ↔ ∀ ⦃X : C⦄ (R : Presieve X),
487+
R ∈ J X → Presieve.IsSheafFor P R := by
488+
rw [← J.toCoverage_toPrecoverage, Coverage.toGrothendieck_toPrecoverage,
489+
Presieve.isSheaf_coverage]
490+
491+
lemma Precoverage.isSheaf_toGrothendieck_iff_of_isStableUnderBaseChange_of_small {J : Precoverage C}
492+
[J.IsStableUnderBaseChange] [J.HasPullbacks] [Small.{w} J] (P : Cᵒᵖ ⥤ Type*) :
493+
Presieve.IsSheaf J.toGrothendieck P ↔
494+
∀ ⦃X : C⦄ (E : ZeroHypercover.{w} J X), Presieve.IsSheafFor P E.presieve₀ := by
495+
rw [Precoverage.isSheaf_toGrothendieck_iff_of_isStableUnderBaseChange]
496+
refine ⟨fun h X E ↦ h _ E.mem₀, fun h X R hR ↦ ?_⟩
497+
obtain ⟨E₀, rfl⟩ := R.exists_eq_preZeroHypercover
498+
rw [Presieve.isSheafFor_iff_generate]
499+
let E : ZeroHypercover J X := ⟨E₀, hR⟩
500+
apply Presieve.isSheafFor_subsieve
501+
(S := .generate <| (ZeroHypercover.restrictIndexOfSmall.{w} E).presieve₀)
502+
· exact Sieve.generate_mono (by simp [E])
503+
· intro Y f
504+
rw [← Sieve.pullbackArrows_comm, ← Presieve.isSheafFor_iff_generate,
505+
← PreZeroHypercover.presieve₀_pullback₁, ← ZeroHypercover.pullback₂_toPreZeroHypercover]
506+
apply h
507+
484508
namespace Presheaf
485509

486510
theorem isSheaf_iff_isLimit_coverage (K : Coverage C) (P : Cᵒᵖ ⥤ D) :

Mathlib/CategoryTheory/Sites/Grothendieck.lean

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ theorem mem_sieves_iff_coe : S ∈ J.sieves X ↔ S ∈ J X :=
110110
Iff.rfl
111111

112112
/-- Also known as the maximality axiom. -/
113-
@[simp]
113+
@[simp, grind .]
114114
theorem top_mem (X : C) : ⊤ ∈ J X :=
115115
J.top_mem' X
116116

117117
/-- Also known as the stability axiom. -/
118-
@[simp]
118+
@[simp, grind .]
119119
theorem pullback_stable (f : Y ⟶ X) (hS : S ∈ J X) : S.pullback f ∈ J Y :=
120120
J.pullback_stable' f hS
121121

@@ -127,6 +127,7 @@ lemma pullback_mem_iff_of_isIso {i : X ⟶ Y} [IsIso i] {S : Sieve Y} :
127127
convert J.pullback_stable (inv i) H
128128
rw [← Sieve.pullback_comp, IsIso.inv_hom_id, Sieve.pullback_id]
129129

130+
@[grind .]
130131
theorem transitive (hS : S ∈ J X) (R : Sieve X) (h : ∀ ⦃Y⦄ ⦃f : Y ⟶ X⦄, S f → R.pullback f ∈ J Y) :
131132
R ∈ J X :=
132133
J.transitive' hS R h

Mathlib/CategoryTheory/Sites/Hypercover/Zero.lean

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@ lemma presieve₀_restrictIndex_equiv {ι : Type w'} (e : ι ≃ E.I₀) :
145145
obtain ⟨i, rfl⟩ := e.surjective i
146146
exact ⟨i⟩
147147

148+
@[simp]
149+
lemma presieve₀_restrictIndex_le {ι : Type*} (f : ι → E.I₀) :
150+
(E.restrictIndex f).presieve₀ ≤ E.presieve₀ := by
151+
rw [Presieve.ofArrows_le_iff]
152+
intro i
153+
exact .mk _
154+
148155
/-- Replace the indexing type of a pre-`0`-hypercover. -/
149156
@[simps!]
150157
def reindex (E : PreZeroHypercover.{w} T) {ι : Type w'} (e : ι ≃ E.I₀) :
@@ -337,6 +344,16 @@ lemma inv_hom_h₀_comp_f {E F : PreZeroHypercover.{w} S} (e : E ≅ F) (i : E.I
337344
lemma inv_inv_h₀_comp_f {E F : PreZeroHypercover.{w} S} (e : E ≅ F) (i : F.I₀) :
338345
inv (e.inv.h₀ i) ≫ F.f i = E.f _ := by simp
339346

347+
lemma Hom.sieve₀_le_sieve₀ {E F : PreZeroHypercover S} (f : E.Hom F) : E.sieve₀ ≤ F.sieve₀ := by
348+
rw [Sieve.generate_le_iff, Presieve.ofArrows_le_iff]
349+
intro i
350+
rw [← f.w₀ i]
351+
apply Sieve.downward_closed
352+
exact Sieve.le_generate _ _ ⟨f.s₀ i⟩
353+
354+
lemma sieve₀_eq_of_iso {E F : PreZeroHypercover S} (e : E ≅ F) : E.sieve₀ = F.sieve₀ :=
355+
le_antisymm e.hom.sieve₀_le_sieve₀ e.inv.sieve₀_le_sieve₀
356+
340357
end Category
341358

342359
section Functoriality
@@ -427,6 +444,12 @@ def interLift (f : G.Hom E) (g : G.Hom F) :
427444
s₀ i := ⟨f.s₀ i, g.s₀ i⟩
428445
h₀ i := pullback.lift (f.h₀ i) (g.h₀ i) (by simp)
429446

447+
/-- The refinement given by restricting the indexing type. -/
448+
@[simps]
449+
def restrictIndexHom {ι : Type w'} (f : ι → E.I₀) : (E.restrictIndex f).Hom E where
450+
s₀ := f
451+
h₀ _ := 𝟙 _
452+
430453
end
431454

432455
/-- If `{Uᵢ}` covers `X`, the pre-`0`-hypercover `{Uᵢ ×[Z] Y}` of `X ×[Z] Y` is isomorphic

Mathlib/CategoryTheory/Sites/MorphismProperty.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ lemma precoverage_inf : precoverage (P ⊓ Q) = precoverage P ⊓ precoverage Q
7474
exact ⟨fun hS ↦ ⟨fun _ _ hf ↦ (hS hf).left, fun _ _ hf ↦ (hS hf).right⟩,
7575
fun h ↦ fun _ _ hf ↦ ⟨h.left hf, h.right hf⟩⟩
7676

77+
@[simp, grind .]
78+
lemma bot_mem_precoverage (X : C) : ⊥ ∈ precoverage P X := fun _ _ h ↦ h.elim
79+
7780
lemma comap_precoverage {D : Type*} [Category* D] (P : MorphismProperty D) (F : C ⥤ D) :
7881
P.precoverage.comap F = (P.inverseImage F).precoverage := by
7982
ext X R

Mathlib/CategoryTheory/Sites/PrecoverageToGrothendieck.lean

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ lemma generate_mem_toGrothendieck {X : C} {R : Presieve X} (hR : R ∈ J X) :
7272
Sieve.generate R ∈ J.toGrothendieck X :=
7373
.of _ _ hR
7474

75+
@[gcongr]
76+
lemma toGrothendieck_mono {J K : Precoverage C} (h : J ≤ K) :
77+
J.toGrothendieck ≤ K.toGrothendieck := by
78+
intro X S hS
79+
induction hS with
80+
| of X S hS => exact generate_mem_toGrothendieck (h _ hS)
81+
| top X => simp
82+
| pullback X S _ Y f _ => grind
83+
| transitive X S R _ _ _ _ => grind
84+
7585
/--
7686
An alternative characterization of the Grothendieck topology associated to a precoverage `J`:
7787
it is the infimum of all Grothendieck topologies containing `Sieve.generate S` for all presieves
@@ -213,4 +223,25 @@ lemma Presieve.IsSheaf.isSheafFor_of_mem_precoverage {J : Precoverage C} {P : C
213223
rw [J.isSheaf_toGrothendieck_iff] at h
214224
simpa [Presieve.isSheafFor_iff_generate] using h (f := 𝟙 S) R hR
215225

226+
lemma PreZeroHypercover.isSheafFor_iff_of_iso {F : Cᵒᵖ ⥤ Type*} {S : C} {𝒰 𝒱 : PreZeroHypercover S}
227+
(e : 𝒰 ≅ 𝒱) :
228+
𝒰.presieve₀.IsSheafFor F ↔ 𝒱.presieve₀.IsSheafFor F := by
229+
rw [Presieve.isSheafFor_iff_generate, ← Sieve.ofArrows, ← PreZeroHypercover.sieve₀,
230+
PreZeroHypercover.sieve₀_eq_of_iso e, ← Presieve.isSheafFor_iff_generate]
231+
232+
lemma Presieve.isSheafFor_ofArrows_comp_iff {F : Cᵒᵖ ⥤ Type*} {X : C} {ι : Type*} {Y Z : ι → C}
233+
(g : ∀ i, Z i ⟶ X) (e : ∀ i, Y i ≅ Z i) :
234+
IsSheafFor F (ofArrows _ (fun i ↦ (e i).hom ≫ g i)) ↔ IsSheafFor F (ofArrows _ g) := by
235+
let 𝒰 : PreZeroHypercover X := ⟨_, _, g⟩
236+
let 𝒱 : PreZeroHypercover X := ⟨_, _, fun i ↦ (e i).hom ≫ g i⟩
237+
let e : 𝒰 ≅ 𝒱 := PreZeroHypercover.isoMk (.refl _) (fun i ↦ (e i).symm)
238+
exact PreZeroHypercover.isSheafFor_iff_of_iso e.symm
239+
240+
lemma Presieve.isSheafFor_singleton_iff_of_iso {F : Cᵒᵖ ⥤ Type*} {S X Y : C} (f : X ⟶ S) (g : Y ⟶ S)
241+
(e : X ≅ Y) (he : e.hom ≫ g = f) :
242+
(singleton f).IsSheafFor F ↔ (singleton g).IsSheafFor F := by
243+
subst he
244+
rw [← Presieve.ofArrows_pUnit.{_, _, 0}, ← Presieve.ofArrows_pUnit,
245+
Presieve.isSheafFor_ofArrows_comp_iff]
246+
216247
end CategoryTheory

Mathlib/CategoryTheory/Sites/Pretopology.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,10 @@ instance orderBot : OrderBot (Pretopology C) where
222222
theorem toGrothendieck_bot : toGrothendieck (C := C) ⊥ = ⊥ :=
223223
(gi C).gc.l_bot
224224

225+
@[gcongr]
226+
lemma toGrothendieck_mono {J K : Pretopology C} (h : J ≤ K) : J.toGrothendieck ≤ K.toGrothendieck :=
227+
fun _ _ ⟨R, hR, hle⟩ ↦ ⟨R, h _ hR, hle⟩
228+
225229
instance : InfSet (Pretopology C) where
226230
sInf T := {
227231
coverings := sInf ((fun J ↦ J.coverings) '' T)

Mathlib/CategoryTheory/Sites/Sieves.lean

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,6 @@ lemma ofArrows.mk' {ι : Type*} {Y : ι → C} {f : ∀ i, Y i ⟶ X} {Z : C} {g
177177
subst hg
178178
constructor
179179

180-
theorem ofArrows_pUnit : (ofArrows _ fun _ : PUnit => f) = singleton f := by
181-
funext Y
182-
ext g
183-
constructor
184-
· rintro ⟨_⟩
185-
apply singleton.mk
186-
· rintro ⟨_⟩
187-
exact ofArrows.mk PUnit.unit
188-
189180
instance {ι : Type*} (Z : ι → C) (g : ∀ i : ι, Z i ⟶ X)
190181
[∀ i, HasPullback (g i) f] : (ofArrows Z g).HasPullbacks f where
191182
hasPullback {_} _ := fun ⟨i⟩ ↦ inferInstance
@@ -274,6 +265,17 @@ lemma ofArrows_le_iff {X : C} {ι : Type*} {Y : ι → C} {f : ∀ i, Y i ⟶ X}
274265
Presieve.ofArrows Y f ≤ R ↔ ∀ i, R (f i) :=
275266
fun hle i ↦ hle _ ⟨i⟩, fun h _ g ⟨i⟩ ↦ h i⟩
276267

268+
lemma ofArrows_of_unique {X : C} {ι : Type*} [Unique ι] {Y : ι → C} (f : ∀ i, Y i ⟶ X) :
269+
ofArrows Y f = singleton (f default) := by
270+
refine le_antisymm ?_ fun Y _ ⟨⟩ ↦ ⟨default⟩
271+
rw [ofArrows_le_iff]
272+
intro i
273+
obtain rfl : i = default := Subsingleton.elim _ _
274+
simp
275+
276+
theorem ofArrows_pUnit : (ofArrows _ fun _ : PUnit => f) = singleton f := by
277+
rw [ofArrows_of_unique]
278+
277279
/-- A convenient constructor for a refinement of a presieve of the form `Presieve.ofArrows`.
278280
This contains a sieve obtained by `Sieve.bind` and `Sieve.ofArrows`, see
279281
`Presieve.bind_ofArrows_le_bindOfArrows`, but has better definitional properties. -/
@@ -644,6 +646,10 @@ theorem generate_of_singleton_isSplitEpi (f : Y ⟶ X) [IsSplitEpi f] :
644646
theorem generate_top : generate (⊤ : Presieve X) = ⊤ :=
645647
generate_of_contains_isSplitEpi (𝟙 _) ⟨⟩
646648

649+
@[simp]
650+
lemma generate_bot : generate (⊥ : Presieve X) = ⊥ := by
651+
simp only [eq_bot_iff, generate_le_iff, bot_le]
652+
647653
@[simp]
648654
lemma comp_mem_iff (i : X ⟶ Y) (f : Y ⟶ Z) [IsIso i] (S : Sieve Z) :
649655
S (i ≫ f) ↔ S f := by

0 commit comments

Comments
 (0)