Documentation

Mathlib.Topology.Sheaves.LocalPredicate

Functions satisfying a local predicate form a sheaf. #

At this stage, in Mathlib/Topology/Sheaves/SheafOfFunctions.lean we've proved that not-necessarily-continuous functions from a topological space into some type (or type family) form a sheaf.

Why do the continuous functions form a sheaf? The point is just that continuity is a local condition, so one can use the lifting condition for functions to provide a candidate lift, then verify that the lift is actually continuous by using the factorisation condition for the lift (which guarantees that on each open set it agrees with the functions being lifted, which were assumed to be continuous).

This file abstracts this argument to work for any collection of dependent functions on a topological space satisfying a "local predicate".

As an application, we check that continuity is a local predicate in this sense, and provide

A sheaf constructed in this way has a natural map stalkToFiber from the stalks to the types in the ambient type family.

We give conditions sufficient to show that this map is injective and/or surjective.

structure TopCat.PrelocalPredicate {X : TopCat} (T : XType u_1) :
Type (max u_1 u_2)

Given a topological space X : TopCat and a type family T : X → Type, a P : PrelocalPredicate T consists of:

  • a family of predicates P.pred, one for each U : Opens X, of the form (Π x : U, T x) → Prop
  • a proof that if f : Π x : V, T x satisfies the predicate on V : Opens X, then the restriction of f to any open subset U also satisfies the predicate.
  • pred {U : TopologicalSpace.Opens X} : ((x : U) → T x)Prop

    The underlying predicate of a prelocal predicate

  • res {U V : TopologicalSpace.Opens X} (i : U V) (f : (x : V) → T x) : self.pred fself.pred fun (x : U) => f (i x)

    The underlying predicate should be invariant under restriction

Instances For
    def TopCat.continuousPrelocal (X : TopCat) (T : Type u_3) [TopologicalSpace T] :
    PrelocalPredicate fun (x : X) => T

    Continuity is a "prelocal" predicate on functions to a fixed topological space T.

    Equations
      Instances For
        @[simp]
        theorem TopCat.continuousPrelocal_pred (X : TopCat) (T : Type u_3) [TopologicalSpace T] {x✝ : TopologicalSpace.Opens X} (f : x✝T) :
        instance TopCat.inhabitedPrelocalPredicate (X : TopCat) (T : Type u_3) [TopologicalSpace T] :
        Inhabited (PrelocalPredicate fun (x : X) => T)

        Satisfying the inhabited linter.

        Equations
          structure TopCat.LocalPredicate {X : TopCat} (T : XType u_1) extends TopCat.PrelocalPredicate T :
          Type (max u_1 u_2)

          Given a topological space X : TopCat and a type family T : X → Type, a P : LocalPredicate T consists of:

          • a family of predicates P.pred, one for each U : Opens X, of the form (Π x : U, T x) → Prop
          • a proof that if f : Π x : V, T x satisfies the predicate on V : Opens X, then the restriction of f to any open subset U also satisfies the predicate, and
          • a proof that given some f : Π x : U, T x, if for every x : U we can find an open set x ∈ V ≤ U so that the restriction of f to V satisfies the predicate, then f itself satisfies the predicate.
          Instances For
            def TopCat.continuousLocal (X : TopCat) (T : Type u_3) [TopologicalSpace T] :
            LocalPredicate fun (x : X) => T

            Continuity is a "local" predicate on functions to a fixed topological space T.

            Equations
              Instances For
                instance TopCat.inhabitedLocalPredicate (X : TopCat) (T : Type u_3) [TopologicalSpace T] :
                Inhabited (LocalPredicate fun (x : X) => T)

                Satisfying the inhabited linter.

                Equations

                  The conjunction of two prelocal predicates is prelocal.

                  Equations
                    Instances For
                      def TopCat.LocalPredicate.and {X : TopCat} {T : XType u_1} (P Q : LocalPredicate T) :

                      The conjunction of two prelocal predicates is prelocal.

                      Equations
                        Instances For
                          def TopCat.isSection {X : TopCat} {T : Type u_3} (p : TX) :
                          LocalPredicate fun (x : X) => T

                          The local predicate of being a partial section of a function.

                          Equations
                            Instances For

                              Given a P : PrelocalPredicate, we can always construct a LocalPredicate by asking that the condition from P holds locally near every point.

                              Equations
                                Instances For
                                  theorem TopCat.PrelocalPredicate.sheafifyOf {X : TopCat} {T : XType u_2} {P : PrelocalPredicate T} {U : TopologicalSpace.Opens X} {f : (x : U) → T x} (h : P.pred f) :
                                  theorem TopCat.PrelocalPredicate.sheafify_inductionOn {X : TopCat} {T : XType u_2} (P : PrelocalPredicate T) (op : {x : X} → T xT x) (hop : ∀ {U : TopologicalSpace.Opens X} {a : (x : U) → T x}, P.pred a∀ (p : U), ∃ (W : TopologicalSpace.Opens X) (i : W U), p W P.pred fun (x : W) => op (a (i x))) {U : TopologicalSpace.Opens X} {a : (x : U) → T x} (ha : P.sheafify.pred a) :
                                  P.sheafify.pred fun (x : U) => op (a x)

                                  For a unary operation (e.g. x ↦ -x) defined at each stalk, if a prelocal predicate is closed under the operation on each open set (possibly by refinement), then the sheafified predicate is also closed under the operation. See sheafify_inductionOn' for the version without refinement.

                                  theorem TopCat.PrelocalPredicate.sheafify_inductionOn' {X : TopCat} {T : XType u_2} (P : PrelocalPredicate T) (op : {x : X} → T xT x) (hop : ∀ {U : TopologicalSpace.Opens X} {a : (x : U) → T x}, P.pred aP.pred fun (x : U) => op (a x)) {U : TopologicalSpace.Opens X} {a : (x : U) → T x} (ha : P.sheafify.pred a) :
                                  P.sheafify.pred fun (x : U) => op (a x)

                                  For a unary operation (e.g. x ↦ -x) defined at each stalk, if a prelocal predicate is closed under the operation on each open set, then the sheafified predicate is also closed under the operation. See sheafify_inductionOn for the version with refinement.

                                  theorem TopCat.PrelocalPredicate.sheafify_inductionOn₂ {X : TopCat} {T₁ : XType u_2} {T₂ : XType u_3} {T₃ : XType u_4} (P₁ : PrelocalPredicate T₁) (P₂ : PrelocalPredicate T₂) (P₃ : PrelocalPredicate T₃) (op : {x : X} → T₁ xT₂ xT₃ x) (hop : ∀ {U V : TopologicalSpace.Opens X} {a : (x : U) → T₁ x} {b : (x : V) → T₂ x}, P₁.pred aP₂.pred b∀ (p : (UV)), ∃ (W : TopologicalSpace.Opens X) (ia : W U) (ib : W V), p W P₃.pred fun (x : W) => op (a (ia x)) (b (ib x))) {U : TopologicalSpace.Opens X} {a : (x : U) → T₁ x} {b : (x : U) → T₂ x} (ha : P₁.sheafify.pred a) (hb : P₂.sheafify.pred b) :
                                  P₃.sheafify.pred fun (x : U) => op (a x) (b x)

                                  For a binary operation (e.g. x ↦ y ↦ x + y) defined at each stalk, if a prelocal predicate is closed under the operation on each open set (possibly by refinement), then the sheafified predicate is also closed under the operation. See sheafify_inductionOn₂' for the version without refinement.

                                  theorem TopCat.PrelocalPredicate.sheafify_inductionOn₂' {X : TopCat} {T₁ : XType u_2} {T₂ : XType u_3} {T₃ : XType u_4} (P₁ : PrelocalPredicate T₁) (P₂ : PrelocalPredicate T₂) (P₃ : PrelocalPredicate T₃) (op : {x : X} → T₁ xT₂ xT₃ x) (hop : ∀ {U V : TopologicalSpace.Opens X} {a : (x : U) → T₁ x} {b : (x : V) → T₂ x}, P₁.pred aP₂.pred bP₃.pred fun (x : (UV)) => op (a x, ) (b x, )) {U : TopologicalSpace.Opens X} {a : (x : U) → T₁ x} {b : (x : U) → T₂ x} (ha : P₁.sheafify.pred a) (hb : P₂.sheafify.pred b) :
                                  P₃.sheafify.pred fun (x : U) => op (a x) (b x)

                                  For a binary operation (e.g. x ↦ y ↦ x + y) defined at each stalk, if a prelocal predicate is closed under the operation on each open set, then the sheafified predicate is also closed under the operation. See sheafify_inductionOn₂ for the version with refinement.

                                  def TopCat.subpresheafToTypes {X : TopCat} {T : XType u_1} (P : PrelocalPredicate T) :
                                  Presheaf (Type (max u_1 u_2)) X

                                  The subpresheaf of dependent functions on X satisfying the "pre-local" predicate P.

                                  Equations
                                    Instances For
                                      @[simp]
                                      theorem TopCat.subpresheafToTypes_map_coe {X : TopCat} {T : XType u_1} (P : PrelocalPredicate T) {x✝ x✝¹ : (TopologicalSpace.Opens X)ᵒᵖ} (i : x✝ x✝¹) (f : { f : (x : (Opposite.unop x✝)) → T x // P.pred f }) (x : (Opposite.unop x✝¹)) :
                                      ((subpresheafToTypes P).map i f) x = f (i.unop x)
                                      @[simp]
                                      theorem TopCat.subpresheafToTypes_obj {X : TopCat} {T : XType u_1} (P : PrelocalPredicate T) (U : (TopologicalSpace.Opens X)ᵒᵖ) :
                                      (subpresheafToTypes P).obj U = { f : (x : (Opposite.unop U)) → T x // P.pred f }

                                      The natural transformation including the subpresheaf of functions satisfying a local predicate into the presheaf of all functions.

                                      Equations
                                        Instances For

                                          The functions satisfying a local predicate satisfy the sheaf condition.

                                          def TopCat.subsheafToTypes {X : TopCat} {T : XType u_1} (P : LocalPredicate T) :
                                          Sheaf (Type (max u_2 u_1)) X

                                          The subsheaf of the sheaf of all dependently typed functions satisfying the local predicate P.

                                          Equations
                                            Instances For
                                              def TopCat.stalkToFiber {X : TopCat} {T : XType u_1} (P : LocalPredicate T) (x : X) :

                                              There is a canonical map from the stalk to the original fiber, given by evaluating sections.

                                              Equations
                                                Instances For
                                                  theorem TopCat.stalkToFiber_germ {X : TopCat} {T : XType u_1} (P : LocalPredicate T) (U : TopologicalSpace.Opens X) (x : X) (hx : x U) (f : (subsheafToTypes P).presheaf.obj (Opposite.op U)) :
                                                  stalkToFiber P x ((subsheafToTypes P).presheaf.germ U x hx f) = f x, hx
                                                  theorem TopCat.stalkToFiber_surjective {X : TopCat} {T : XType u_1} (P : LocalPredicate T) (x : X) (w : ∀ (t : T x), ∃ (U : TopologicalSpace.OpenNhds x) (f : (y : U.obj) → T y) (_ : P.pred f), f x, = t) :

                                                  The stalkToFiber map is surjective at x if every point in the fiber T x has an allowed section passing through it.

                                                  theorem TopCat.stalkToFiber_injective {X : TopCat} {T : XType u_1} (P : LocalPredicate T) (x : X) (w : ∀ (U V : TopologicalSpace.OpenNhds x) (fU : (y : U.obj) → T y), P.pred fU∀ (fV : (y : V.obj) → T y), P.pred fVfU x, = fV x, ∃ (W : TopologicalSpace.OpenNhds x) (iU : W U) (iV : W V), ∀ (w : W.obj), fU (iU w) = fV (iV w)) :

                                                  The stalkToFiber map is injective at x if any two allowed sections which agree at x agree on some neighborhood of x.

                                                  Some repackaging: the presheaf of functions satisfying continuousPrelocal is just the same thing as the presheaf of continuous functions.

                                                  Equations
                                                    Instances For
                                                      def TopCat.sheafToTop {X : TopCat} (T : TopCat) :
                                                      Sheaf (Type u_2) X

                                                      The sheaf of continuous functions on X with values in a space T.

                                                      Equations
                                                        Instances For