forked from leanprover-community/mathlib4
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLocalSourceTargetProperty.lean
More file actions
248 lines (208 loc) · 12.9 KB
/
Copy pathLocalSourceTargetProperty.lean
File metadata and controls
248 lines (208 loc) · 12.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/-
Copyright (c) 2025 Michael Rothgang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Michael Rothgang
-/
module
public import Mathlib.Geometry.Manifold.IsManifold.Basic
/-! # Local properties of smooth functions which depend on both the source and target
In this file, we consider local properties of functions between manifolds, which depend on both the
source and the target: more precisely, properties `P` of functions `f : M → N` such that
`f` has property `P` if and only if there is a suitable pair of charts on `M` and `N`, respectively,
such that `f` read in these charts has a particular form.
The motivating examples of this general description are immersions and submersions:
`f : M → N` is an immersion at `x` iff there are charts `φ` and `ψ` of `M` and `N` around `x` and
`f x`, respectively, such that in these charts, `f` looks like `u ↦ (u, 0)`. Similarly, `f` is a
submersion at `x` iff it looks like a projection `(u, v) ↦ u` in suitable charts near `x` and `f x`.
Studying such local properties allows proving several lemmas about immersions and submersions
only once. In `IsImmersionEmbedding.lean`, we prove that being an immersion at `x` is indeed a
local property of this form.
## Main definitions and results
* `Manifold.LocalSourceTargetPropertyAt` captures a local property of the above form:
for each `f : M → N`, and pair of charts `φ` of `M` and `ψ` of `N`, the local property is either
satisfied or not.
We ask that the property be stable under congruence and under restriction of `φ`.
* `Manifold.LiftSourceTargetPropertyAt f x P`, where `P` is a `LocalSourceTargetPropertyAt`,
defines a local property of functions of the above shape:
`f` has this property at `x` if there exist charts `φ` and `ψ` such that `P f φ ψ` holds.
* `Manifold.LiftSourceTargetPropertyAt.congr_of_eventuallyEq`: if `f` has property `P` at `x`
and `g` equals `f` near `x`, then `g` also has property `P` at `x`.
* `IsOpen.liftSourceTargetPropertyAt`: the set of points at which `LiftSourceTargetPropertyAt`
holds is open
-/
public section
open scoped Manifold Topology ContDiff
open Function Set
variable {𝕜 E E' F F' H H' G G' : Type*} [NontriviallyNormedField 𝕜]
[NormedAddCommGroup E] [NormedSpace 𝕜 E] [NormedAddCommGroup E'] [NormedSpace 𝕜 E']
[NormedAddCommGroup F] [NormedSpace 𝕜 F] [NormedAddCommGroup F'] [NormedSpace 𝕜 F']
[TopologicalSpace H] [TopologicalSpace H'] [TopologicalSpace G] [TopologicalSpace G']
{I : ModelWithCorners 𝕜 E H} {I' : ModelWithCorners 𝕜 E' H'}
{J : ModelWithCorners 𝕜 F G} {J' : ModelWithCorners 𝕜 F' G'}
{M M' N N' : Type*} [TopologicalSpace M] [ChartedSpace H M]
[TopologicalSpace M'] [ChartedSpace H' M']
[TopologicalSpace N] [ChartedSpace G N] [TopologicalSpace N'] [ChartedSpace G' N']
{n : ℕ∞ω}
namespace Manifold
/-- Structure recording good behaviour of a property of functions `M → N` w.r.t. compatible
choices of both a chart on `M` and `N`. Currently, we ask for the property to be stable under
restriction of the domain chart, and local in the target.
Motivating examples are immersions and submersions of smooth manifolds. -/
structure IsLocalSourceTargetProperty
(P : (M → N) → OpenPartialHomeomorph M H → OpenPartialHomeomorph N G → Prop) : Prop where
mono_source : ∀ {f : M → N}, ∀ {φ : OpenPartialHomeomorph M H}, ∀ {ψ : OpenPartialHomeomorph N G},
∀ {s : Set M}, IsOpen s → P f φ ψ → P f (φ.restr s) ψ
-- Note: the analogous `mono_target` statement is true for both immersions and submersions.
-- If and when a future lemma requires it, add this here.
congr : ∀ {f g : M → N}, ∀ {φ : OpenPartialHomeomorph M H}, ∀ {ψ : OpenPartialHomeomorph N G},
EqOn f g φ.source → P f φ ψ → P g φ ψ
variable (I J n) in
/-- Data witnessing the fact that `f` has local property `P` at `x` -/
structure LocalPresentationAt (f : M → N) (x : M)
(P : (M → N) → OpenPartialHomeomorph M H → OpenPartialHomeomorph N G → Prop) where
/-- A choice of chart on the domain `M` of the local property `P` of `f` at `x`:
w.r.t. this chart and `codChart`, `f` has the local property `P` at `x`. -/
domChart : OpenPartialHomeomorph M H
/-- A choice of chart on the target `N` of the local property `P` of `f` at `x`:
w.r.t. this chart and `domChart`, `f` has the local property `P` at `x`. -/
codChart : OpenPartialHomeomorph N G
mem_domChart_source : x ∈ domChart.source
mem_codChart_source : f x ∈ codChart.source
domChart_mem_maximalAtlas : domChart ∈ IsManifold.maximalAtlas I n M
codChart_mem_maximalAtlas : codChart ∈ IsManifold.maximalAtlas J n N
source_subset_preimage_source : domChart.source ⊆ f ⁻¹' codChart.source
property : P f domChart codChart
variable (I J n) in
/-- The induced property by a local property `P`: it is satisfied for `f` at `x` iff there exist
charts `φ` and `ψ` of `M` and `N` around `x` and `f x`, respectively, such that `f` satisfies `P`
w.r.t. `φ` and `ψ`.
The motivating examples are smooth immersions and submersions: the corresponding condition is that
`f` look like the inclusion `u ↦ (u, 0)` (resp. a projection `(u, v) ↦ u`)
in the charts `φ` and `ψ`.
-/
@[expose]
def LiftSourceTargetPropertyAt (f : M → N) (x : M)
(P : (M → N) → OpenPartialHomeomorph M H → OpenPartialHomeomorph N G → Prop) : Prop :=
Nonempty (LocalPresentationAt I J n f x P)
namespace LocalPresentationAt
variable {f g : M → N} {x : M}
{P : (M → N) → OpenPartialHomeomorph M H → OpenPartialHomeomorph N G → Prop}
lemma mapsto_domChart_source_codChart_source (h : LocalPresentationAt I J n f x P) :
MapsTo f h.domChart.source h.codChart.source :=
h.source_subset_preimage_source
end LocalPresentationAt
namespace LiftSourceTargetPropertyAt
variable {f g : M → N} {x : M}
{P : (M → N) → OpenPartialHomeomorph M H → OpenPartialHomeomorph N G → Prop}
/-- A choice of charts witnessing the local property `P` of `f` at `x`. -/
noncomputable def localPresentationAt (h : LiftSourceTargetPropertyAt I J n f x P) :
LocalPresentationAt I J n f x P :=
Classical.choice h
/-- A choice of chart on the domain `M` of a local property of `f` at `x`:
w.r.t. this chart and `h.codChart`, `f` has the local property `P` at `x`.
The particular chart is arbitrary, but this choice matches the witness given by `h.codChart`. -/
noncomputable def domChart (h : LiftSourceTargetPropertyAt I J n f x P) :
OpenPartialHomeomorph M H :=
h.localPresentationAt.domChart
/-- A choice of chart on the co-domain `N` of a local property of `f` at `x`:
w.r.t. this chart and `h.domChart`, `f` has the local property `P` at `x`
The particular chart is arbitrary, but this choice matches the witness given by `h.domChart`. -/
noncomputable def codChart (h : LiftSourceTargetPropertyAt I J n f x P) :
OpenPartialHomeomorph N G :=
h.localPresentationAt.codChart
lemma mem_domChart_source (h : LiftSourceTargetPropertyAt I J n f x P) :
x ∈ h.domChart.source :=
h.localPresentationAt.mem_domChart_source
lemma mem_codChart_source (h : LiftSourceTargetPropertyAt I J n f x P) :
f x ∈ h.codChart.source :=
h.localPresentationAt.mem_codChart_source
lemma domChart_mem_maximalAtlas (h : LiftSourceTargetPropertyAt I J n f x P) :
h.domChart ∈ IsManifold.maximalAtlas I n M :=
h.localPresentationAt.domChart_mem_maximalAtlas
lemma codChart_mem_maximalAtlas (h : LiftSourceTargetPropertyAt I J n f x P) :
h.codChart ∈ IsManifold.maximalAtlas J n N :=
h.localPresentationAt.codChart_mem_maximalAtlas
lemma source_subset_preimage_source (h : LiftSourceTargetPropertyAt I J n f x P) :
h.domChart.source ⊆ f ⁻¹' h.codChart.source :=
h.localPresentationAt.source_subset_preimage_source
lemma property (h : LiftSourceTargetPropertyAt I J n f x P) : P f h.domChart h.codChart :=
h.localPresentationAt.property
omit [ChartedSpace H M] [ChartedSpace G N] in
lemma congr_iff (hP : IsLocalSourceTargetProperty P) {f g : M → N}
{φ : OpenPartialHomeomorph M H} {ψ : OpenPartialHomeomorph N G} (hfg : EqOn f g φ.source) :
P f φ ψ ↔ P g φ ψ :=
⟨hP.congr hfg, hP.congr hfg.symm⟩
/-- If `P` is a local property, by monotonicity w.r.t. restricting `domChart`,
if `f` is continuous at `x`, to prove `LiftSourceTargetPropertyAt I I' n f x P`
we need not check the condition `f '' domChart.source ⊆ codChart.source`. -/
lemma mk_of_continuousAt (hf : ContinuousAt f x)
(hP : IsLocalSourceTargetProperty P)
(domChart : OpenPartialHomeomorph M H) (codChart : OpenPartialHomeomorph N G)
(hx : x ∈ domChart.source) (hfx : f x ∈ codChart.source)
(hdomChart : domChart ∈ IsManifold.maximalAtlas I n M)
(hcodChart : codChart ∈ IsManifold.maximalAtlas J n N)
(hfP : P f domChart codChart) : LiftSourceTargetPropertyAt I J n f x P := by
obtain ⟨s, hs, hsopen, hxs⟩ := mem_nhds_iff.mp <|
hf.preimage_mem_nhds (codChart.open_source.mem_nhds hfx)
exact ⟨domChart.restr s, codChart, by grind, hfx,
restr_mem_maximalAtlas (contDiffGroupoid n I) hdomChart hsopen, hcodChart, by grind,
hP.mono_source hsopen hfP⟩
/-- If `P` is monotone w.r.t. restricting `domChart` and closed under congruence,
if `f` has property `P` at `x` and `f` and `g` are eventually equal near `x`,
then `g` has property `P` at `x`. -/
lemma congr_of_eventuallyEq (hP : IsLocalSourceTargetProperty P)
(hf : LiftSourceTargetPropertyAt I J n f x P)
(h' : f =ᶠ[nhds x] g) : LiftSourceTargetPropertyAt I J n g x P := by
obtain ⟨s', hxs', hfg⟩ := h'.exists_mem
obtain ⟨s, hss', hs, hxs⟩ := mem_nhds_iff.mp hxs'
refine ⟨hf.domChart.restr s, hf.codChart, ?_, ?_, ?_, hf.codChart_mem_maximalAtlas, ?_, ?_⟩
· simpa using ⟨mem_domChart_source hf, by rwa [interior_eq_iff_isOpen.mpr hs]⟩
· exact hfg (mem_of_mem_nhds hxs') ▸ mem_codChart_source hf
· exact restr_mem_maximalAtlas _ hf.domChart_mem_maximalAtlas hs
· trans s' ∩ f ⁻¹' hf.codChart.source
· apply subset_inter
· exact Subset.trans (by simp [interior_eq_iff_isOpen.mpr hs]) hss'
· exact Subset.trans (by simp) hf.source_subset_preimage_source
· rw [hfg.inter_preimage_eq]; exact inter_subset_right
· exact hP.congr (hfg.mono hss' |>.mono (by grind)) <| hP.mono_source hs hf.property
/-- If `P` is monotone w.r.t. restricting `domChart` and closed under congruence,
and `f` and `g` are eventually equal near `x`,
then `f` has property `P` at `x` if and only if `g` has property `P` at `x`. -/
lemma congr_iff_of_eventuallyEq (hP : IsLocalSourceTargetProperty P) (h' : f =ᶠ[nhds x] g) :
LiftSourceTargetPropertyAt I J n f x P ↔ LiftSourceTargetPropertyAt I J n g x P :=
⟨fun hf ↦ hf.congr_of_eventuallyEq hP h', fun hg ↦ hg.congr_of_eventuallyEq hP h'.symm⟩
/- The set of points where `LiftSourceTargetPropertyAt` holds is open. -/
lemma _root_.IsOpen.liftSourceTargetPropertyAt :
IsOpen {x | LiftSourceTargetPropertyAt I J n g x P} := by
rw [isOpen_iff_forall_mem_open]
intro x hx
-- Suppose the lifted property `P` holds at `x`:
-- choose slice charts `φ` near `x` and `ψ` near `f x` s.t. `P f φ ψ` holds.
-- Then the same charts witness that `P f φ ψ` holds at any `y ∈ φ.source`.
refine ⟨hx.domChart.source, fun y hy ↦ ?_, hx.domChart.open_source, hx.mem_domChart_source⟩
exact ⟨hx.domChart, hx.codChart, hy, hx.source_subset_preimage_source hy,
hx.domChart_mem_maximalAtlas, hx.codChart_mem_maximalAtlas, hx.source_subset_preimage_source,
hx.property⟩
lemma prodMap [IsManifold I n M] [IsManifold I' n M'] [IsManifold J n N] [IsManifold J' n N']
{Q : (M' → N') → OpenPartialHomeomorph M' H' → OpenPartialHomeomorph N' G' → Prop}
{R : ((M × M') → (N × N')) → OpenPartialHomeomorph (M × M') (H × H') →
OpenPartialHomeomorph (N × N') (G × G') → Prop}
(hf : LiftSourceTargetPropertyAt I J n f x P) {g : M' → N'} {x' : M'}
(hg : LiftSourceTargetPropertyAt I' J' n g x' Q)
(h : ∀ {f : M → N}, ∀ {φ₁ : OpenPartialHomeomorph M H}, ∀ {ψ₁ : OpenPartialHomeomorph N G},
∀ {g : M' → N'}, ∀ {φ₂ : OpenPartialHomeomorph M' H'}, ∀ {ψ₂ : OpenPartialHomeomorph N' G'},
P f φ₁ ψ₁ → Q g φ₂ ψ₂ → R (Prod.map f g) (φ₁.prod φ₂) (ψ₁.prod ψ₂)) :
LiftSourceTargetPropertyAt (I.prod I') (J.prod J') n (Prod.map f g) (x, x') R := by
use hf.domChart.prod hg.domChart, hf.codChart.prod hg.codChart
· simp [hf.mem_domChart_source, hg.mem_domChart_source]
· simp [mem_codChart_source hf, mem_codChart_source hg]
· exact IsManifold.mem_maximalAtlas_prod
(domChart_mem_maximalAtlas hf) (domChart_mem_maximalAtlas hg)
· apply IsManifold.mem_maximalAtlas_prod
(codChart_mem_maximalAtlas hf) (codChart_mem_maximalAtlas hg)
· simp only [OpenPartialHomeomorph.prod_toPartialHomeomorph, PartialEquiv.prod_source,
preimage_prod_map_prod]
exact prod_mono hf.source_subset_preimage_source hg.source_subset_preimage_source
· exact h hf.property hg.property
end LiftSourceTargetPropertyAt
end Manifold