Skip to content

Commit 2ad02e6

Browse files
committed
feat: weaken differentiability assumptions of manifolds (#22804)
Given our definitions, many natural maps between manifolds are `C^n` even when the manifolds are just `C^1`, because they are expressed in terms of the canonical charts. This PR takes advantage of this to weaken several assumptions on manifolds from `C^n` to `C^1`.
1 parent 79c27b3 commit 2ad02e6

File tree

5 files changed

+71
-45
lines changed

5 files changed

+71
-45
lines changed

Mathlib/Geometry/Manifold/ContMDiff/Atlas.lean

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,12 @@ theorem contMDiffAt_extChartAt' {x' : M} (h : x' ∈ (chartAt H x).source) :
7878
ContMDiffAt I 𝓘(𝕜, E) n (extChartAt I x) x' :=
7979
contMDiffAt_extend (chart_mem_maximalAtlas x) h
8080

81-
theorem contMDiffAt_extChartAt : ContMDiffAt I 𝓘(𝕜, E) n (extChartAt I x) x :=
82-
contMDiffAt_extChartAt' <| mem_chart_source H x
81+
omit [IsManifold I n M] in
82+
theorem contMDiffAt_extChartAt : ContMDiffAt I 𝓘(𝕜, E) n (extChartAt I x) x := by
83+
rw [contMDiffAt_iff_source]
84+
apply contMDiffWithinAt_id.congr_of_eventuallyEq_of_mem _ (by simp)
85+
filter_upwards [extChartAt_target_mem_nhdsWithin x] with y hy
86+
exact PartialEquiv.right_inv (extChartAt I x) hy
8387

8488
theorem contMDiffOn_extChartAt : ContMDiffOn I 𝓘(𝕜, E) n (extChartAt I x) (chartAt H x).source :=
8589
fun _x' hx' => (contMDiffAt_extChartAt' hx').contMDiffWithinAt
@@ -109,6 +113,25 @@ theorem contMDiffWithinAt_extChartAt_symm_range
109113
(contMDiffWithinAt_extChartAt_symm_target x hy).mono_of_mem_nhdsWithin
110114
(extChartAt_target_mem_nhdsWithin_of_mem hy)
111115

116+
omit [IsManifold I n M] in
117+
theorem contMDiffWithinAt_extChartAt_symm_target_self (x : M) :
118+
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (extChartAt I x).target
119+
(extChartAt I x x) := by
120+
rw [contMDiffWithinAt_iff_target]
121+
constructor
122+
· apply ContinuousAt.continuousWithinAt
123+
apply ContinuousAt.comp _ I.continuousAt_symm
124+
exact (chartAt H x).symm.continuousAt (by simp)
125+
· apply contMDiffWithinAt_id.congr_of_mem (fun y hy ↦ ?_) (by simp)
126+
convert PartialEquiv.right_inv (extChartAt I x) hy
127+
simp
128+
129+
omit [IsManifold I n M] in
130+
theorem contMDiffWithinAt_extChartAt_symm_range_self (x : M) :
131+
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (range I) (extChartAt I x x) :=
132+
(contMDiffWithinAt_extChartAt_symm_target_self x).mono_of_mem_nhdsWithin
133+
(extChartAt_target_mem_nhdsWithin x)
134+
112135
/-- An element of `contDiffGroupoid n I` is `C^n`. -/
113136
theorem contMDiffOn_of_mem_contDiffGroupoid {e' : PartialHomeomorph H H}
114137
(h : e' ∈ contDiffGroupoid n I) : ContMDiffOn I I n e' e'.source :=

Mathlib/Geometry/Manifold/ContMDiff/Defs.lean

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,45 @@ theorem contMDiffAt_iff_target {x : M} :
306306

307307
@[deprecated (since := "2024-11-20")] alias smoothAt_iff_target := contMDiffAt_iff_target
308308

309+
/-- One can reformulate being `Cⁿ` within a set at a point as being `Cⁿ` in the source space when
310+
composing with the extended chart. -/
311+
theorem contMDiffWithinAt_iff_source :
312+
ContMDiffWithinAt I I' n f s x ↔
313+
ContMDiffWithinAt 𝓘(𝕜, E) I' n (f ∘ (extChartAt I x).symm)
314+
((extChartAt I x).symm ⁻¹' s ∩ range I) (extChartAt I x x) := by
315+
simp_rw [ContMDiffWithinAt, liftPropWithinAt_iff']
316+
have : ContinuousWithinAt f s x
317+
↔ ContinuousWithinAt (f ∘ ↑(extChartAt I x).symm) (↑(extChartAt I x).symm ⁻¹' s ∩ range ↑I)
318+
(extChartAt I x x) := by
319+
refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
320+
· apply h.comp_of_eq
321+
· exact (continuousAt_extChartAt_symm x).continuousWithinAt
322+
· exact (mapsTo_preimage _ _).mono_left inter_subset_left
323+
· exact extChartAt_to_inv x
324+
· rw [← continuousWithinAt_inter (extChartAt_source_mem_nhds (I := I) x)]
325+
have : ContinuousWithinAt ((f ∘ ↑(extChartAt I x).symm) ∘ ↑(extChartAt I x))
326+
(s ∩ (extChartAt I x).source) x := by
327+
apply h.comp (continuousAt_extChartAt x).continuousWithinAt
328+
intro y hy
329+
have : (chartAt H x).symm ((chartAt H x) y) = y :=
330+
PartialHomeomorph.left_inv _ (by simpa using hy.2)
331+
simpa [this] using hy.1
332+
apply this.congr
333+
· intro y hy
334+
have : (chartAt H x).symm ((chartAt H x) y) = y :=
335+
PartialHomeomorph.left_inv _ (by simpa using hy.2)
336+
simp [this]
337+
· simp
338+
rw [← this]
339+
simp only [ContDiffWithinAtProp, mfld_simps, preimage_comp, comp_assoc]
340+
341+
/-- One can reformulate being `Cⁿ` at a point as being `Cⁿ` in the source space when
342+
composing with the extended chart. -/
343+
theorem contMDiffAt_iff_source :
344+
ContMDiffAt I I' n f x ↔
345+
ContMDiffWithinAt 𝓘(𝕜, E) I' n (f ∘ (extChartAt I x).symm) (range I) (extChartAt I x x) := by
346+
rw [← contMDiffWithinAt_univ, contMDiffWithinAt_iff_source]
347+
simp
309348

310349
section IsManifold
311350

Mathlib/Geometry/Manifold/ContMDiffMFDeriv.lean

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {m n : WithTop ℕ∞}
4141
{F : Type*}
4242
[NormedAddCommGroup F] [NormedSpace 𝕜 F] {G : Type*} [TopologicalSpace G]
4343
{J : ModelWithCorners 𝕜 F G} {N : Type*} [TopologicalSpace N] [ChartedSpace G N]
44-
[Js : IsManifold J n N]
44+
[Js : IsManifold J 1 N]
4545
-- declare a charted space `N'` over the pair `(F', G')`.
4646
{F' : Type*}
4747
[NormedAddCommGroup F'] [NormedSpace 𝕜 F'] {G' : Type*} [TopologicalSpace G']
@@ -55,7 +55,7 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {m n : WithTop ℕ∞}
5555
/-! ### The derivative of a `C^(n+1)` function is `C^n` -/
5656

5757
section mfderiv
58-
variable [Is : IsManifold I n M] [I's : IsManifold I' n M']
58+
variable [Is : IsManifold I 1 M] [I's : IsManifold I' 1 M']
5959

6060
/-- The function that sends `x` to the `y`-derivative of `f (x, y)` at `g (x)` is `C^m` at `x₀`,
6161
where the derivative is taken as a continuous linear map.
@@ -68,15 +68,9 @@ protected theorem ContMDiffWithinAt.mfderivWithin {x₀ : N} {f : N → M → M'
6868
(hf : ContMDiffWithinAt (J.prod I) I' n (Function.uncurry f) (t ×ˢ u) (x₀, g x₀))
6969
(hg : ContMDiffWithinAt J I m g t x₀) (hx₀ : x₀ ∈ t)
7070
(hu : MapsTo g t u) (hmn : m + 1 ≤ n) (h'u : UniqueMDiffOn I u) :
71-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
72-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
7371
ContMDiffWithinAt J 𝓘(𝕜, E →L[𝕜] E') m
7472
(inTangentCoordinates I I' g (fun x => f x (g x))
7573
(fun x => mfderivWithin I I' (f x) u (g x)) x₀) t x₀ := by
76-
have : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
77-
have : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
78-
have : IsManifold J 1 N := .of_le (le_trans le_add_self hmn)
79-
have : IsManifold J m N := .of_le (le_trans le_self_add hmn)
8074
-- first localize the result to a smaller set, to make sure everything happens in chart domains
8175
let t' := t ∩ g ⁻¹' ((extChartAt I (g x₀)).source)
8276
have ht't : t' ⊆ t := inter_subset_left
@@ -146,8 +140,8 @@ protected theorem ContMDiffWithinAt.mfderivWithin {x₀ : N} {f : N → M → M'
146140
fderivWithin 𝕜 (extChartAt I' (f x₀ (g x₀)) ∘ f x ∘ (extChartAt I (g x₀)).symm)
147141
((extChartAt I (g x₀)).target ∩ (extChartAt I (g x₀)).symm ⁻¹' u)
148142
(extChartAt I (g x₀) (g x))) t' x₀ := by
149-
simp_rw [contMDiffWithinAt_iff_source_of_mem_source (mem_chart_source G x₀),
150-
contMDiffWithinAt_iff_contDiffWithinAt, Function.comp_def] at this ⊢
143+
simp_rw [contMDiffWithinAt_iff_source (x := x₀),
144+
contMDiffWithinAt_iff_contDiffWithinAt, Function.comp_def]
151145
exact this
152146
-- finally, argue that the map we control in the previous point coincides locally with the map we
153147
-- want to prove the regularity of, so regularity of the latter follows from regularity of the
@@ -203,8 +197,6 @@ parameters and `g = id`.
203197
theorem ContMDiffWithinAt.mfderivWithin_const {x₀ : M} {f : M → M'}
204198
(hf : ContMDiffWithinAt I I' n f s x₀)
205199
(hmn : m + 1 ≤ n) (hx : x₀ ∈ s) (hs : UniqueMDiffOn I s) :
206-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
207-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
208200
ContMDiffWithinAt I 𝓘(𝕜, E →L[𝕜] E') m
209201
(inTangentCoordinates I I' id f (mfderivWithin I I' f s) x₀) s x₀ := by
210202
have : ContMDiffWithinAt (I.prod I) I' n (fun x : M × M => f x.2) (s ×ˢ s) (x₀, x₀) :=
@@ -225,8 +217,6 @@ theorem ContMDiffWithinAt.mfderivWithin_apply {x₀ : N'}
225217
(hg : ContMDiffWithinAt J I m g t (g₁ x₀)) (hg₁ : ContMDiffWithinAt J' J m g₁ v x₀)
226218
(hg₂ : ContMDiffWithinAt J' 𝓘(𝕜, E) m g₂ v x₀) (hmn : m + 1 ≤ n) (h'g₁ : MapsTo g₁ v t)
227219
(hg₁x₀ : g₁ x₀ ∈ t) (h'g : MapsTo g t u) (hu : UniqueMDiffOn I u) :
228-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
229-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
230220
ContMDiffWithinAt J' 𝓘(𝕜, E') m
231221
(fun x => (inTangentCoordinates I I' g (fun x => f x (g x))
232222
(fun x => mfderivWithin I I' (f x) u (g x)) (g₁ x₀) (g₁ x)) (g₂ x)) v x₀ :=
@@ -242,8 +232,6 @@ This result is used to show that maps into the 1-jet bundle and cotangent bundle
242232
protected theorem ContMDiffAt.mfderiv {x₀ : N} (f : N → M → M') (g : N → M)
243233
(hf : ContMDiffAt (J.prod I) I' n (Function.uncurry f) (x₀, g x₀)) (hg : ContMDiffAt J I m g x₀)
244234
(hmn : m + 1 ≤ n) :
245-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
246-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
247235
ContMDiffAt J 𝓘(𝕜, E →L[𝕜] E') m
248236
(inTangentCoordinates I I' g (fun x ↦ f x (g x)) (fun x ↦ mfderiv I I' (f x) (g x)) x₀)
249237
x₀ := by
@@ -261,8 +249,6 @@ This is a special case of `ContMDiffAt.mfderiv` where `f` does not contain any p
261249
-/
262250
theorem ContMDiffAt.mfderiv_const {x₀ : M} {f : M → M'} (hf : ContMDiffAt I I' n f x₀)
263251
(hmn : m + 1 ≤ n) :
264-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
265-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
266252
ContMDiffAt I 𝓘(𝕜, E →L[𝕜] E') m (inTangentCoordinates I I' id f (mfderiv I I' f) x₀) x₀ :=
267253
haveI : ContMDiffAt (I.prod I) I' n (fun x : M × M => f x.2) (x₀, x₀) :=
268254
ContMDiffAt.comp (x₀, x₀) hf contMDiffAt_snd
@@ -280,8 +266,6 @@ theorem ContMDiffAt.mfderiv_apply {x₀ : N'} (f : N → M → M') (g : N → M)
280266
(hf : ContMDiffAt (J.prod I) I' n (Function.uncurry f) (g₁ x₀, g (g₁ x₀)))
281267
(hg : ContMDiffAt J I m g (g₁ x₀)) (hg₁ : ContMDiffAt J' J m g₁ x₀)
282268
(hg₂ : ContMDiffAt J' 𝓘(𝕜, E) m g₂ x₀) (hmn : m + 1 ≤ n) :
283-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
284-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
285269
ContMDiffAt J' 𝓘(𝕜, E') m
286270
(fun x => inTangentCoordinates I I' g (fun x => f x (g x))
287271
(fun x => mfderiv I I' (f x) (g x)) (g₁ x₀) (g₁ x) (g₂ x)) x₀ :=
@@ -293,19 +277,15 @@ end mfderiv
293277

294278
section tangentMap
295279

296-
variable [Is : IsManifold I n M] [I's : IsManifold I' n M']
280+
variable [Is : IsManifold I 1 M] [I's : IsManifold I' 1 M']
297281

298282
/-- If a function is `C^n` on a domain with unique derivatives, then its bundled derivative
299283
is `C^m` when `m+1 ≤ n`. -/
300284
theorem ContMDiffOn.contMDiffOn_tangentMapWithin
301285
(hf : ContMDiffOn I I' n f s) (hmn : m + 1 ≤ n)
302286
(hs : UniqueMDiffOn I s) :
303-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
304-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
305287
ContMDiffOn I.tangent I'.tangent m (tangentMapWithin I I' f s)
306288
(π E (TangentSpace I) ⁻¹' s) := by
307-
have : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
308-
have : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
309289
intro x₀ hx₀
310290
let s' : Set (TangentBundle I M) := (π E (TangentSpace I) ⁻¹' s)
311291
let b₁ : TangentBundle I M → M := fun p ↦ p.1
@@ -340,34 +320,22 @@ alias ContMDiffOn.continuousOn_tangentMapWithin_aux := ContMDiffOn.contMDiffOn_t
340320
derivative is continuous there. -/
341321
theorem ContMDiffOn.continuousOn_tangentMapWithin (hf : ContMDiffOn I I' n f s) (hmn : 1 ≤ n)
342322
(hs : UniqueMDiffOn I s) :
343-
haveI : IsManifold I 1 M := .of_le hmn
344-
haveI : IsManifold I' 1 M' := .of_le hmn
345323
ContinuousOn (tangentMapWithin I I' f s) (π E (TangentSpace I) ⁻¹' s) := by
346-
have : IsManifold I 1 M := .of_le hmn
347-
have : IsManifold I' 1 M' := .of_le hmn
348324
have :
349325
ContMDiffOn I.tangent I'.tangent 0 (tangentMapWithin I I' f s) (π E (TangentSpace I) ⁻¹' s) :=
350326
hf.contMDiffOn_tangentMapWithin hmn hs
351327
exact this.continuousOn
352328

353329
/-- If a function is `C^n`, then its bundled derivative is `C^m` when `m+1 ≤ n`. -/
354330
theorem ContMDiff.contMDiff_tangentMap (hf : ContMDiff I I' n f) (hmn : m + 1 ≤ n) :
355-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
356-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
357331
ContMDiff I.tangent I'.tangent m (tangentMap I I' f) := by
358-
haveI : IsManifold I 1 M := .of_le (le_trans le_add_self hmn)
359-
haveI : IsManifold I' 1 M' := .of_le (le_trans le_add_self hmn)
360332
rw [← contMDiffOn_univ] at hf ⊢
361333
convert hf.contMDiffOn_tangentMapWithin hmn uniqueMDiffOn_univ
362334
rw [tangentMapWithin_univ]
363335

364336
/-- If a function is `C^n`, with `1 ≤ n`, then its bundled derivative is continuous. -/
365337
theorem ContMDiff.continuous_tangentMap (hf : ContMDiff I I' n f) (hmn : 1 ≤ n) :
366-
haveI : IsManifold I 1 M := .of_le hmn
367-
haveI : IsManifold I' 1 M' := .of_le hmn
368338
Continuous (tangentMap I I' f) := by
369-
haveI : IsManifold I 1 M := .of_le hmn
370-
haveI : IsManifold I' 1 M' := .of_le hmn
371339
rw [← contMDiffOn_univ] at hf
372340
rw [continuous_iff_continuousOn_univ]
373341
convert hf.continuousOn_tangentMapWithin hmn uniqueMDiffOn_univ

Mathlib/Geometry/Manifold/VectorField/LieBracket.lean

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,6 @@ protected lemma _root_.ContMDiffWithinAt.mlieBracketWithin_vectorField
757757
apply contMDiffWithinAt_iff_le_ne_infty.2 (fun m' hm' h'm' ↦ ?_)
758758
have hn : 1 ≤ m' + 1 := le_add_self
759759
have hm'n : m' + 1 ≤ n := le_trans (add_le_add_right hm' 1) (le_minSmoothness.trans hmn)
760-
have : IsManifold I (m' + 1) M := IsManifold.of_le (n := n + 1) (hm'n.trans le_self_add)
761760
have pre_mem : (extChartAt I x) ⁻¹' ((extChartAt I x).target ∩ (extChartAt I x).symm ⁻¹' s)
762761
∈ 𝓝[s] x := by
763762
filter_upwards [self_mem_nhdsWithin,

Mathlib/Geometry/Manifold/VectorField/Pullback.lean

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -365,10 +365,7 @@ end MDifferentiability
365365

366366
section ContMDiff
367367

368-
variable [IsManifold I n M] [IsManifold I' n M'] [CompleteSpace E]
369-
-- If `1 < n` then `IsManifold.of_le` shows the following assumptions are redundant.
370-
-- We include them since they are necessary to make the statement.
371-
[IsManifold I 1 M] [IsManifold I' 1 M']
368+
variable [CompleteSpace E] [IsManifold I 1 M] [IsManifold I' 1 M']
372369

373370
/-- The pullback of a `C^m` vector field by a `C^n` function with invertible derivative and
374371
`m + 1 ≤ n` is `C^m`.
@@ -635,7 +632,7 @@ lemma contMDiffWithinAt_mpullbackWithin_extChartAt_symm
635632
TangentBundle 𝓘(𝕜, E) E))
636633
((extChartAt I x).target ∩ (extChartAt I x).symm ⁻¹' s) (extChartAt I x x) :=
637634
ContMDiffWithinAt.mpullbackWithin_vectorField_of_eq' hV
638-
(contMDiffWithinAt_extChartAt_symm_range (n := n) _ (mem_extChartAt_target x))
635+
(contMDiffWithinAt_extChartAt_symm_range_self (n := n) x)
639636
(isInvertible_mfderivWithin_extChartAt_symm (mem_extChartAt_target x))
640637
(by simp [hx]) (UniqueMDiffOn.uniqueMDiffOn_target_inter hs x) hmn
641638
((mapsTo_preimage _ _).mono_left inter_subset_right).preimage_mem_nhdsWithin

0 commit comments

Comments
 (0)