Skip to content

Commit d38b507

Browse files
committed
feat(CategoryTheory/MorphismProperty): API for sites on P.Over ⊤ X (leanprover-community#36126)
From Proetale
1 parent 8c6c3f0 commit d38b507

File tree

4 files changed

+157
-0
lines changed

4 files changed

+157
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2989,6 +2989,7 @@ public import Mathlib.CategoryTheory.Monoidal.Types.Basic
29892989
public import Mathlib.CategoryTheory.Monoidal.Types.Coyoneda
29902990
public import Mathlib.CategoryTheory.MorphismProperty.Basic
29912991
public import Mathlib.CategoryTheory.MorphismProperty.Comma
2992+
public import Mathlib.CategoryTheory.MorphismProperty.CommaSites
29922993
public import Mathlib.CategoryTheory.MorphismProperty.Composition
29932994
public import Mathlib.CategoryTheory.MorphismProperty.Concrete
29942995
public import Mathlib.CategoryTheory.MorphismProperty.Descent

Mathlib/CategoryTheory/MorphismProperty/Comma.lean

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,26 @@ lemma Over.w {A B : P.Over Q X} (f : A ⟶ B) :
435435
f.left ≫ B.hom = A.hom := by
436436
simp
437437

438+
section
439+
440+
variable {P' Q' : MorphismProperty T} [Q'.IsMultiplicative] (hPP' : P ≤ P') (hQQ' : Q ≤ Q')
441+
442+
variable (X) in
443+
/-- The natural inclusion induced by implications of morphism properties. -/
444+
abbrev Over.changeProp (hPP' : P ≤ P') (hQQ' : Q ≤ Q') :
445+
P.Over Q X ⥤ P'.Over Q' X :=
446+
Comma.changeProp _ _ hPP' hQQ' le_rfl
447+
448+
@[simp]
449+
lemma Over.changeProp_obj_left (hPP' : P ≤ P') (hQQ' : Q ≤ Q') (Y : P.Over Q X) :
450+
((changeProp X hPP' hQQ').obj Y).left = Y.left := rfl
451+
452+
@[simp]
453+
lemma Over.changeProp_obj_hom (hPP' : P ≤ P') (hQQ' : Q ≤ Q') (Y : P.Over Q X) :
454+
((changeProp X hPP' hQQ').obj Y).hom = Y.hom := rfl
455+
456+
end
457+
438458
end Over
439459

440460
section Under
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/-
2+
Copyright (c) 2026 Christian Merten. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Christian Merten
5+
-/
6+
module
7+
8+
public import Mathlib.CategoryTheory.MorphismProperty.Comma
9+
public import Mathlib.CategoryTheory.Sites.MorphismProperty
10+
public import Mathlib.CategoryTheory.Sites.Over
11+
12+
/-!
13+
14+
# Sites on `P.Over ⊤ X`
15+
16+
We provide some API for proving properties of `P.Over ⊤ X` in relation to precoverages. Consider
17+
a precoverage `K` on `C`.
18+
19+
## Main results
20+
21+
- `CategoryTheory.MorphismProperty.locallyCoverDense_forget_of_le`:
22+
The forgetful functor `P.Over ⊤ X ⥤ Over X` is locally cover dense if morphisms in `K`
23+
satisfy `P`.
24+
- `CategoryTheory.MorphismProperty.toGrothendieck_comap_forget_eq_inducedTopology`: The topology
25+
generated by the precoverage induced from `K` via the composition `P.Over ⊤ X ⥤ Over X ⥤ C` is
26+
the induced topology from the forgetful functor `P.Over ⊤ X ⥤ Over X`.
27+
28+
-/
29+
30+
@[expose] public section
31+
32+
universe v u
33+
34+
open CategoryTheory MorphismProperty Limits
35+
36+
namespace CategoryTheory.MorphismProperty
37+
38+
variable {C : Type*} [Category* C]
39+
40+
variable {P : MorphismProperty C} {S : C} [P.IsStableUnderComposition]
41+
42+
set_option backward.isDefEq.respectTransparency false in
43+
lemma exists_map_eq_of_presieve (K : Precoverage C) (H : K ≤ P.precoverage)
44+
{X : P.Over ⊤ S} {R : Presieve ((MorphismProperty.Over.forget P ⊤ S).obj X)}
45+
(hR : R ∈ (K.comap <| CategoryTheory.Over.forget S) _) :
46+
∃ T : Presieve X, T.map (MorphismProperty.Over.forget P ⊤ S) = R := by
47+
rw [Precoverage.mem_iff_exists_zeroHypercover] at hR
48+
obtain ⟨𝒰, rfl⟩ := hR
49+
let 𝒱 : PreZeroHypercover X :=
50+
⟨𝒰.I₀, fun i ↦ Over.mk _ (𝒰.X i).hom ?_, fun i ↦ Over.homMk (𝒰.f i).left (by simp) trivial⟩
51+
· use 𝒱.presieve₀
52+
rw [Presieve.map_ofArrows]
53+
rfl
54+
· rw [← CategoryTheory.Over.w (𝒰.f i)]
55+
exact P.comp_mem _ _ (H _ 𝒰.mem₀ ⟨⟨i⟩⟩) X.prop
56+
57+
variable (K : Precoverage C) [K.HasIsos] [K.IsStableUnderBaseChange] [K.IsStableUnderComposition]
58+
[K.HasPullbacks]
59+
60+
lemma locallyCoverDense_forget_of_le (H : K ≤ P.precoverage) :
61+
(MorphismProperty.Over.forget P ⊤ S).LocallyCoverDense (K.toGrothendieck.over S) := by
62+
rw [over_toGrothendieck_eq_toGrothendieck_comap_forget]
63+
apply Precoverage.locallyCoverDense_of_map_functorPullback_mem
64+
intro X R hR
65+
obtain ⟨R, rfl⟩ := MorphismProperty.exists_map_eq_of_presieve _ H hR
66+
simpa
67+
68+
lemma toGrothendieck_comap_forget_eq_inducedTopology
69+
(H : K ≤ P.precoverage) :
70+
haveI := MorphismProperty.locallyCoverDense_forget_of_le (S := S) K H
71+
(K.comap (MorphismProperty.Over.forget P ⊤ _ ⋙ CategoryTheory.Over.forget S)).toGrothendieck =
72+
(MorphismProperty.Over.forget P ⊤ _).inducedTopology (K.toGrothendieck.over S) := by
73+
have : (Over.forget P ⊤ S).LocallyCoverDense
74+
(K.comap (CategoryTheory.Over.forget S)).toGrothendieck := by
75+
rw [← over_toGrothendieck_eq_toGrothendieck_comap_forget]
76+
exact MorphismProperty.locallyCoverDense_forget_of_le (S := S) K H
77+
rw [Precoverage.comap_comp]
78+
simp_rw [over_toGrothendieck_eq_toGrothendieck_comap_forget]
79+
apply Precoverage.toGrothendieck_comap_eq_inducedTopology
80+
intro X R hR
81+
obtain ⟨T, rfl⟩ := MorphismProperty.exists_map_eq_of_presieve K H hR
82+
simpa
83+
84+
end CategoryTheory.MorphismProperty

Mathlib/CategoryTheory/Sites/DenseSubsite/InducedTopology.lean

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,4 +146,56 @@ noncomputable def sheafInducedTopologyEquivOfIsCoverDense
146146

147147
end Functor
148148

149+
namespace Precoverage
150+
151+
variable {C D : Type*} [Category* C] [Category* D] (F : C ⥤ D) (K : Precoverage D)
152+
153+
lemma toGrothendieck_comap_le_inducedTopology [F.IsLocallyFull K.toGrothendieck]
154+
[F.IsLocallyFaithful K.toGrothendieck] [F.LocallyCoverDense K.toGrothendieck] :
155+
(K.comap F).toGrothendieck ≤ F.inducedTopology K.toGrothendieck := by
156+
rw [Precoverage.toGrothendieck_le_iff_le_toPrecoverage]
157+
intro X R hR
158+
rw [Precoverage.mem_comap_iff] at hR
159+
rw [GrothendieckTopology.mem_toPrecoverage_iff, Functor.mem_inducedTopology_sieves_iff,
160+
← Sieve.generate_map_eq_functorPushforward]
161+
exact Precoverage.generate_mem_toGrothendieck hR
162+
163+
variable [K.HasIsos] [K.IsStableUnderBaseChange] [K.IsStableUnderComposition]
164+
[K.HasPullbacks]
165+
166+
lemma locallyCoverDense_of_map_functorPullback_mem
167+
(H : ∀ {S : C} {R : Presieve (F.obj S)}, R ∈ K (F.obj S) →
168+
Presieve.map F (Presieve.functorPullback F R) ∈ K (F.obj S)) :
169+
F.LocallyCoverDense K.toGrothendieck where
170+
functorPushforward_functorPullback_mem U := fun ⟨T, hT⟩ ↦ by
171+
rw [Precoverage.mem_toGrothendieck_iff_of_isStableUnderComposition] at hT ⊢
172+
obtain ⟨R, hR, hle⟩ := hT
173+
refine ⟨_, H hR, ?_⟩
174+
refine le_trans ?_
175+
(Presieve.functorPushforward_monotone (Presieve.functorPullback_monotone hle))
176+
rw [← Sieve.arrows_generate_map_eq_functorPushforward]
177+
exact Sieve.le_generate _
178+
179+
lemma toGrothendieck_comap_eq_inducedTopology [F.Faithful] [F.Full]
180+
(H : ∀ {S : C} {R : Presieve (F.obj S)}, R ∈ K (F.obj S) →
181+
Presieve.map F (Presieve.functorPullback F R) ∈ K (F.obj S)) :
182+
haveI : F.LocallyCoverDense K.toGrothendieck :=
183+
K.locallyCoverDense_of_map_functorPullback_mem F H
184+
(K.comap F).toGrothendieck = F.inducedTopology K.toGrothendieck := by
185+
haveI : F.LocallyCoverDense K.toGrothendieck :=
186+
K.locallyCoverDense_of_map_functorPullback_mem F H
187+
refine le_antisymm ?_ fun X T hT ↦ ?_
188+
· apply toGrothendieck_comap_le_inducedTopology
189+
· rw [Functor.mem_inducedTopology_sieves_iff] at hT
190+
rw [Precoverage.mem_toGrothendieck_iff_of_isStableUnderComposition] at hT
191+
obtain ⟨R, hR, hle⟩ := hT
192+
refine GrothendieckTopology.superset_covering
193+
(S := Sieve.generate (Presieve.functorPullback F R)) _ ?_ ?_
194+
· refine le_trans (le_trans (Sieve.generate_functorPullback_le F R)
195+
(Sieve.functorPullback_monotone _ _ (Sieve.generate_mono hle))) ?_
196+
rw [Sieve.generate_sieve, Sieve.functorPullback_functorPushforward_eq]
197+
· exact Precoverage.generate_mem_toGrothendieck (H hR)
198+
199+
end Precoverage
200+
149201
end CategoryTheory

0 commit comments

Comments
 (0)