|
| 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