Skip to content

Commit ae9f73a

Browse files
committed
feat: drop HasGroupoid assumption in several LiftPropAt lemmas (#40475)
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr>
1 parent bd1b696 commit ae9f73a

7 files changed

Lines changed: 121 additions & 96 deletions

File tree

Mathlib/Geometry/Manifold/ContMDiff/Atlas.lean

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜]
3636
{E : Type*}
3737
[NormedAddCommGroup E] [NormedSpace 𝕜 E] {H : Type*} [TopologicalSpace H]
3838
{I : ModelWithCorners 𝕜 E H} {M : Type*} [TopologicalSpace M] [ChartedSpace H M] {n : ℕ∞ω}
39-
[IsManifold I n M]
4039
-- declare a topological space `M'`.
4140
{M' : Type*} [TopologicalSpace M']
4241
-- declare functions, sets, points and smoothness indices
@@ -80,10 +79,12 @@ theorem contMDiffAt_symm_of_mem_maximalAtlas {x : H} (h : e ∈ maximalAtlas I n
8079
(hx : x ∈ e.target) : ContMDiffAt I I n e.symm x :=
8180
(contMDiffOn_symm_of_mem_maximalAtlas h).contMDiffAt <| e.open_target.mem_nhds hx
8281

83-
theorem contMDiffOn_chart : ContMDiffOn I I n (chartAt H x) (chartAt H x).source :=
82+
theorem contMDiffOn_chart [IsManifold I n M] :
83+
ContMDiffOn I I n (chartAt H x) (chartAt H x).source :=
8484
contMDiffOn_of_mem_maximalAtlas <| chart_mem_maximalAtlas x
8585

86-
theorem contMDiffOn_chart_symm : ContMDiffOn I I n (chartAt H x).symm (chartAt H x).target :=
86+
theorem contMDiffOn_chart_symm [IsManifold I n M] :
87+
ContMDiffOn I I n (chartAt H x).symm (chartAt H x).target :=
8788
contMDiffOn_symm_of_mem_maximalAtlas <| chart_mem_maximalAtlas x
8889

8990
theorem contMDiffAt_extend {x : M} (he : e ∈ maximalAtlas I n M) (hx : x ∈ e.source) :
@@ -94,18 +95,18 @@ theorem contMDiffOn_extend (he : e ∈ maximalAtlas I n M) :
9495
ContMDiffOn I 𝓘(𝕜, E) n (e.extend I) e.source :=
9596
fun _x' hx' ↦ (contMDiffAt_extend he hx').contMDiffWithinAt
9697

97-
theorem contMDiffAt_extChartAt' {x' : M} (h : x' ∈ (chartAt H x).source) :
98+
theorem contMDiffAt_extChartAt' [IsManifold I n M] {x' : M} (h : x' ∈ (chartAt H x).source) :
9899
ContMDiffAt I 𝓘(𝕜, E) n (extChartAt I x) x' :=
99100
contMDiffAt_extend (chart_mem_maximalAtlas x) h
100101

101-
omit [IsManifold I n M] in
102102
theorem contMDiffAt_extChartAt : ContMDiffAt I 𝓘(𝕜, E) n (extChartAt I x) x := by
103103
rw [contMDiffAt_iff_source]
104104
apply contMDiffWithinAt_id.congr_of_eventuallyEq_of_mem _ (by simp)
105105
filter_upwards [extChartAt_target_mem_nhdsWithin x] with y hy
106106
exact PartialEquiv.right_inv (extChartAt I x) hy
107107

108-
theorem contMDiffOn_extChartAt : ContMDiffOn I 𝓘(𝕜, E) n (extChartAt I x) (chartAt H x).source :=
108+
theorem contMDiffOn_extChartAt [IsManifold I n M] :
109+
ContMDiffOn I 𝓘(𝕜, E) n (extChartAt I x) (chartAt H x).source :=
109110
contMDiffOn_extend (chart_mem_maximalAtlas x)
110111

111112
theorem contMDiffOn_extend_symm (he : e ∈ maximalAtlas I n M) :
@@ -115,25 +116,23 @@ theorem contMDiffOn_extend_symm (he : e ∈ maximalAtlas I n M) :
115116
simp_rw [image_subset_iff, PartialEquiv.restr_coe_symm, I.toPartialEquiv_coe_symm,
116117
preimage_preimage, I.left_inv, preimage_id']; rfl
117118

118-
theorem contMDiffOn_extChartAt_symm (x : M) :
119+
theorem contMDiffOn_extChartAt_symm [IsManifold I n M] (x : M) :
119120
ContMDiffOn 𝓘(𝕜, E) I n (extChartAt I x).symm (extChartAt I x).target := by
120121
convert! contMDiffOn_extend_symm (chart_mem_maximalAtlas (I := I) x)
121122
· rw [extChartAt_target, I.image_eq]
122123
· infer_instance
123-
· infer_instance
124124

125-
theorem contMDiffWithinAt_extChartAt_symm_target
125+
theorem contMDiffWithinAt_extChartAt_symm_target [IsManifold I n M]
126126
(x : M) {y : E} (hy : y ∈ (extChartAt I x).target) :
127127
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (extChartAt I x).target y :=
128128
contMDiffOn_extChartAt_symm x y hy
129129

130-
theorem contMDiffWithinAt_extChartAt_symm_range
130+
theorem contMDiffWithinAt_extChartAt_symm_range [IsManifold I n M]
131131
(x : M) {y : E} (hy : y ∈ (extChartAt I x).target) :
132132
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (range I) y :=
133133
(contMDiffWithinAt_extChartAt_symm_target x hy).mono_of_mem_nhdsWithin
134134
(extChartAt_target_mem_nhdsWithin_of_mem hy)
135135

136-
omit [IsManifold I n M] in
137136
theorem contMDiffWithinAt_extChartAt_symm_target_self (x : M) :
138137
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (extChartAt I x).target
139138
(extChartAt I x x) := by
@@ -146,7 +145,6 @@ theorem contMDiffWithinAt_extChartAt_symm_target_self (x : M) :
146145
convert! PartialEquiv.right_inv (extChartAt I x) hy
147146
simp
148147

149-
omit [IsManifold I n M] in
150148
theorem contMDiffWithinAt_extChartAt_symm_range_self (x : M) :
151149
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (range I) (extChartAt I x x) :=
152150
(contMDiffWithinAt_extChartAt_symm_target_self x).mono_of_mem_nhdsWithin
@@ -163,7 +161,7 @@ end Atlas
163161

164162
section IsLocalStructomorph
165163

166-
variable [ChartedSpace H M'] [IsM' : IsManifold I n M']
164+
variable [IsManifold I n M] [ChartedSpace H M'] [IsM' : IsManifold I n M']
167165

168166
theorem isLocalStructomorphOn_contDiffGroupoid_iff_aux {f : OpenPartialHomeomorph M M'}
169167
(hf : LiftPropOn (contDiffGroupoid n I).IsLocalStructomorphWithinAt f f.source) :
@@ -308,8 +306,7 @@ end IsLocalStructomorph
308306

309307
variable {F : Type*} [NormedAddCommGroup F] [NormedSpace 𝕜 F] {G : Type*} [TopologicalSpace G]
310308
{J : ModelWithCorners 𝕜 F G} {N : Type*} [TopologicalSpace N] [ChartedSpace G N]
311-
{n : ℕ∞ω}
312-
[IsManifold I n M] [IsManifold J n N] {f : M → N} {s : Set M}
309+
{n : ℕ∞ω} {f : M → N} {s : Set M}
313310
{φ : OpenPartialHomeomorph M H} {ψ : OpenPartialHomeomorph N G}
314311

315312
/-- This is a smooth analogue of `OpenPartialHomeomorph.continuousWithinAt_writtenInExtend_iff`. -/

Mathlib/Geometry/Manifold/ContMDiff/Defs.lean

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,6 @@ theorem contMDiffAt_iff_target_of_mem_source
371371
rw [ContMDiffAt, contMDiffWithinAt_iff_target_of_mem_source hy, continuousWithinAt_univ,
372372
ContMDiffAt]
373373

374-
variable [IsManifold I n M] [IsManifold I' n M']
375-
376374
theorem contMDiffWithinAt_iff_of_mem_maximalAtlas {x : M} (he : e ∈ maximalAtlas I n M)
377375
(he' : e' ∈ maximalAtlas I' n M') (hx : x ∈ e.source) (hy : f x ∈ e'.source) :
378376
ContMDiffWithinAt I I' n f s x ↔
@@ -396,7 +394,8 @@ theorem contMDiffWithinAt_iff_image {x : M} (he : e ∈ maximalAtlas I n M)
396394

397395
/-- One can reformulate being `C^n` within a set at a point as continuity within this set at this
398396
point, and being `C^n` in any chart containing that point. -/
399-
theorem contMDiffWithinAt_iff_of_mem_source {x' : M} {y : M'} (hx : x' ∈ (chartAt H x).source)
397+
theorem contMDiffWithinAt_iff_of_mem_source [IsManifold I n M] [IsManifold I' n M']
398+
{x' : M} {y : M'} (hx : x' ∈ (chartAt H x).source)
400399
(hy : f x' ∈ (chartAt H' y).source) :
401400
ContMDiffWithinAt I I' n f s x' ↔
402401
ContinuousWithinAt f s x' ∧
@@ -405,7 +404,8 @@ theorem contMDiffWithinAt_iff_of_mem_source {x' : M} {y : M'} (hx : x' ∈ (char
405404
contMDiffWithinAt_iff_of_mem_maximalAtlas (chart_mem_maximalAtlas x)
406405
(chart_mem_maximalAtlas y) hx hy
407406

408-
theorem contMDiffWithinAt_iff_of_mem_source' {x' : M} {y : M'} (hx : x' ∈ (chartAt H x).source)
407+
theorem contMDiffWithinAt_iff_of_mem_source' [IsManifold I n M] [IsManifold I' n M']
408+
{x' : M} {y : M'} (hx : x' ∈ (chartAt H x).source)
409409
(hy : f x' ∈ (chartAt H' y).source) :
410410
ContMDiffWithinAt I I' n f s x' ↔
411411
ContinuousWithinAt f s x' ∧
@@ -423,7 +423,8 @@ theorem contMDiffWithinAt_iff_of_mem_source' {x' : M} {y : M'} (hx : x' ∈ (cha
423423
← map_extChartAt_nhdsWithin' hx, inter_comm, nhdsWithin_inter_of_mem]
424424
exact hc (extChartAt_source_mem_nhds' hy)
425425

426-
theorem contMDiffAt_iff_of_mem_source {x' : M} {y : M'} (hx : x' ∈ (chartAt H x).source)
426+
theorem contMDiffAt_iff_of_mem_source [IsManifold I n M] [IsManifold I' n M']
427+
{x' : M} {y : M'} (hx : x' ∈ (chartAt H x).source)
427428
(hy : f x' ∈ (chartAt H' y).source) :
428429
ContMDiffAt I I' n f x' ↔
429430
ContinuousAt f x' ∧
@@ -452,7 +453,8 @@ into a single chart, the fact that `f` is `C^n` on that set can be expressed by
452453
these charts.
453454
Note: this lemma uses `extChartAt I x '' s` instead of `(extChartAt I x).symm ⁻¹' s` to ensure
454455
that this set lies in `(extChartAt I x).target`. -/
455-
theorem contMDiffOn_iff_of_subset_source {x : M} {y : M'} (hs : s ⊆ (chartAt H x).source)
456+
theorem contMDiffOn_iff_of_subset_source [IsManifold I n M] [IsManifold I' n M']
457+
{x : M} {y : M'} (hs : s ⊆ (chartAt H x).source)
456458
(h2s : MapsTo f s (chartAt H' y).source) :
457459
ContMDiffOn I I' n f s ↔
458460
ContinuousOn f s ∧
@@ -465,7 +467,8 @@ into a single chart, the fact that `f` is `C^n` on that set can be expressed by
465467
these charts.
466468
Note: this lemma uses `extChartAt I x '' s` instead of `(extChartAt I x).symm ⁻¹' s` to ensure
467469
that this set lies in `(extChartAt I x).target`. -/
468-
theorem contMDiffOn_iff_of_subset_source' {x : M} {y : M'} (hs : s ⊆ (extChartAt I x).source)
470+
theorem contMDiffOn_iff_of_subset_source' [IsManifold I n M] [IsManifold I' n M']
471+
{x : M} {y : M'} (hs : s ⊆ (extChartAt I x).source)
469472
(h2s : MapsTo f s (extChartAt I' y).source) :
470473
ContMDiffOn I I' n f s ↔
471474
ContDiffOn 𝕜 n (extChartAt I' y ∘ f ∘ (extChartAt I x).symm) (extChartAt I x '' s) := by
@@ -475,7 +478,7 @@ theorem contMDiffOn_iff_of_subset_source' {x : M} {y : M'} (hs : s ⊆ (extChart
475478

476479
/-- One can reformulate being `C^n` on a set as continuity on this set, and being `C^n` in any
477480
extended chart. -/
478-
theorem contMDiffOn_iff :
481+
theorem contMDiffOn_iff [IsManifold I n M] [IsManifold I' n M'] :
479482
ContMDiffOn I I' n f s ↔
480483
ContinuousOn f s ∧
481484
∀ (x : M) (y : M'),
@@ -518,7 +521,7 @@ theorem contMDiffOn_zero_iff :
518521

519522
/-- One can reformulate being `C^n` on a set as continuity on this set, and being `C^n` in any
520523
extended chart in the target. -/
521-
theorem contMDiffOn_iff_target :
524+
theorem contMDiffOn_iff_target [IsManifold I n M] [IsManifold I' n M'] :
522525
ContMDiffOn I I' n f s ↔
523526
ContinuousOn f s ∧
524527
∀ y : M',
@@ -536,7 +539,7 @@ theorem contMDiffOn_iff_target :
536539

537540

538541
/-- One can reformulate being `C^n` as continuity and being `C^n` in any extended chart. -/
539-
theorem contMDiff_iff :
542+
theorem contMDiff_iff [IsManifold I n M] [IsManifold I' n M'] :
540543
ContMDiff I I' n f ↔
541544
Continuous f ∧
542545
∀ (x : M) (y : M'),
@@ -547,7 +550,7 @@ theorem contMDiff_iff :
547550

548551
/-- One can reformulate being `C^n` as continuity and being `C^n` in any extended chart in the
549552
target. -/
550-
theorem contMDiff_iff_target :
553+
theorem contMDiff_iff_target [IsManifold I n M] [IsManifold I' n M'] :
551554
ContMDiff I I' n f ↔
552555
Continuous f ∧ ∀ y : M',
553556
ContMDiffOn I 𝓘(𝕜, E') n (extChartAt I' y ∘ f) (f ⁻¹' (extChartAt I' y).source) := by

Mathlib/Geometry/Manifold/HasGroupoid.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ theorem mem_maximalAtlas_iff {e : OpenPartialHomeomorph M H} :
105105
e ∈ G.maximalAtlas M ↔ ∀ e' ∈ atlas H M, e.symm ≫ₕ e' ∈ G ∧ e'.symm ≫ₕ e ∈ G :=
106106
Iff.rfl
107107

108+
theorem StructureGroupoid.compatible_of_mem_maximalAtlas_right
109+
{e' : OpenPartialHomeomorph M H} {x : M}
110+
(he' : e' ∈ G.maximalAtlas M) : (chartAt H x).symm ≫ₕ e' ∈ G :=
111+
(he' _ (ChartedSpace.chart_mem_atlas x)).2
112+
113+
theorem StructureGroupoid.compatible_of_mem_maximalAtlas_left
114+
{e' : OpenPartialHomeomorph M H} {x : M}
115+
(he' : e' ∈ G.maximalAtlas M) : e'.symm ≫ₕ chartAt H x ∈ G :=
116+
(he' _ (ChartedSpace.chart_mem_atlas x)).1
117+
108118
/-- Changing coordinates between two elements of the maximal atlas gives rise to an element
109119
of the structure groupoid. -/
110120
theorem StructureGroupoid.compatible_of_mem_maximalAtlas {e e' : OpenPartialHomeomorph M H}

Mathlib/Geometry/Manifold/Immersion.lean

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,6 @@ This shortens the overall argument, as the definition of submersions has the sam
7474
`IsImmersion(At)OfComplement.small` and `IsImmersion(At)OfComplement.smallEquiv`.
7575
7676
## TODO
77-
* Remove the `IsManifold I n M` and `IsManifold J n N` hypotheses from `IsImmersionAt.contMDiffAt`
78-
and all its variants; these are superfluous. By hypothesis, `h.domChart` and `h.codChart` are in
79-
the maximal atlas for `M` resp. `N`; this implies that smoothness of `f` can be tested w.r.t.
80-
these charts (without any `IsManifold` hypotheses).
8177
* The converse to `IsImmersionAtOfComplement.congr_F` also holds: any two complements are
8278
isomorphic, as they are isomorphic to the cokernel of the differential `mfderiv I J f x`.
8379
* If `f` is an immersion at `x`, its differential splits, hence is injective.
@@ -408,8 +404,6 @@ theorem continuousOn (h : IsImmersionAtOfComplement F I J n f x) :
408404
theorem continuousAt (h : IsImmersionAtOfComplement F I J n f x) : ContinuousAt f x :=
409405
h.continuousOn.continuousAt (h.domChart.open_source.mem_nhds (mem_domChart_source h))
410406

411-
variable [IsManifold I n M] [IsManifold J n N]
412-
413407
/-- Prefer using `IsImmersionAtOfComplement.contMDiffAt` instead -/
414408
theorem contMDiffOn (h : IsImmersionAtOfComplement F I J n f x) :
415409
CMDiff[h.domChart.source] n f := by
@@ -601,8 +595,6 @@ theorem continuousOn (h : IsImmersionAt I J n f x) : ContinuousOn f h.domChart.s
601595
theorem continuousAt (h : IsImmersionAt I J n f x) : ContinuousAt f x :=
602596
h.isImmersionAtOfComplement_complement.continuousAt
603597

604-
variable [IsManifold I n M] [IsManifold J n N]
605-
606598
/-- Prefer using `IsImmersionAt.contMDiffAt` instead -/
607599
theorem contMDiffOn (h : IsImmersionAt I J n f x) : CMDiff[h.domChart.source] n f :=
608600
h.isImmersionAtOfComplement_complement.contMDiffOn
@@ -707,7 +699,7 @@ lemma of_opens [IsManifold I n M] (s : TopologicalSpace.Opens M) :
707699
@[deprecated (since := "2025-12-16")] alias ofOpen := of_opens
708700

709701
/-- A `C^n` immersion is `C^n`. -/
710-
theorem contMDiff [IsManifold I n M] [IsManifold J n N]
702+
theorem contMDiff
711703
(h : IsImmersionOfComplement F I J n f) : CMDiff n f :=
712704
fun x ↦ (h x).contMDiffAt
713705

@@ -774,7 +766,7 @@ lemma of_opens [IsManifold I n M] (s : TopologicalSpace.Opens M) :
774766
@[deprecated (since := "2025-12-16")] alias ofOpen := of_opens
775767

776768
/-- A `C^n` immersion is `C^n`. -/
777-
theorem contMDiff [IsManifold I n M] [IsManifold J n N]
769+
theorem contMDiff
778770
(h : IsImmersion I J n f) : CMDiff n f :=
779771
h.isImmersionOfComplement_complement.contMDiff
780772

0 commit comments

Comments
 (0)