|
| 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: Edward van de Meent, Christian Merten |
| 5 | +-/ |
| 6 | +module |
| 7 | + |
| 8 | +public import Mathlib.CategoryTheory.Sites.Canonical |
| 9 | +public import Mathlib.CategoryTheory.Sites.JointlySurjective |
| 10 | +public import Mathlib.CategoryTheory.Sites.MorphismProperty |
| 11 | +public import Mathlib.Topology.Category.TopCat.Limits.Pullbacks |
| 12 | + |
| 13 | +/-! |
| 14 | +
|
| 15 | +# The Grothendieck topology on `TopCat` |
| 16 | +
|
| 17 | +In this file we define the standard Grothendieck topology on `TopCat`. This is the topology |
| 18 | +generated by families of jointly surjective open embeddings. |
| 19 | +
|
| 20 | +## Main definitions and results |
| 21 | +
|
| 22 | +- `TopCat.isOpenEmbedding`: The morphism property in `TopCat` given by open embeddings. |
| 23 | +- `TopCat.grothendieckTopology`: The Grothendieck topology generated by families of jointly |
| 24 | + surjective open embeddings. |
| 25 | +- `TopCat.subcanonical_grothendieckTopology`: The Grothendieck topology on `TopCat` is subcanonical. |
| 26 | +
|
| 27 | +## TODOs |
| 28 | +
|
| 29 | +- Define the étale precoverage on `TopCat` (replace open embedding by local homeomorphism |
| 30 | + in the definition of the Grothendieck topology) and show it induces the same Grothendieck |
| 31 | + topology. |
| 32 | +
|
| 33 | +-/ |
| 34 | + |
| 35 | +@[expose] public section |
| 36 | + |
| 37 | +universe u |
| 38 | + |
| 39 | +open CategoryTheory Limits |
| 40 | + |
| 41 | +namespace TopCat |
| 42 | + |
| 43 | +/-- The morphism property on the category of topological spaces given by open embeddings. -/ |
| 44 | +def isOpenEmbedding : MorphismProperty TopCat := |
| 45 | + fun _ _ f ↦ Topology.IsOpenEmbedding f |
| 46 | + |
| 47 | +@[simp] |
| 48 | +lemma isOpenEmbedding_iff {X Y : TopCat} (f : X ⟶ Y) : |
| 49 | + isOpenEmbedding f ↔ Topology.IsOpenEmbedding f := .rfl |
| 50 | + |
| 51 | +instance : isOpenEmbedding.IsMultiplicative where |
| 52 | + id_mem _ := .id |
| 53 | + comp_mem _ _ hf hg := hg.comp hf |
| 54 | + |
| 55 | +instance : isOpenEmbedding.RespectsIso := |
| 56 | + MorphismProperty.respectsIso_of_isStableUnderComposition fun _ _ f (_ : IsIso f) ↦ |
| 57 | + (TopCat.homeoOfIso (asIso f)).isOpenEmbedding |
| 58 | + |
| 59 | +instance : isOpenEmbedding.IsStableUnderBaseChange := |
| 60 | + .mk' fun _ _ _ _ _ _ hg ↦ fst_isOpenEmbedding_of_right _ hg |
| 61 | + |
| 62 | +/-- The precoverage on `TopCat` given by jointly surjective families of open embeddings. -/ |
| 63 | +def precoverage : Precoverage TopCat.{u} := |
| 64 | + Types.jointlySurjectivePrecoverage.comap (forget TopCat) ⊓ isOpenEmbedding.precoverage |
| 65 | + deriving Precoverage.HasIsos, Precoverage.IsStableUnderBaseChange, |
| 66 | + Precoverage.IsStableUnderComposition |
| 67 | + |
| 68 | +/-- The Grothendieck topology on the category of topological spaces is the topology given by |
| 69 | +jointly surjective open embeddings. -/ |
| 70 | +abbrev grothendieckTopology : GrothendieckTopology TopCat.{u} := |
| 71 | + precoverage.toGrothendieck |
| 72 | + |
| 73 | +lemma exists_mem_zeroHypercover_range {X : TopCat} (E : precoverage.ZeroHypercover X) : |
| 74 | + ∀ x, ∃ (i : E.I₀), x ∈ Set.range (E.f i) := by |
| 75 | + simpa using E.mem₀.left |
| 76 | + |
| 77 | +lemma isOpenEmbedding_f_zeroHypercover {X : TopCat} (E : precoverage.ZeroHypercover X) : |
| 78 | + ∀ i, Topology.IsOpenEmbedding (E.f i) := by |
| 79 | + simpa using E.mem₀.right |
| 80 | + |
| 81 | +instance : Precoverage.Small.{u} precoverage.{u} := |
| 82 | + .inf fun _ _ _ hRS hS _ _ hf ↦ hS (hRS _ hf) |
| 83 | + |
| 84 | +/-- The Grothendieck topology on `TopCat` is subcanonical. -/ |
| 85 | +instance subcanonical_grothendieckTopology : grothendieckTopology.Subcanonical := by |
| 86 | + refine .of_isSheaf_yoneda_obj _ fun X ↦ ?_ |
| 87 | + rw [Precoverage.isSheaf_toGrothendieck_iff_of_isStableUnderBaseChange_of_small] |
| 88 | + intro Y 𝒰 |
| 89 | + rw [Presieve.isSheafFor_arrows_iff] |
| 90 | + have heq (i y) : 𝒰.f i y = (Subtype.val : Set.range (𝒰.f i) → Y) ⟨𝒰.f i y, by simp⟩ := rfl |
| 91 | + refine fun x hx ↦ ⟨?_, fun i ↦ ?_, fun f hf ↦ ?_⟩ |
| 92 | + · refine ofHom <| ContinuousMap.liftCover (fun i ↦ Set.range (𝒰.f i)) ?_ ?_ ?_ |
| 93 | + · intro i |
| 94 | + exact ⟨(x i).hom ∘ (isOpenEmbedding_f_zeroHypercover 𝒰 i).toHomeomorph.symm, by fun_prop⟩ |
| 95 | + · intro i j y |
| 96 | + simp only [Set.mem_range, ContinuousMap.coe_mk, Function.comp_apply, forall_exists_index] |
| 97 | + intro xi hi xj hj |
| 98 | + conv_lhs => simp only [← hi] |
| 99 | + conv_rhs => simp only [← hj] |
| 100 | + have := hx i j _ (TopCat.pullbackCone (𝒰.f i) (𝒰.f j)).fst |
| 101 | + (TopCat.pullbackCone (𝒰.f i) (𝒰.f j)).snd (TopCat.pullbackCone (𝒰.f i) (𝒰.f j)).condition |
| 102 | + dsimp at this |
| 103 | + simpa using congr($(this) ⟨(xi, xj), hi ▸ hj.symm⟩) |
| 104 | + · intro x |
| 105 | + obtain ⟨i, hi⟩ := exists_mem_zeroHypercover_range 𝒰 x |
| 106 | + exact ⟨i, (isOpenEmbedding_f_zeroHypercover 𝒰 i).isOpen_range.mem_nhds hi⟩ |
| 107 | + · dsimp |
| 108 | + ext |
| 109 | + simp only [hom_comp, hom_ofHom, ContinuousMap.comp_apply] |
| 110 | + rw [heq, ContinuousMap.liftCover_coe] |
| 111 | + simp |
| 112 | + · dsimp |
| 113 | + ext x |
| 114 | + obtain ⟨i, y, rfl⟩ := exists_mem_zeroHypercover_range 𝒰 x |
| 115 | + have := congr($(hf i).hom y) |
| 116 | + dsimp at this ⊢ |
| 117 | + rw [this, heq, ContinuousMap.liftCover_coe] |
| 118 | + simp |
| 119 | + |
| 120 | +end TopCat |
0 commit comments