Skip to content

Commit 7470699

Browse files
committed
feat(CategoryTheory/Sites): topology on Over X is subcanonical if the topology on the base is subcanonical (leanprover-community#36061)
1 parent 7c14c7a commit 7470699

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3203,6 +3203,7 @@ public import Mathlib.CategoryTheory.Sites.Sheafification
32033203
public import Mathlib.CategoryTheory.Sites.Sieves
32043204
public import Mathlib.CategoryTheory.Sites.Spaces
32053205
public import Mathlib.CategoryTheory.Sites.Subcanonical
3206+
public import Mathlib.CategoryTheory.Sites.SubcanonicalOver
32063207
public import Mathlib.CategoryTheory.Sites.Subsheaf
32073208
public import Mathlib.CategoryTheory.Sites.Types
32083209
public import Mathlib.CategoryTheory.Sites.Whiskering
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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.Sites.Canonical
9+
public import Mathlib.CategoryTheory.Sites.Over
10+
11+
/-!
12+
# Topology on `Over X` is subcanonical if the base is
13+
14+
We show that if `J` is subcanonical, then also `J.over X` is subcanonical.
15+
-/
16+
17+
@[expose] public section
18+
19+
namespace CategoryTheory.GrothendieckTopology
20+
21+
variable {C : Type*} [Category* C]
22+
23+
set_option backward.isDefEq.respectTransparency false in
24+
lemma subcanonical_over (J : GrothendieckTopology C) [J.Subcanonical] (X : C) :
25+
(J.over X).Subcanonical := by
26+
refine .of_isSheaf_yoneda_obj _ fun E Z R hR t ht ↦ ?_
27+
obtain ⟨ι, T, g, rfl⟩ := R.exists_eq_ofArrows
28+
let hg : Presieve.Arrows.Compatible (CategoryTheory.yoneda.obj E.left)
29+
(fun i ↦ (g i).left) (fun i ↦ (t (g i) (Sieve.ofArrows_mk T g i)).left) :=
30+
fun i j Z gi gj hgij ↦ congr($(ht (Over.homMk (U := Over.mk (gi ≫ (T i).hom)) gi rfl)
31+
(Over.homMk (U := Over.mk (gi ≫ (T i).hom)) gj
32+
(by dsimp; rw [← Over.w (g i), reassoc_of% hgij, ← Over.w (g j)]))
33+
(Sieve.ofArrows_mk _ _ i) (Sieve.ofArrows_mk _ _ j) (by ext; exact hgij)).left)
34+
rw [J.mem_over_iff, Sieve.ofArrows, Sieve.overEquiv_generate,
35+
← Sieve.arrows_generate_map_eq_functorPushforward, Sieve.generate_sieve,
36+
Presieve.map_ofArrows] at hR
37+
obtain ⟨a, ha, huniq⟩ := Subcanonical.isSheaf_of_isRepresentable
38+
(CategoryTheory.yoneda.obj E.left) _ hR _ hg.familyOfElements_compatible.sieveExtend
39+
refine ⟨?_, ?_, fun y hty ↦ ?_⟩
40+
· refine Over.homMk a ?_
41+
refine (Subcanonical.isSheaf_of_isRepresentable <| CategoryTheory.yoneda.obj X)
42+
(.ofArrows _ <| fun i ↦ (g i).left) hR |>.isSeparatedFor.ext ?_
43+
rintro W u ⟨V, v, _, ⟨i⟩, rfl⟩
44+
have := ha _ (Sieve.ofArrows_mk _ _ i)
45+
dsimp at this
46+
simp [reassoc_of% this, Presieve.extend_agrees hg.familyOfElements_compatible (.mk i)]
47+
· rintro W p ⟨V, v, _, ⟨i⟩, rfl⟩
48+
refine Over.OverMorphism.ext ?_
49+
have := ha (g i).left (Sieve.ofArrows_mk _ _ i)
50+
dsimp at this
51+
simp [Category.assoc, this, Presieve.extend_agrees hg.familyOfElements_compatible (.mk i),
52+
Presieve.FamilyOfElements.comp_of_compatible _ ht (Sieve.ofArrows_mk _ _ i)]
53+
· refine Over.OverMorphism.ext (huniq _ ?_)
54+
rintro W p ⟨V, v, _, ⟨i⟩, rfl⟩
55+
have := congr($(hty _ (Sieve.ofArrows_mk _ _ i)).left)
56+
dsimp at this
57+
simp [Presieve.FamilyOfElements.comp_of_compatible _
58+
hg.familyOfElements_compatible.sieveExtend (Sieve.ofArrows_mk _ _ i),
59+
Presieve.extend_agrees hg.familyOfElements_compatible (.mk i), this]
60+
61+
end CategoryTheory.GrothendieckTopology

0 commit comments

Comments
 (0)