Skip to content

Commit f804a9d

Browse files
grunwegmichaellee94
authored andcommitted
feat: a map is smooth iff its post-composition with an immersion is (leanprover-community#28865)
A future PR will use this to golf the results in `Icc/Instances.lean`; we will also use this to study bordism theory.
1 parent 2d7bea1 commit f804a9d

3 files changed

Lines changed: 108 additions & 2 deletions

File tree

Mathlib/Analysis/Calculus/ContDiff/Defs.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,13 @@ theorem ContDiffWithinAt.congr (h : ContDiffWithinAt 𝕜 n f s x) (h₁ : ∀ y
254254
(hx : f₁ x = f x) : ContDiffWithinAt 𝕜 n f₁ s x :=
255255
h.congr_of_eventuallyEq (Filter.eventuallyEq_of_mem self_mem_nhdsWithin h₁) hx
256256

257+
/-- Version of `ContDiffWithinAt.congr` where `x` need not be contained in `s`,
258+
but `f` and `f₁` are equal on a set containing both. -/
259+
theorem ContDiffWithinAt.congr' (h : ContDiffWithinAt 𝕜 n f s x) (h₁ : ∀ y ∈ t, f₁ y = f y)
260+
(hst : s ⊆ t) (hxt : x ∈ t) :
261+
ContDiffWithinAt 𝕜 n f₁ s x :=
262+
h.congr (fun _y hy ↦ h₁ _ (hst hy)) (h₁ x hxt)
263+
257264
theorem contDiffWithinAt_congr (h₁ : ∀ y ∈ s, f₁ y = f y) (hx : f₁ x = f x) :
258265
ContDiffWithinAt 𝕜 n f₁ s x ↔ ContDiffWithinAt 𝕜 n f s x :=
259266
fun h' ↦ h'.congr (fun x hx ↦ (h₁ x hx).symm) hx.symm, fun h' ↦ h'.congr h₁ hx⟩

Mathlib/Geometry/Manifold/ContMDiff/Defs.lean

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,15 @@ theorem contMDiffWithinAt_iff_image
423423
refine fun _ => contDiffWithinAt_congr_set ?_
424424
simp_rw [e.extend_symm_preimage_inter_range_eventuallyEq hs hx]
425425

426+
theorem contMDiffAt_iff_of_mem_maximalAtlas {x : M} (he : e ∈ maximalAtlas I n M)
427+
(he' : e' ∈ maximalAtlas I' n M') (hx : x ∈ e.source) (hy : f x ∈ e'.source) :
428+
ContMDiffAt I I' n f x ↔
429+
ContinuousAt f x ∧
430+
ContDiffWithinAt 𝕜 n (e'.extend I' ∘ f ∘ (e.extend I).symm) (range I) (e.extend I x) := by
431+
rw [← contMDiffWithinAt_univ,
432+
contMDiffWithinAt_iff_of_mem_maximalAtlas he he' hx hy,
433+
continuousWithinAt_univ, preimage_univ, univ_inter]
434+
426435
/-- One can reformulate being `C^n` within a set at a point as continuity within this set at this
427436
point, and being `C^n` in any chart containing that point. -/
428437
theorem contMDiffWithinAt_iff_of_mem_source [IsManifold I n M] [IsManifold I' n M']

Mathlib/Geometry/Manifold/Immersion.lean

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ This shortens the overall argument, as the definition of submersions has the sam
6060
* `IsImmersionAt.contMDiffAt`: if f is an immersion at `x`, it is `C^n` at `x`.
6161
* `IsImmersion.contMDiff`: if f is a `C^n` immersion, it is automatically `C^n`
6262
in the sense of `ContMDiff`.
63+
* `ContMDiffAt.iff_comp_isImmersionAt` and `ContMDiff.iff_comp_isImmersion`: a function `f : M → N`
64+
is `C^n` (at `x`) if and only if it is continuous (at `x`) and its composition `φ ∘ f` with a
65+
`C^n` immersion `φ : N → P` (at `f x`) is `C^n`.
6366
6467
## Implementation notes
6568
@@ -434,6 +437,70 @@ theorem contMDiffOn (h : IsImmersionAtOfComplement F I J n f x) :
434437
theorem contMDiffAt (h : IsImmersionAtOfComplement F I J n f x) : CMDiffAt n f x :=
435438
h.contMDiffOn.contMDiffAt (h.domChart.open_source.mem_nhds (mem_domChart_source h))
436439

440+
/-- Let `f : M → N` be a function, and suppose `φ : N → N'` is a `C^n` immersion at `f x`, such
441+
that `φ ∘ f` is `C^n` at `x`. Let `x ∈ t ⊆ M` be contained in the slice chart at `f x`.
442+
Then `f` seen in the slice chart at `φ (f x)` and the preferred chart at `x`
443+
is `C^n` at (the image of) `x` within (the image of) `t`. -/
444+
private lemma aux {f : M → N} {φ : N → N'}
445+
(h : IsImmersionAtOfComplement F J J' n φ (f x)) (h' : CMDiffAt n (φ ∘ f) x)
446+
{t : Set M} (ht : t ⊆ f ⁻¹' h.domChart.source) (hxt : x ∈ t) :
447+
ContDiffWithinAt 𝕜 n ((h.domChart.extend J) ∘ f ∘ (extChartAt I x).symm)
448+
((extChartAt I x).symm ⁻¹' t ∩ range I) ((extChartAt I x) x) := by
449+
-- Consider the local expressions of `f`, `φ`, `x` and `s'` in the charts we're considering.
450+
set f' := (h.domChart.extend J) ∘ f ∘ (extChartAt I x).symm
451+
set φ' := (h.codChart.extend J') ∘ φ ∘ (h.domChart.extend J).symm
452+
set x' := (extChartAt I x) x
453+
set s := (extChartAt I x).symm ⁻¹' t ∩ range I
454+
have hx' : extChartAt I x x ∈ s := ⟨by simp [mem_chart_source H x, hxt], mem_range_self _⟩
455+
have h'loc : ContDiffWithinAt 𝕜 n ((h.codChart.extend J') ∘ (φ ∘ f) ∘ (extChartAt I x).symm)
456+
((extChartAt I x).symm ⁻¹' t ∩ range I) (extChartAt I x x) := by
457+
replace h' : CMDiffAt[t] n (φ ∘ f) x := h'.contMDiffWithinAt
458+
rw [contMDiffWithinAt_iff_of_mem_maximalAtlas' h.codChart_mem_maximalAtlas] at h'
459+
exacts [h'.2, h.mem_codChart_source]
460+
-- By hypothesis, `φ ∘ f` (read in our charts) is `C^n` at `x'` within `s`.
461+
have h'' : ContDiffWithinAt 𝕜 n (φ' ∘ f') s x' := by
462+
apply h'loc.congr_of_mem (fun y hy ↦ ?_) hx'
463+
simp only [mfld_simps, φ', f']
464+
rw [h.domChart.left_inv]
465+
apply ht hy.1
466+
-- On the other hand, composing `f'` with the inclusion `u ↦ (u, 0)` is also `C^n`
467+
-- (as a composition of `C^n` functions); this locally equals `φ ∘ f` in coordinates
468+
-- (since `f` is an immersion).
469+
set f'' := (h.equiv ∘ fun x ↦ (x, 0)) ∘ f'
470+
have h''' : ContDiffWithinAt 𝕜 n f'' s x' := by
471+
refine h''.congr_of_mem (fun y hy ↦ ?_) hx'
472+
simp only [f'', φ', f']
473+
nth_rw 2 [comp_apply]
474+
rw [Function.comp_apply, h.writtenInCharts]
475+
rw [h.domChart.extend_target_eq_image_source]
476+
exact ⟨(f ∘ (extChartAt I x).symm) y, ht hy.1, by simp⟩
477+
-- Composing with a suitable projection to cancel the inclusion, we deduce that `f` is `C^n`.
478+
have h'''' : ContDiffWithinAt 𝕜 n ((Prod.fst ∘ h.equiv.symm) ∘ f'') s x' := by
479+
refine ContDiffWithinAt.comp x' ?_ h''' (mapsTo_univ _ _)
480+
rw [contDiffWithinAt_univ]
481+
exact contDiffAt_fst.comp _ h.equiv.symm.contDiff.contDiffAt
482+
exact h''''.congr_of_mem (fun y hy ↦ by simp [f'']) hx'
483+
484+
/-- A function `f : M → N` between `C^n` manifolds is `C^n` at `x` if and only if it is continuous
485+
at `x` and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` at `f x` is `C^n` at `x`. -/
486+
lemma _root_.ContMDiffAt.iff_comp_isImmersionAtOfComplement
487+
{f : M → N} {φ : N → N'} (hφ : IsImmersionAtOfComplement F J J' n φ (f x)) :
488+
-- Note: `φ` need not be inducing, so continuity of `φ ∘ f` at `x`
489+
-- generally does not imply continuity of `f`
490+
CMDiffAt n f x ↔ ContinuousAt f x ∧ CMDiffAt n (φ ∘ f) x := by
491+
refine ⟨fun hf ↦ ⟨hf.continuousAt, hφ.contMDiffAt.comp x hf⟩, fun ⟨hf, h'⟩ ↦ ?_⟩
492+
-- Since `f` is continuous at `x`, some neighbourhood `t` of `x` is mapped
493+
-- into `hφ.domChart.source` under `f`. By restriction, we may assume `t` is open,
494+
-- so it suffices to test smoothness on `t`.
495+
have : hφ.domChart.source ∈ 𝓝 (f x) := hφ.domChart.open_source.mem_nhds hφ.mem_domChart_source
496+
obtain ⟨t, ht, htopen, hxt⟩ := mem_nhds_iff.mp (hf this)
497+
suffices CMDiffAt[t] n f x from this.contMDiffAt <| htopen.mem_nhds hxt
498+
-- We test smoothness of `f` on `t` in the preferred chart at `x` and `hφ.codChart`.
499+
rw [contMDiffWithinAt_iff_of_mem_maximalAtlas'
500+
hφ.domChart_mem_maximalAtlas hφ.mem_domChart_source]
501+
refine ⟨hf.continuousWithinAt, ?_⟩
502+
exact aux hφ h' ht hxt
503+
437504
end IsImmersionAtOfComplement
438505

439506
namespace IsImmersionAt
@@ -620,6 +687,15 @@ theorem contMDiffOn (h : IsImmersionAt I J n f x) : CMDiff[h.domChart.source] n
620687
theorem contMDiffAt (h : IsImmersionAt I J n f x) : CMDiffAt n f x :=
621688
h.isImmersionAtOfComplement_complement.contMDiffAt
622689

690+
/-- A function `f : M → N` between `C^n` manifolds is `C^n` at `x` if and only if it is continuous
691+
at `x` and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` at `f x` is `C^n` at `x`. -/
692+
lemma _root_.ContMDiffAt.iff_comp_isImmersionAt {f : M → N} {φ : N → N'}
693+
(hφ : IsImmersionAt J J' n φ (f x)) :
694+
-- Note: `φ` need not be inducing, so continuity of `φ ∘ f` at `x`
695+
-- generally does not imply continuity of `f`
696+
CMDiffAt n f x ↔ ContinuousAt f x ∧ CMDiffAt n (φ ∘ f) x := by
697+
rw [← ContMDiffAt.iff_comp_isImmersionAtOfComplement hφ.isImmersionAtOfComplement_complement]
698+
623699
end IsImmersionAt
624700

625701
variable (F I J n) in
@@ -748,10 +824,18 @@ lemma sumInr {M' : Type*} [TopologicalSpace M'] [ChartedSpace H M'] [IsManifold
748824
@[deprecated (since := "2025-12-16")] alias ofOpen := of_opens
749825

750826
/-- A `C^n` immersion is `C^n`. -/
751-
theorem contMDiff
752-
(h : IsImmersionOfComplement F I J n f) : CMDiff n f :=
827+
theorem contMDiff (h : IsImmersionOfComplement F I J n f) : CMDiff n f :=
753828
fun x ↦ (h x).contMDiffAt
754829

830+
/-- A function `f : M → N` between `C^n` manifolds is `C^n` if and only if it is continuous
831+
and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` is `C^n`. -/
832+
lemma _root_.ContMDiff.iff_comp_isImmersionOfComplement {f : M → N} {φ : N → N'}
833+
(hφ : IsImmersionOfComplement F J J' n φ) :
834+
CMDiff n f ↔ Continuous f ∧ CMDiff n (φ ∘ f) := by
835+
refine ⟨fun h ↦ ⟨h.continuous, hφ.contMDiff.comp h⟩, fun ⟨h, h'⟩ x ↦ ?_⟩
836+
rw [ContMDiffAt.iff_comp_isImmersionAtOfComplement (hφ (f x))]
837+
exact ⟨h.continuousAt, h' x⟩
838+
755839
end IsImmersionOfComplement
756840

757841
namespace IsImmersion
@@ -825,6 +909,12 @@ theorem contMDiff
825909
(h : IsImmersion I J n f) : CMDiff n f :=
826910
h.isImmersionOfComplement_complement.contMDiff
827911

912+
/-- A function `f : M → N` between `C^n` manifolds is `C^n` if and only if it is continuous
913+
and its composition `φ ∘ f` with a `C^n` immersion `φ : N → N'` is `C^n`. -/
914+
lemma _root_.ContMDiff.iff_comp_isImmersion {f : M → N} {φ : N → N'} (hφ : IsImmersion J J' n φ) :
915+
CMDiff n f ↔ Continuous f ∧ CMDiff n (φ ∘ f) := by
916+
rw [ContMDiff.iff_comp_isImmersionOfComplement hφ.isImmersionOfComplement_complement]
917+
828918
end IsImmersion
829919

830920
end Manifold

0 commit comments

Comments
 (0)