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
TopCat.sheafToTop
: continuous functions into a topological space form a sheaf
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.
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 eachU : Opens X
, of the form(Π x : U, T x) → Prop
- a proof that if
f : Π x : V, T x
satisfies the predicate onV : Opens X
, then the restriction off
to any open subsetU
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 f → self.pred fun (x : ↥U) => f ((fun (x : ↥U) => ⟨↑x, ⋯⟩) x)
The underlying predicate should be invariant under restriction
Instances For
The underlying predicate should be invariant under restriction
Continuity is a "prelocal" predicate on functions to a fixed topological space T
.
Equations
- X.continuousPrelocal T = { pred := fun {x : TopologicalSpace.Opens ↑X} (f : ↥x → ↑T) => Continuous f, res := ⋯ }
Instances For
Satisfying the inhabited linter.
Equations
- X.inhabitedPrelocalPredicate T = { default := X.continuousPrelocal T }
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 eachU : Opens X
, of the form(Π x : U, T x) → Prop
- a proof that if
f : Π x : V, T x
satisfies the predicate onV : Opens X
, then the restriction off
to any open subsetU
also satisfies the predicate, and - a proof that given some
f : Π x : U, T x
, if for everyx : U
we can find an open setx ∈ V ≤ U
so that the restriction off
toV
satisfies the predicate, thenf
itself satisfies the predicate.
- pred : {U : TopologicalSpace.Opens ↑X} → ((x : ↥U) → T ↑x) → Prop
- res : ∀ {U V : TopologicalSpace.Opens ↑X} (i : U ⟶ V) (f : (x : ↥V) → T ↑x), self.pred f → self.pred fun (x : ↥U) => f ((fun (x : ↥U) => ⟨↑x, ⋯⟩) x)
- locality : ∀ {U : TopologicalSpace.Opens ↑X} (f : (x : ↥U) → T ↑x), (∀ (x : ↥U), ∃ (V : TopologicalSpace.Opens ↑X) (_ : ↑x ∈ V) (i : V ⟶ U), self.pred fun (x : ↥V) => f ((fun (x : ↥V) => ⟨↑x, ⋯⟩) x)) → self.pred f
A local predicate must be local --- provided that it is locally satisfied, it is also globally satisfied
Instances For
A local predicate must be local --- provided that it is locally satisfied, it is also globally satisfied
Continuity is a "local" predicate on functions to a fixed topological space T
.
Equations
- X.continuousLocal T = let __src := X.continuousPrelocal T; { toPrelocalPredicate := __src, locality := ⋯ }
Instances For
Satisfying the inhabited linter.
Equations
- X.inhabitedLocalPredicate T = { default := X.continuousLocal T }
Given a P : PrelocalPredicate
, we can always construct a LocalPredicate
by asking that the condition from P
holds locally near every point.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The subpresheaf of dependent functions on X
satisfying the "pre-local" predicate P
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The natural transformation including the subpresheaf of functions satisfying a local predicate into the presheaf of all functions.
Equations
- TopCat.subpresheafToTypes.subtype P = { app := fun (U : (TopologicalSpace.Opens ↑X)ᵒᵖ) (f : (TopCat.subpresheafToTypes P).obj U) => ↑f, naturality := ⋯ }
Instances For
The functions satisfying a local predicate satisfy the sheaf condition.
The subsheaf of the sheaf of all dependently typed functions satisfying the local predicate P
.
Equations
- TopCat.subsheafToTypes P = { val := TopCat.subpresheafToTypes P.toPrelocalPredicate, cond := ⋯ }
Instances For
There is a canonical map from the stalk to the original fiber, given by evaluating sections.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The stalkToFiber
map is surjective at x
if
every point in the fiber T x
has an allowed section passing through it.
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
- One or more equations did not get rendered due to their size.
Instances For
The sheaf of continuous functions on X
with values in a space T
.
Equations
- TopCat.sheafToTop T = { val := X.presheafToTop T, cond := ⋯ }