Skip to content

Commit 3229f7d

Browse files
grunwegReemMelamed
authored andcommitted
feat: Sum.inl and Sum.inr are smooth embeddings (leanprover-community#40507)
This provides an alternative proof of their smoothness. A future PR will use this to golf the existing proofs. Inspired by in-person discussions with Christian Merten and Edward van de Meent.
1 parent 5210a06 commit 3229f7d

2 files changed

Lines changed: 41 additions & 0 deletions

File tree

Mathlib/Geometry/Manifold/Immersion.lean

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ This shortens the overall argument, as the definition of submersions has the sam
5454
* `IsImmersion.id`: the identity map is an immersion
5555
* `IsImmersion.of_opens`: the inclusion of an open subset `s → M` of a smooth manifold
5656
is a smooth immersion
57+
* `IsImmersionOfComplement.sumInl` and `IsImmersionOfComplement.sumInr`: given `C^n` manifolds
58+
`M` and `N`, `Sum.inl : M → M ⊕ N` and `Sum.inr : N → M ⊕ N` are `C^n` immersions
5759
* `IsImmersionAt.contMDiffAt`: if f is an immersion at `x`, it is `C^n` at `x`.
5860
* `IsImmersion.contMDiff`: if f is a `C^n` immersion, it is automatically `C^n`
5961
in the sense of `ContMDiff`.
@@ -615,6 +617,7 @@ In other words, `f` is an immersion at each `x ∈ M`.
615617
This definition has a fixed parameter `F`, which is a choice of complement of `E` in `E'`:
616618
being an immersion at `x` includes a choice of linear isomorphism between `E × F` and `E'`.
617619
-/
620+
@[expose]
618621
def IsImmersionOfComplement (f : M → N) : Prop := ∀ x, IsImmersionAtOfComplement F I J n f x
619622

620623
variable (I J n) in
@@ -696,6 +699,32 @@ lemma of_opens [IsManifold I n M] (s : TopologicalSpace.Opens M) :
696699
IsImmersionOfComplement PUnit I I n (Subtype.val : s → M) :=
697700
fun y ↦ IsImmersionAtOfComplement.of_opens s y
698701

702+
/-- Given `C^n` manifolds `M` and `N` over the same model `I`,
703+
`Sum.inl : M → M ⊕ N` is a `C^n` immersion with complement `Unit` -/
704+
lemma sumInl {M' : Type*} [TopologicalSpace M'] [ChartedSpace H M'] [IsManifold I n M]
705+
[IsManifold I n M'] : IsImmersionOfComplement Unit I I n (@Sum.inl M M') := by
706+
intro x
707+
apply IsImmersionAtOfComplement.mk_of_continuousAt (equiv := (.prodUnique 𝕜 E _))
708+
(by fun_prop) _ _ (mem_chart_source H x) (mem_chart_source H (Sum.inl x))
709+
(IsManifold.chart_mem_maximalAtlas x) (IsManifold.chart_mem_maximalAtlas (Sum.inl x))
710+
intro y hy
711+
have : I ((chartAt H x) ((chartAt H x).symm (I.symm y))) = y := by
712+
rw [(chartAt H x).right_inv (by simp_all), I.right_inv (by simp_all)]
713+
simpa
714+
715+
/-- Given `C^n` manifolds `M` and `N` over the same model `I`,
716+
`Sum.inr : N → M ⊕ N` is a `C^n` immersion with complement `Unit` -/
717+
lemma sumInr {M' : Type*} [TopologicalSpace M'] [ChartedSpace H M'] [IsManifold I n M]
718+
[IsManifold I n M'] : IsImmersionOfComplement Unit I I n (@Sum.inr M M') := by
719+
intro x
720+
apply IsImmersionAtOfComplement.mk_of_continuousAt (equiv := (.prodUnique 𝕜 E _))
721+
(by fun_prop) _ _ (mem_chart_source H x) (mem_chart_source H (Sum.inr x))
722+
(IsManifold.chart_mem_maximalAtlas x) (IsManifold.chart_mem_maximalAtlas (Sum.inr x))
723+
intro y hy
724+
have : I ((chartAt H x) ((chartAt H x).symm (I.symm y))) = y := by
725+
rw [(chartAt H x).right_inv (by simp_all), I.right_inv (by simp_all)]
726+
simpa
727+
699728
@[deprecated (since := "2025-12-16")] alias ofOpen := of_opens
700729

701730
/-- A `C^n` immersion is `C^n`. -/

Mathlib/Geometry/Manifold/SmoothEmbedding.lean

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ This will be useful to define embedded submanifolds.
2222
* `IsSmoothEmbedding.id`: the identity map is a smooth embedding
2323
* `IsSmoothEmbedding.of_opens`: the inclusion of an open subset `s → M` of a smooth manifold
2424
is a smooth embedding
25+
* `IsSmoothEmbedding.sumInl` and `IsSmoothEmbedding.sumInr`: given `C^n` manifolds `M` and `N`,
26+
`Sum.inl : M → M ⊕ N` and `Sum.inr : N → M ⊕ N` are `C^n` embeddings
2527
* `IsSmoothEmbedding.contMDiff`: if `f` is a `C^n` embedding, it is automatically `C^n`
2628
in the sense of `ContMDiff`.
2729
@@ -92,6 +94,16 @@ lemma of_opens [IsManifold I n M] (s : TopologicalSpace.Opens M) :
9294
rw [isSmoothEmbedding_iff]
9395
exact ⟨IsImmersion.of_opens s, IsEmbedding.subtypeVal⟩
9496

97+
/-- Given `C^n` manifolds `M` and `N`, `Sum.inl : M → M ⊕ N` is a `C^n` embedding. -/
98+
lemma sumInl {M' : Type*} [TopologicalSpace M'] [ChartedSpace H M']
99+
[IsManifold I n M] [IsManifold I n M'] : IsSmoothEmbedding I I n (@Sum.inl M M') :=
100+
⟨IsImmersionOfComplement.sumInl.isImmersion, Topology.IsEmbedding.inl⟩
101+
102+
/-- Given `C^n` manifolds `M` and `N`, `Sum.inr : N → M ⊕ N` is a `C^n` embedding. -/
103+
lemma sumInr {M' : Type*} [TopologicalSpace M'] [ChartedSpace H M']
104+
[IsManifold I n M] [IsManifold I n M'] : IsSmoothEmbedding I I n (@Sum.inr M M') :=
105+
⟨IsImmersionOfComplement.sumInr.isImmersion, Topology.IsEmbedding.inr⟩
106+
95107
/-- A smooth embedding is automatically smooth. -/
96108
lemma contMDiff (hf : IsSmoothEmbedding I J n f) :
97109
ContMDiff I J n f :=

0 commit comments

Comments
 (0)