# mathlib3documentation

geometry.manifold.charted_space

# Charted spaces #

THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.

A smooth manifold is a topological space M locally modelled on a euclidean space (or a euclidean half-space for manifolds with boundaries, or an infinite dimensional vector space for more general notions of manifolds), i.e., the manifold is covered by open subsets on which there are local homeomorphisms (the charts) going to a model space H, and the changes of charts should be smooth maps.

In this file, we introduce a general framework describing these notions, where the model space is an arbitrary topological space. We avoid the word manifold, which should be reserved for the situation where the model space is a (subset of a) vector space, and use the terminology charted space instead.

If the changes of charts satisfy some additional property (for instance if they are smooth), then M inherits additional structure (it makes sense to talk about smooth manifolds). There are therefore two different ingredients in a charted space:

• the set of charts, which is data
• the fact that changes of charts belong to some group (in fact groupoid), which is additional Prop.

We separate these two parts in the definition: the charted space structure is just the set of charts, and then the different smoothness requirements (smooth manifold, orientable manifold, contact manifold, and so on) are additional properties of these charts. These properties are formalized through the notion of structure groupoid, i.e., a set of local homeomorphisms stable under composition and inverse, to which the change of coordinates should belong.

## Main definitions #

• structure_groupoid H : a subset of local homeomorphisms of H stable under composition, inverse and restriction (ex: local diffeos).
• continuous_groupoid H : the groupoid of all local homeomorphisms of H
• charted_space H M : charted space structure on M modelled on H, given by an atlas of local homeomorphisms from M to H whose sources cover M. This is a type class.
• has_groupoid M G : when G is a structure groupoid on H and M is a charted space modelled on H, require that all coordinate changes belong to G. This is a type class.
• atlas H M : when M is a charted space modelled on H, the atlas of this charted space structure, i.e., the set of charts.
• G.maximal_atlas M : when M is a charted space modelled on H and admitting G as a structure groupoid, one can consider all the local homeomorphisms from M to H such that changing coordinate from any chart to them belongs to G. This is a larger atlas, called the maximal atlas (for the groupoid G).
• structomorph G M M' : the type of diffeomorphisms between the charted spaces M and M' for the groupoid G. We avoid the word diffeomorphism, keeping it for the smooth category.

As a basic example, we give the instance instance charted_space_model_space (H : Type*) [topological_space H] : charted_space H H saying that a topological space is a charted space over itself, with the identity as unique chart. This charted space structure is compatible with any groupoid.

• pregroupoid H : a subset of local mas of H stable under composition and restriction, but not inverse (ex: smooth maps)
• groupoid_of_pregroupoid : construct a groupoid from a pregroupoid, by requiring that a map and its inverse both belong to the pregroupoid (ex: construct diffeos from smooth maps)
• chart_at H x is a preferred chart at x : M when M has a charted space structure modelled on H.
• G.compatible he he' states that, for any two charts e and e' in the atlas, the composition of e.symm and e' belongs to the groupoid G when M admits G as a structure groupoid.
• G.compatible_of_mem_maximal_atlas he he' states that, for any two charts e and e' in the maximal atlas associated to the groupoid G, the composition of e.symm and e' belongs to the G if M admits G as a structure groupoid.
• charted_space_core.to_charted_space: consider a space without a topology, but endowed with a set of charts (which are local equivs) for which the change of coordinates are local homeos. Then one can construct a topology on the space for which the charts become local homeos, defining a genuine charted space structure.

## Implementation notes #

The atlas in a charted space is not a maximal atlas in general: the notion of maximality depends on the groupoid one considers, and changing groupoids changes the maximal atlas. With the current formalization, it makes sense first to choose the atlas, and then to ask whether this precise atlas defines a smooth manifold, an orientable manifold, and so on. A consequence is that structomorphisms between M and M' do not induce a bijection between the atlases of M and M': the definition is only that, read in charts, the structomorphism locally belongs to the groupoid under consideration. (This is equivalent to inducing a bijection between elements of the maximal atlas). A consequence is that the invariance under structomorphisms of properties defined in terms of the atlas is not obvious in general, and could require some work in theory (amounting to the fact that these properties only depend on the maximal atlas, for instance). In practice, this does not create any real difficulty.

We use the letter H for the model space thinking of the case of manifolds with boundary, where the model space is a half space.

Manifolds are sometimes defined as topological spaces with an atlas of local diffeomorphisms, and sometimes as spaces with an atlas from which a topology is deduced. We use the former approach: otherwise, there would be an instance from manifolds to topological spaces, which means that any instance search for topological spaces would try to find manifold structures involving a yet unknown model space, leading to problems. However, we also introduce the latter approach, through a structure charted_space_core making it possible to construct a topology out of a set of local equivs with compatibility conditions (but we do not register it as an instance).

In the definition of a charted space, the model space is written as an explicit parameter as there can be several model spaces for a given topological space. For instance, a complex manifold (modelled over ℂ^n) will also be seen sometimes as a real manifold modelled over ℝ^(2n).

## Notations #

In the locale manifold, we denote the composition of local homeomorphisms with ≫ₕ, and the composition of local equivs with ≫.

### Structure groupoids #

One could add to the definition of a structure groupoid the fact that the restriction of an element of the groupoid to any open set still belongs to the groupoid. (This is in Kobayashi-Nomizu.) I am not sure I want this, for instance on H × E where E is a vector space, and the groupoid is made of functions respecting the fibers and linear in the fibers (so that a charted space over this groupoid is naturally a vector bundle) I prefer that the members of the groupoid are always defined on sets of the form s × E. There is a typeclass closed_under_restriction for groupoids which have the restriction property.

The only nontrivial requirement is locality: if a local homeomorphism belongs to the groupoid around each point in its domain of definition, then it belongs to the groupoid. Without this requirement, the composition of structomorphisms does not have to be a structomorphism. Note that this implies that a local homeomorphism with empty source belongs to any structure groupoid, as it trivially satisfies this condition.

There is also a technical point, related to the fact that a local homeomorphism is by definition a global map which is a homeomorphism when restricted to its source subset (and its values outside of the source are not relevant). Therefore, we also require that being a member of the groupoid only depends on the values on the source.

We use primes in the structure names as we will reformulate them below (without primes) using a has_mem instance, writing e ∈ G instead of e ∈ G.members.

structure structure_groupoid (H : Type u)  :

A structure groupoid is a set of local homeomorphisms of a topological space stable under composition and inverse. They appear in the definition of the smoothness class of a manifold.

Instances for structure_groupoid
@[protected, instance]
Equations
theorem structure_groupoid.trans {H : Type u} (G : structure_groupoid H) {e e' : H} (he : e G) (he' : e' G) :
e.trans e' G
theorem structure_groupoid.symm {H : Type u} (G : structure_groupoid H) {e : H} (he : e G) :
e.symm G
theorem structure_groupoid.locality {H : Type u} (G : structure_groupoid H) {e : H} (h : (x : H), ( (s : set H), x s e.restr s G)) :
e G
theorem structure_groupoid.eq_on_source {H : Type u} (G : structure_groupoid H) {e e' : H} (he : e G) (h : e' e) :
e' G
@[protected, instance]

Partial order on the set of groupoids, given by inclusion of the members of the groupoid

Equations
theorem structure_groupoid.le_iff {H : Type u} {G₁ G₂ : structure_groupoid H} :
G₁ G₂ (e : H), e G₁ e G₂
def id_groupoid (H : Type u)  :

The trivial groupoid, containing only the identity (and maps with empty source, as this is necessary from the definition)

Equations
@[protected, instance]

Every structure groupoid contains the identity groupoid

Equations
@[protected, instance]
Equations
structure pregroupoid (H : Type u_5)  :
Type u_5

To construct a groupoid, one may consider classes of local homeos such that both the function and its inverse have some property. If this property is stable under composition, one gets a groupoid. pregroupoid bundles the properties needed for this construction, with the groupoid of smooth functions with smooth inverses as an application.

Instances for pregroupoid
def pregroupoid.groupoid {H : Type u} (PG : pregroupoid H) :

Construct a groupoid of local homeos for which the map and its inverse have some property, from a pregroupoid asserting that this property is stable under composition.

Equations
theorem groupoid_of_pregroupoid_le {H : Type u} (PG₁ PG₂ : pregroupoid H) (h : (f : H H) (s : set H), PG₁.property f s PG₂.property f s) :
PG₁.groupoid PG₂.groupoid
theorem mem_pregroupoid_of_eq_on_source {H : Type u} (PG : pregroupoid H) {e e' : H} (he' : e e') (he : PG.property e e.to_local_equiv.source) :
@[reducible]
def continuous_pregroupoid (H : Type u_1)  :

The pregroupoid of all local maps on a topological space H

Equations
@[protected, instance]
def pregroupoid.inhabited (H : Type u_1)  :
Equations
def continuous_groupoid (H : Type u_1)  :

The groupoid of all local homeomorphisms on a topological space H

Equations
Instances for continuous_groupoid
@[protected, instance]

Every structure groupoid is contained in the groupoid of all local homeomorphisms

Equations
@[class]
structure closed_under_restriction {H : Type u} (G : structure_groupoid H) :
Prop

A groupoid is closed under restriction if it contains all restrictions of its element local homeomorphisms to open subsets of the source.

Instances of this typeclass
theorem closed_under_restriction' {H : Type u} {G : structure_groupoid H} {e : H} (he : e G) {s : set H} (hs : is_open s) :
e.restr s G
def id_restr_groupoid {H : Type u}  :

The trivial restriction-closed groupoid, containing only local homeomorphisms equivalent to the restriction of the identity to the various open subsets.

Equations
Instances for id_restr_groupoid
theorem id_restr_groupoid_mem {H : Type u} {s : set H} (hs : is_open s) :
@[protected, instance]

The trivial restriction-closed groupoid is indeed closed_under_restriction.

A groupoid is closed under restriction if and only if it contains the trivial restriction-closed groupoid.

@[protected, instance]

The groupoid of all local homeomorphisms on a topological space H is closed under restriction.

### Charted spaces #

theorem charted_space.ext {H : Type u_5} {_inst_1 : topological_space H} {M : Type u_6} {_inst_2 : topological_space M} (x y : M) (h : = )  :
x = y
theorem charted_space.ext_iff {H : Type u_5} {_inst_1 : topological_space H} {M : Type u_6} {_inst_2 : topological_space M} (x y : M) :
x = y
@[ext, class]
structure charted_space (H : Type u_5) (M : Type u_6)  :
Type (max u_5 u_6)
• atlas : set H)
• chart_at : M
• mem_chart_source : (x : M),
• chart_mem_atlas : (x : M),

A charted space is a topological space endowed with an atlas, i.e., a set of local homeomorphisms taking value in a model space H, called charts, such that the domains of the charts cover the whole space. We express the covering property by chosing for each x a member chart_at H x of the atlas containing x in its source: in the smooth case, this is convenient to construct the tangent bundle in an efficient way. The model space is written as an explicit parameter as there can be several model spaces for a given topological space. For instance, a complex manifold (modelled over ℂ^n) will also be seen sometimes as a real manifold over ℝ^(2n).

Instances of this typeclass
Instances of other typeclasses for charted_space
• charted_space.has_sizeof_inst
@[protected, instance]
def charted_space_self (H : Type u_1)  :

Any space is a charted_space modelled over itself, by just using the identity chart

Equations
@[simp]
theorem charted_space_self_atlas {H : Type u_1} {e : H} :
e

In the trivial charted_space structure of a space modelled over itself through the identity, the atlas members are just the identity

theorem chart_at_self_eq {H : Type u_1} {x : H} :

In the model space, chart_at is always the identity

theorem mem_chart_target (H : Type u) {M : Type u_2} [ M] (x : M) :
theorem chart_source_mem_nhds (H : Type u) {M : Type u_2} [ M] (x : M) :
theorem chart_target_mem_nhds (H : Type u) {M : Type u_2} [ M] (x : M) :
nhds ( x)
def achart (H : Type u) {M : Type u_2} [ M] (x : M) :
M)

achart H x is the chart at x, considered as an element of the atlas. Especially useful for working with basic_smooth_vector_bundle_core

Equations
theorem achart_def (H : Type u) {M : Type u_2} [ M] (x : M) :
x = , _⟩
@[simp]
theorem coe_achart (H : Type u) {M : Type u_2} [ M] (x : M) :
(achart H x) =
@[simp]
theorem achart_val (H : Type u) {M : Type u_2} [ M] (x : M) :
(achart H x).val =
theorem mem_achart_source (H : Type u) {M : Type u_2} [ M] (x : M) :
theorem charted_space.second_countable_of_countable_cover (H : Type u) {M : Type u_2} [ M] {s : set M} (hs : ( (x : M) (hx : x s), = set.univ) (hsc : s.countable) :
theorem charted_space.locally_compact (H : Type u) (M : Type u_2) [ M]  :

If a topological space admits an atlas with locally compact charts, then the space itself is locally compact.

theorem charted_space.locally_connected_space (H : Type u) (M : Type u_2) [ M]  :

If a topological space admits an atlas with locally connected charts, then the space itself is locally connected.

def charted_space.comp (H : Type u_1) (H' : Type u_2) (M : Type u_3) [ H'] [ M] :

If M is modelled on H' and H' is itself modelled on H, then we can consider M as being modelled on H.

Equations

For technical reasons we introduce two type tags:

• model_prod H H' is the same as H × H';
• model_pi H is the same as Π i, H i, where H : ι → Type* and ι is a finite type.

In both cases the reason is the same, so we explain it only in the case of the product. A charted space M with model H is a set of local charts from M to H covering the space. Every space is registered as a charted space over itself, using the only chart id, in manifold_model_space. You can also define a product of charted space M and M' (with model space H × H') by taking the products of the charts. Now, on H × H', there are two charted space structures with model space H × H' itself, the one coming from manifold_model_space, and the one coming from the product of the two manifold_model_space on each component. They are equal, but not defeq (because the product of id and id is not defeq to id), which is bad as we know. This expedient of renaming H × H' solves this problem.

def model_prod (H : Type u_1) (H' : Type u_2) :
Type (max u_1 u_2)

Same thing as H × H' We introduce it for technical reasons, see note [Manifold type tags].

Equations
• H' = (H × H')
Instances for model_prod
def model_pi {ι : Type u_1} (H : ι Type u_2) :
Type (max u_1 u_2)

Same thing as Π i, H i We introduce it for technical reasons, see note [Manifold type tags].

Equations
• = Π (i : ι), H i
Instances for model_pi
@[protected, instance]
def model_prod_inhabited {H : Type u} {H' : Type u_1} [inhabited H] [inhabited H'] :
Equations
@[protected, instance]
def model_prod.topological_space (H : Type u_1) (H' : Type u_2)  :
Equations
@[simp]
theorem model_prod_range_prod_id {H : Type u_1} {H' : Type u_2} {α : Type u_3} (f : H α) :
set.range (λ (p : H'), (f p.fst, p.snd)) =
@[protected, instance]
def model_pi_inhabited {ι : Type u_5} {Hi : ι Type u_6} [Π (i : ι), inhabited (Hi i)] :
Equations
@[protected, instance]
def model_pi.topological_space {ι : Type u_5} {Hi : ι Type u_6} [Π (i : ι), topological_space (Hi i)] :
Equations
@[protected, instance]
def prod_charted_space (H : Type u_1) (M : Type u_2) [ M] (H' : Type u_3) (M' : Type u_4) [ M'] :
charted_space H') (M × M')

The product of two charted spaces is naturally a charted space, with the canonical construction of the atlas of product maps.

Equations
@[simp]
theorem prod_charted_space_chart_at {H : Type u} {H' : Type u_1} {M : Type u_2} {M' : Type u_3} [ M] [ M'] {x : M × M'} :
x = .prod x.snd)
theorem charted_space_self_prod {H : Type u} {H' : Type u_1}  :
H' H' = charted_space_self (H × H')
@[protected, instance]
def pi_charted_space {ι : Type u_1} [fintype ι] (H : ι Type u_2) [Π (i : ι), topological_space (H i)] (M : ι Type u_3) [Π (i : ι), topological_space (M i)] [Π (i : ι), charted_space (H i) (M i)] :
(Π (i : ι), M i)

The product of a finite family of charted spaces is naturally a charted space, with the canonical construction of the atlas of finite product maps.

Equations
@[simp]
theorem pi_charted_space_chart_at {ι : Type u_1} [fintype ι] (H : ι Type u_2) [Π (i : ι), topological_space (H i)] (M : ι Type u_3) [Π (i : ι), topological_space (M i)] [Π (i : ι), charted_space (H i) (M i)] (f : Π (i : ι), M i) :
= local_homeomorph.pi (λ (i : ι), (f i))

### Constructing a topology from an atlas #

@[nolint]
structure charted_space_core (H : Type u_5) (M : Type u_6) :
Type (max u_5 u_6)

Sometimes, one may want to construct a charted space structure on a space which does not yet have a topological structure, where the topology would come from the charts. For this, one needs charts that are only local equivs, and continuity properties for their composition. This is formalised in charted_space_core.

Instances for charted_space_core
• charted_space_core.has_sizeof_inst
@[protected]
def charted_space_core.to_topological_space {H : Type u} {M : Type u_2} (c : M) :

Topology generated by a set of charts on a Type.

Equations
theorem charted_space_core.open_source' {H : Type u} {M : Type u_2} (c : M) {e : H} (he : e c.atlas) :
theorem charted_space_core.open_target {H : Type u} {M : Type u_2} (c : M) {e : H} (he : e c.atlas) :
@[protected]
def charted_space_core.local_homeomorph {H : Type u} {M : Type u_2} (c : M) (e : H) (he : e c.atlas) :

An element of the atlas in a charted space without topology becomes a local homeomorphism for the topology constructed from this atlas. The local_homeomorph version is given in this definition.

Equations
def charted_space_core.to_charted_space {H : Type u} {M : Type u_2} (c : M) :

Given a charted space without topology, endow it with a genuine charted space structure with respect to the topology constructed from the atlas.

Equations

### Charted space with a given structure groupoid #

@[class]
structure has_groupoid {H : Type u_5} (M : Type u_6) [ M] (G : structure_groupoid H) :
Prop

A charted space has an atlas in a groupoid G if the change of coordinates belong to the groupoid

Instances of this typeclass
theorem structure_groupoid.compatible {H : Type u_1} (G : structure_groupoid H) {M : Type u_2} [ M] [ G] {e e' : H} (he : e ) (he' : e' ) :
e.symm.trans e' G

Reformulate in the structure_groupoid namespace the compatibility condition of charts in a charted space admitting a structure groupoid, to make it more easily accessible with dot notation.

theorem has_groupoid_of_le {H : Type u} {M : Type u_2} [ M] {G₁ G₂ : structure_groupoid H} (h : G₁) (hle : G₁ G₂) :
G₂
theorem has_groupoid_of_pregroupoid {H : Type u} {M : Type u_2} [ M] (PG : pregroupoid H) (h : {e e' : H}, e e' PG.property (e.symm.trans e') (e.symm.trans e').to_local_equiv.source) :
@[protected, instance]
def has_groupoid_model_space (H : Type u_1) (G : structure_groupoid H) :
G

The trivial charted space structure on the model space is compatible with any groupoid

@[protected, instance]
def has_groupoid_continuous_groupoid {H : Type u} {M : Type u_2} [ M] :

Any charted space structure is compatible with the groupoid of all local homeomorphisms

def structure_groupoid.maximal_atlas {H : Type u} (M : Type u_2) [ M] (G : structure_groupoid H) :
set H)

Given a charted space admitting a structure groupoid, the maximal atlas associated to this structure groupoid is the set of all local charts that are compatible with the atlas, i.e., such that changing coordinates with an atlas member gives an element of the groupoid.

Equations
theorem structure_groupoid.subset_maximal_atlas {H : Type u} {M : Type u_2} [ M] (G : structure_groupoid H) [ G] :

The elements of the atlas belong to the maximal atlas for any structure groupoid

theorem structure_groupoid.chart_mem_maximal_atlas {H : Type u} {M : Type u_2} [ M] (G : structure_groupoid H) [ G] (x : M) :
theorem mem_maximal_atlas_iff {H : Type u} {M : Type u_2} [ M] {G : structure_groupoid H} {e : H} :
(e' : H), e' e.symm.trans e' G e'.symm.trans e G
theorem structure_groupoid.compatible_of_mem_maximal_atlas {H : Type u} {M : Type u_2} [ M] {G : structure_groupoid H} {e e' : H} (he : e ) (he' : e' ) :
e.symm.trans e' G

Changing coordinates between two elements of the maximal atlas gives rise to an element of the structure groupoid.

In the model space, the identity is in any maximal atlas.

In the model space, any element of the groupoid is in the maximal atlas.

If a single local homeomorphism e from a space α into H has source covering the whole space α, then that local homeomorphism induces an H-charted space structure on α. (This condition is equivalent to e being an open embedding of α into H; see open_embedding.singleton_charted_space.)

Equations
@[simp]
theorem local_homeomorph.singleton_charted_space_chart_at_eq {H : Type u} {α : Type u_5} (e : H) (h : e.to_local_equiv.source = set.univ) {x : α} :
theorem local_homeomorph.singleton_charted_space_mem_atlas_eq {H : Type u} {α : Type u_5} (e : H) (h : e.to_local_equiv.source = set.univ) (e' : H) (h' : e' ) :
e' = e
theorem local_homeomorph.singleton_has_groupoid {H : Type u} {α : Type u_5} (e : H) (h : e.to_local_equiv.source = set.univ) (G : structure_groupoid H)  :
G

Given a local homeomorphism e from a space α into H, if its source covers the whole space α, then the induced charted space structure on α is has_groupoid G for any structure groupoid G which is closed under restrictions.

noncomputable def open_embedding.singleton_charted_space {H : Type u} {α : Type u_5} [nonempty α] {f : α H} (h : open_embedding f) :

An open embedding of α into H induces an H-charted space structure on α. See local_homeomorph.singleton_charted_space

Equations
theorem open_embedding.singleton_charted_space_chart_at_eq {H : Type u} {α : Type u_5} [nonempty α] {f : α H} (h : open_embedding f) {x : α} :
= f
theorem open_embedding.singleton_has_groupoid {H : Type u} {α : Type u_5} [nonempty α] {f : α H} (h : open_embedding f) (G : structure_groupoid H)  :
G
@[protected, instance]
noncomputable def topological_space.opens.charted_space {H : Type u} {M : Type u_2} [ M] (s : topological_space.opens M) :

An open subset of a charted space is naturally a charted space.

Equations
@[protected, instance]
def topological_space.opens.has_groupoid {H : Type u} {M : Type u_2} [ M] (G : structure_groupoid H) [ G] (s : topological_space.opens M)  :

If a groupoid G is closed_under_restriction, then an open subset of a space which is has_groupoid G is naturally has_groupoid G.

### Structomorphisms #

@[nolint]
structure structomorph {H : Type u} (G : structure_groupoid H) (M : Type u_5) (M' : Type u_6) [ M] [ M'] :
Type (max u_5 u_6)

A G-diffeomorphism between two charted spaces is a homeomorphism which, when read in the charts, belongs to G. We avoid the word diffeomorph as it is too related to the smooth category, and use structomorph instead.

Instances for structomorph
• structomorph.has_sizeof_inst
def structomorph.refl {H : Type u} {G : structure_groupoid H} (M : Type u_1) [ M] [ G] :
M M

The identity is a diffeomorphism of any charted space, for any groupoid.

Equations
def structomorph.symm {H : Type u} {M : Type u_2} {M' : Type u_3} [ M] {G : structure_groupoid H} [ M'] (e : M M') :
M' M

The inverse of a structomorphism is a structomorphism

Equations
def structomorph.trans {H : Type u} {M : Type u_2} {M' : Type u_3} {M'' : Type u_4} [ M] [topological_space M''] {G : structure_groupoid H} [ M'] [ M''] (e : M M') (e' : M' M'') :
M M''

The composition of structomorphisms is a structomorphism

Equations