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

Commit ba43124

Browse files
committed
feat(category_theory/sites/*): Comparison lemma (#9785)
Co-authored-by: erdOne <36414270+erdOne@users.noreply.github.com>
1 parent a779f6c commit ba43124

File tree

4 files changed

+286
-13
lines changed

4 files changed

+286
-13
lines changed

src/category_theory/sites/cover_lifting.lean

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Andrew Yang
55
-/
66
import category_theory.sites.sheaf
77
import category_theory.limits.kan_extension
8+
import category_theory.sites.cover_preserving
89

910
/-!
1011
# Cover-lifting functors between sites.
@@ -21,12 +22,16 @@ but they are actually equivalent via `category_theory.grothendieck_topology.supe
2122
2223
## Main definitions
2324
24-
* `category_theory.sites.cover_lifting`: a functor between sites is cover_lifting if it
25-
pulls back covering sieves to covering sieves
25+
* `category_theory.sites.cover_lifting`: a functor between sites is cover-lifting if it
26+
pulls back covering sieves to covering sieves
27+
* `category_theory.sites.copullback`: A cover-lifting functor `G : (C, J) ⥤ (D, K)` induces a
28+
morphism of sites in the same direction as the functor.
2629
2730
## Main results
28-
- `category_theory.sites.Ran_is_sheaf_of_cover_lifting`: If `G : C ⥤ D` is cover_lifting, then
29-
`Ran G.op` (`ₚu`) as a functor `(Cᵒᵖ ⥤ A) ⥤ (Dᵒᵖ ⥤ A)` of presheaves maps sheaves to sheaves.
31+
* `category_theory.sites.Ran_is_sheaf_of_cover_lifting`: If `G : C ⥤ D` is cover_lifting, then
32+
`Ran G.op` (`ₚu`) as a functor `(Cᵒᵖ ⥤ A) ⥤ (Dᵒᵖ ⥤ A)` of presheaves maps sheaves to sheaves.
33+
* `category_theory.pullback_copullback_adjunction`: If `G : (C, J) ⥤ (D, K)` is cover-lifting,
34+
cover-preserving, and compatible-preserving, then `pullback G` and `copullback G` are adjoint.
3035
3136
## References
3237
@@ -48,23 +53,26 @@ open category_theory.limits
4853
namespace category_theory
4954
section cover_lifting
5055
variables {C : Type*} [category C] {D : Type*} [category D] {E : Type*} [category E]
51-
variables {J : grothendieck_topology C} {K : grothendieck_topology D}
56+
variables (J : grothendieck_topology C) (K : grothendieck_topology D)
5257
variables {L : grothendieck_topology E}
5358

5459
/--
5560
A functor `G : (C, J) ⥤ (D, K)` between sites is called to have the cover-lifting property
5661
if for all covering sieves `R` in `D`, `R.pullback G` is a covering sieve in `C`.
5762
-/
5863
@[nolint has_inhabited_instance]
59-
structure cover_lifting (J : grothendieck_topology C) (K : grothendieck_topology D) (G : C ⥤ D) :=
64+
structure cover_lifting (G : C ⥤ D) : Prop :=
6065
(cover_lift : ∀ {U : C} {S : sieve (G.obj U)} (hS : S ∈ K (G.obj U)), S.functor_pullback G ∈ J U)
6166

6267
/-- The identity functor on a site is cover-lifting. -/
63-
def id_cover_lifting : cover_lifting J J (𝟭 _) := ⟨λ _ _ h, by simpa using h⟩
68+
lemma id_cover_lifting : cover_lifting J J (𝟭 _) := ⟨λ _ _ h, by simpa using h⟩
69+
70+
variables {J K}
6471

6572
/-- The composition of two cover-lifting functors are cover-lifting -/
66-
def comp_cover_lifting {G} (hu : cover_lifting J K G) {v} (hv : cover_lifting K L v) :
67-
cover_lifting J L (G ⋙ v) := ⟨λ _ S h, hu.cover_lift (hv.cover_lift h)⟩
73+
lemma comp_cover_lifting {F : C ⥤ D} (hu : cover_lifting J K F) {G : D ⥤ E}
74+
(hv : cover_lifting K L G) : cover_lifting J L (F ⋙ G) :=
75+
⟨λ _ S h, hu.cover_lift (hv.cover_lift h)⟩
6876

6977
end cover_lifting
7078

@@ -227,15 +235,41 @@ If `G` is cover_lifting, then `Ran G.op` pushes sheaves to sheaves.
227235
This result is basically https://stacks.math.columbia.edu/tag/00XK,
228236
but without the condition that `C` or `D` has pullbacks.
229237
-/
230-
theorem Ran_is_sheaf_of_cover_lifting {G : C ⥤ D} (hu : cover_lifting J K G) (ℱ : Sheaf J A) :
238+
theorem Ran_is_sheaf_of_cover_lifting {G : C ⥤ D} (hG : cover_lifting J K G) (ℱ : Sheaf J A) :
231239
presheaf.is_sheaf K ((Ran G.op).obj ℱ.val) :=
232240
begin
233241
intros X U S hS x hx,
234242
split, swap,
235-
{ apply Ran_is_sheaf_of_cover_lifting.glued_section hu ℱ hS hx },
243+
{ apply Ran_is_sheaf_of_cover_lifting.glued_section hG ℱ hS hx },
236244
split,
237245
{ apply Ran_is_sheaf_of_cover_lifting.glued_section_is_amalgamation },
238246
{ apply Ran_is_sheaf_of_cover_lifting.glued_section_is_unique }
239247
end
240248

249+
variable (A)
250+
251+
/-- A cover-lifting functor induces a morphism of sites in the same direction as the functor. -/
252+
def sites.copullback {G : C ⥤ D} (hG : cover_lifting J K G) :
253+
Sheaf J A ⥤ Sheaf K A :=
254+
{ obj := λ ℱ, ⟨(Ran G.op).obj ℱ.val, Ran_is_sheaf_of_cover_lifting hG ℱ⟩,
255+
map := λ _ _ f, (Ran G.op).map f,
256+
map_id' := λ ℱ, (Ran G.op).map_id ℱ.val,
257+
map_comp' := λ _ _ _ f g, (Ran G.op).map_comp f g }
258+
259+
/--
260+
Given a functor between sites that is cover-preserving, cover-lifting, and compatible-preserving,
261+
the pullback and copullback along `G` are adjoint to each other
262+
-/
263+
@[simps] noncomputable
264+
def sites.pullback_copullback_adjunction {G : C ⥤ D} (Hp : cover_preserving J K G)
265+
(Hl : cover_lifting J K G) (Hc : compatible_preserving K G) :
266+
sites.pullback A Hc Hp ⊣ sites.copullback A Hl :=
267+
{ hom_equiv := λ X Y, (Ran.adjunction A G.op).hom_equiv X.val Y.val,
268+
unit := { app := λ X, (Ran.adjunction A G.op).unit.app X.val,
269+
naturality' := λ _ _ f, (Ran.adjunction A G.op).unit.naturality f },
270+
counit := { app := λ X, (Ran.adjunction A G.op).counit.app X.val,
271+
naturality' := λ _ _ f, (Ran.adjunction A G.op).counit.naturality f },
272+
hom_equiv_unit' := λ X Y f, (Ran.adjunction A G.op).hom_equiv_unit,
273+
hom_equiv_counit' := λ X Y f, (Ran.adjunction A G.op).hom_equiv_counit }
274+
241275
end category_theory

src/category_theory/sites/dense_subsite.lean

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Andrew Yang
55
-/
66
import category_theory.sites.sheaf
7+
import category_theory.sites.cover_lifting
8+
import category_theory.adjunction.fully_faithful
79

810
/-!
911
# Dense subsites
@@ -26,6 +28,9 @@ we would need, and some sheafification would be needed for here and there.
2628
- `category_theory.cover_dense.iso_of_restrict_iso`: If `G : C ⥤ (D, K)` is full and cover-dense,
2729
then given any sheaves `ℱ, ℱ'` on `D`, and a morphism `α : ℱ ⟶ ℱ'`, then `α` is an iso if
2830
`G ⋙ ℱ ⟶ G ⋙ ℱ'` is iso.
31+
- `category_theory.cover_dense.Sheaf_equiv_of_cover_preserving_cover_lifting`:
32+
If `G : (C, J) ⥤ (D, K)` is fully-faithful, cover-lifting, cover-preserving, and cover-dense,
33+
then it will induce an equivalence of categories of sheaves valued in a complete category.
2934
3035
## References
3136
@@ -35,7 +40,7 @@ we would need, and some sheafification would be needed for here and there.
3540
3641
-/
3742

38-
universes v
43+
universes v u
3944

4045
namespace category_theory
4146

@@ -411,6 +416,68 @@ begin
411416
apply sheaf_hom_eq
412417
end
413418

419+
/-- A fully faithful cover-dense functor preserves compatible families. -/
420+
lemma compatible_preserving [faithful G] : compatible_preserving K G :=
421+
begin
422+
constructor,
423+
intros ℱ Z T x hx Y₁ Y₂ X f₁ f₂ g₁ g₂ hg₁ hg₂ eq,
424+
apply H.ext,
425+
intros W i,
426+
simp only [← functor_to_types.map_comp_apply, ← op_comp],
427+
rw ← G.image_preimage (i ≫ f₁),
428+
rw ← G.image_preimage (i ≫ f₂),
429+
apply hx,
430+
apply G.map_injective,
431+
simp [eq]
432+
end
433+
434+
noncomputable
435+
instance sites.pullback.full [faithful G] (Hp : cover_preserving J K G) :
436+
full (sites.pullback A H.compatible_preserving Hp) :=
437+
{ preimage := λ ℱ ℱ' α, H.sheaf_hom α,
438+
witness' := λ ℱ ℱ' α, H.sheaf_hom_restrict_eq α }
439+
440+
instance sites.pullback.faithful [faithful G] (Hp : cover_preserving J K G) :
441+
faithful (sites.pullback A H.compatible_preserving Hp) :=
442+
{ map_injective' := λ ℱ ℱ' α β (eq : whisker_left G.op α = whisker_left G.op β),
443+
by rw [← H.sheaf_hom_eq α, ← H.sheaf_hom_eq β, eq] }
444+
414445
end cover_dense
415446

416447
end category_theory
448+
449+
namespace category_theory.cover_dense
450+
451+
open category_theory
452+
453+
variables {C : Type u} [small_category C] {D : Type u} [small_category D]
454+
variables {G : C ⥤ D} [full G] [faithful G]
455+
variables {J : grothendieck_topology C} {K : grothendieck_topology D}
456+
variables {A : Type v} [category.{u} A] [limits.has_limits A]
457+
variables (Hd : cover_dense K G) (Hp : cover_preserving J K G) (Hl : cover_lifting J K G)
458+
459+
include Hd Hp Hl
460+
461+
/--
462+
Given a functor between small sites that is cover-dense, cover-preserving, and cover-lifting,
463+
it induces an equivalence of category of sheaves valued in a complete category.
464+
-/
465+
@[simps functor inverse] noncomputable
466+
def Sheaf_equiv_of_cover_preserving_cover_lifting : Sheaf J A ≌ Sheaf K A :=
467+
begin
468+
symmetry,
469+
let α := sites.pullback_copullback_adjunction A Hp Hl Hd.compatible_preserving,
470+
haveI : ∀ (X : Sheaf J A), is_iso (α.counit.app X),
471+
{ intro ℱ,
472+
apply_with (reflects_isomorphisms.reflects (Sheaf_to_presheaf J A)) { instances := ff },
473+
exact is_iso.of_iso ((@as_iso _ _ _ _ _ (Ran.reflective A G.op)).app ℱ.val) },
474+
haveI : is_iso α.counit := nat_iso.is_iso_of_is_iso_app _,
475+
exact
476+
{ functor := sites.pullback A Hd.compatible_preserving Hp,
477+
inverse := sites.copullback A Hl,
478+
unit_iso := as_iso α.unit,
479+
counit_iso := as_iso α.counit,
480+
functor_unit_iso_comp' := λ ℱ, by convert α.left_triangle_components }
481+
end
482+
483+
end category_theory.cover_dense
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
/-
2+
Copyright (c) 2021 Andrew Yang. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Andrew Yang
5+
-/
6+
import category_theory.sites.dense_subsite
7+
8+
/-!
9+
# Induced Topology
10+
11+
We say that a functor `G : C ⥤ (D, K)` is locally dense if for each covering sieve `T` in `D` of
12+
some `X : C`, `T ∩ mor(C)` generates a covering sieve of `X` in `D`. A locally dense fully faithful
13+
functor then induces a topology on `C` via `{ T ∩ mor(C) | T ∈ K }`. Note that this is equal to
14+
the collection of sieves on `C` whose image generates a covering sieve. This construction would
15+
make `C` both cover-lifting and cover-preserving.
16+
17+
Some typical examples are full and cover-dense functors (for example the functor from a basis of a
18+
topological space `X` into `opens X`). The functor `over X ⥤ C` is also locally dense, and the
19+
induced topology can then be used to construct the big sites associated to a scheme.
20+
21+
Given a fully faithful cover-dense functor `G : C ⥤ (D, K)` between small sites, we then have
22+
`Sheaf (H.induced_topology) A ≌ Sheaf K A`. This is known as the comparison lemma.
23+
24+
## References
25+
26+
* [Elephant]: *Sketches of an Elephant*, P. T. Johnstone: C2.2.
27+
* https://ncatlab.org/nlab/show/dense+sub-site
28+
* https://ncatlab.org/nlab/show/comparison+lemma
29+
30+
-/
31+
32+
namespace category_theory
33+
34+
universes v u
35+
36+
open limits opposite presieve
37+
38+
section
39+
40+
variables {C : Type*} [category C] {D : Type*} [category D] {G : C ⥤ D}
41+
variables {J : grothendieck_topology C} {K : grothendieck_topology D}
42+
variables (A : Type v) [category.{u} A]
43+
44+
-- variables (A) [full G] [faithful G]
45+
46+
/--
47+
We say that a functor `C ⥤ D` into a site is "locally dense" if
48+
for each covering sieve `T` in `D`, `T ∩ mor(C)` generates a covering sieve in `D`.
49+
-/
50+
def locally_cover_dense (K : grothendieck_topology D) (G : C ⥤ D) : Prop :=
51+
∀ ⦃X⦄ (T : K (G.obj X)), (T.val.functor_pullback G).functor_pushforward G ∈ K (G.obj X)
52+
53+
namespace locally_cover_dense
54+
55+
variables [full G] [faithful G] (Hld : locally_cover_dense K G)
56+
57+
include Hld
58+
59+
lemma pushforward_cover_iff_cover_pullback {X : C} (S : sieve X) :
60+
K _ (S.functor_pushforward G) ↔ ∃ (T : K (G.obj X)), T.val.functor_pullback G = S :=
61+
begin
62+
split,
63+
{ intros hS,
64+
exact ⟨⟨_, hS⟩, (sieve.fully_faithful_functor_galois_coinsertion G X).u_l_eq S⟩ },
65+
{ rintros ⟨T, rfl⟩,
66+
exact Hld T }
67+
end
68+
69+
/--
70+
If a functor `G : C ⥤ (D, K)` is fully faithful and locally dense,
71+
then the set `{ T ∩ mor(C) | T ∈ K }` is a grothendieck topology of `C`.
72+
-/
73+
@[simps]
74+
def induced_topology :
75+
grothendieck_topology C :=
76+
{ sieves := λ X S, K _ (S.functor_pushforward G),
77+
top_mem' := λ X, by { change K _ _, rw sieve.functor_pushforward_top, exact K.top_mem _ },
78+
pullback_stable' := λ X Y S f hS,
79+
begin
80+
have : S.pullback f = ((S.functor_pushforward G).pullback (G.map f)).functor_pullback G,
81+
{ conv_lhs { rw ← (sieve.fully_faithful_functor_galois_coinsertion G X).u_l_eq S },
82+
ext,
83+
change (S.functor_pushforward G) _ ↔ (S.functor_pushforward G) _,
84+
rw G.map_comp },
85+
rw this,
86+
change K _ _,
87+
apply Hld ⟨_, K.pullback_stable (G.map f) hS⟩
88+
end,
89+
transitive' := λ X S hS S' H',
90+
begin
91+
apply K.transitive hS,
92+
rintros Y _ ⟨Z, g, i, hg, rfl⟩,
93+
rw sieve.pullback_comp,
94+
apply K.pullback_stable i,
95+
refine K.superset_covering _ (H' hg),
96+
rintros W _ ⟨Z', g', i', hg, rfl⟩,
97+
use ⟨Z', g' ≫ g, i', hg, by simp⟩
98+
end }
99+
100+
/-- `G` is cover-lifting wrt the induced topology. -/
101+
lemma induced_topology_cover_lifting :
102+
cover_lifting Hld.induced_topology K G := ⟨λ _ S hS, Hld ⟨S, hS⟩⟩
103+
104+
/-- `G` is cover-preserving wrt the induced topology. -/
105+
lemma induced_topology_cover_preserving :
106+
cover_preserving Hld.induced_topology K G := ⟨λ _ S hS, hS⟩
107+
108+
end locally_cover_dense
109+
110+
lemma cover_dense.locally_cover_dense [full G] (H : cover_dense K G) : locally_cover_dense K G :=
111+
begin
112+
intros X T,
113+
refine K.superset_covering _ (K.bind_covering T.property (λ Y f Hf, H.is_cover Y)),
114+
rintros Y _ ⟨Z, _, f, hf, ⟨W, g, f', (rfl : _ = _)⟩, rfl⟩,
115+
use W, use G.preimage (f' ≫ f), use g,
116+
split,
117+
simpa using T.val.downward_closed hf f',
118+
simp,
119+
end
120+
121+
/--
122+
Given a fully faithful cover-dense functor `G : C ⥤ (D, K)`, we may induce a topology on `C`.
123+
-/
124+
abbreviation cover_dense.induced_topology [full G] [faithful G] (H : cover_dense K G) :
125+
grothendieck_topology C := H.locally_cover_dense.induced_topology
126+
127+
variable (J)
128+
129+
lemma over_forget_locally_cover_dense (X : C) : locally_cover_dense J (over.forget X) :=
130+
begin
131+
intros Y T,
132+
convert T.property,
133+
ext Z f,
134+
split,
135+
{ rintros ⟨_, _, g', hg, rfl⟩,
136+
exact T.val.downward_closed hg g' },
137+
{ intros hf,
138+
exact ⟨over.mk (f ≫ Y.hom), over.hom_mk f, 𝟙 _, hf, (category.id_comp _).symm⟩ }
139+
end
140+
141+
end
142+
143+
section small_site
144+
145+
variables {C : Type v} [small_category C] {D : Type v} [small_category D] {G : C ⥤ D}
146+
variables {J : grothendieck_topology C} {K : grothendieck_topology D}
147+
variables (A : Type u) [category.{v} A]
148+
149+
/--
150+
Cover-dense functors induces an equivalence of categories of sheaves.
151+
152+
This is known as the comparison lemma. It requires that the sites are small and the value category
153+
is complete.
154+
-/
155+
noncomputable
156+
def cover_dense.Sheaf_equiv [full G] [faithful G] (H : cover_dense K G) [has_limits A] :
157+
Sheaf H.induced_topology A ≌ Sheaf K A :=
158+
H.Sheaf_equiv_of_cover_preserving_cover_lifting
159+
H.locally_cover_dense.induced_topology_cover_preserving
160+
H.locally_cover_dense.induced_topology_cover_lifting
161+
162+
end small_site
163+
164+
end category_theory

src/category_theory/sites/sieves.lean

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,9 +581,17 @@ lemma functor_pullback_union (S R : sieve (F.obj X)) :
581581
lemma functor_pullback_inter (S R : sieve (F.obj X)) :
582582
(S ⊓ R).functor_pullback F = S.functor_pullback F ⊓ R.functor_pullback F := rfl
583583

584-
lemma functor_pushforward_bot (F : C ⥤ D) (X : C) :
584+
@[simp] lemma functor_pushforward_bot (F : C ⥤ D) (X : C) :
585585
(⊥ : sieve X).functor_pushforward F = ⊥ := (functor_galois_connection F X).l_bot
586586

587+
@[simp] lemma functor_pushforward_top (F : C ⥤ D) (X : C) :
588+
(⊤ : sieve X).functor_pushforward F = ⊤ :=
589+
begin
590+
refine (generate_sieve _).symm.trans _,
591+
apply generate_of_contains_split_epi (𝟙 (F.obj X)),
592+
refine ⟨X, 𝟙 _, 𝟙 _, trivial, by simp⟩
593+
end
594+
587595
@[simp] lemma functor_pullback_bot (F : C ⥤ D) (X : C) :
588596
(⊥ : sieve (F.obj X)).functor_pullback F = ⊥ := rfl
589597

0 commit comments

Comments
 (0)