Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 17 additions & 21 deletions Mathlib/Geometry/Manifold/Immersion.lean
Original file line number Diff line number Diff line change
Expand Up @@ -43,27 +43,27 @@ This shortens the overall argument, as the definition of submersions has the sam
If `f` and `g` agree near `x` and `f` is an immersion at `x`, so is `g`
* `IsImmersionAtOfComplement.congr_F`, `IsImmersionOfComplement.congr_F`:
being an immersion (at `x`) w.r.t. `F` is stable under
replacing the complement `F` by an isomorphic copy
replacing the complement `F` by an isomorphic copy.
* `IsOpen.isImmersionAtOfComplement` and `IsOpen.isImmersionAt`:
the set of points where `IsImmersionAt(OfComplement)` holds is open.
* `IsImmersionAt.prodMap` and `IsImmersion.prodMap`: the product of two immersions (at a point)
is an immersion (at a point).
is an immersion (at the product point).
* `IsImmersion.id`: the identity map is an immersion
* `IsImmersion.of_opens`: the inclusion of an open subset `s → M` of a smooth manifold
is a smooth immersion

## Implementation notes

* In most applications, there is no need to control the chosen complement in the definition of
immersions, so `IsImmersion(At)` is perfectly fine to use. Such control will be helpful, however,
* In most applications, there is no need to control the choice of complement in the definition of an
immersion, so `IsImmersion(At)` is perfectly adequate. Such control will be helpful, however,
when considering the local characterisation of submanifolds: locally, a submanifold is described
either as the image of an immersion, or the preimage of a submersion --- w.r.t. the same
complement. Having access to a definition version with complements allows stating this equivalence
cleanly.
complement. Providing a version of the definition that includes complements enables stating this
equivalence cleanly.
* To avoid a free universe variable in `IsImmersion(At)`, we ask for a complement in the same
universe as the model normed space for `N`. We provide convenience constructors which do not
have this restriction (recovering usability).
The underlying observation is that the equivalence in the definition of immersions allows
have this restriction to preserve usability.
This relies on the observation that the equivalence in the definition of immersions allows
shrinking the universe of the complement: this is implemented in
`IsImmersion(At)OfComplement.small` and `IsImmersion(At)OfComplement.smallEquiv`.

Expand Down Expand Up @@ -92,11 +92,9 @@ This shortens the overall argument, as the definition of submersions has the sam
-/

open scoped Topology ContDiff
open Function Set Manifold
open Function Set

@[expose] public section

noncomputable section
@[expose] public noncomputable section

namespace Manifold

Expand Down Expand Up @@ -135,11 +133,9 @@ omit [ChartedSpace H M] [ChartedSpace G N] in
/-- Being an immersion at `x` is a local property. -/
lemma isLocalSourceTargetProperty_immersionAtProp :
IsLocalSourceTargetProperty (ImmersionAtProp F I J M N) where
mono_source {f φ ψ s} hs hf := by
obtain ⟨equiv, hf⟩ := hf
exact ⟨equiv, hf.mono (by simp; grind)⟩
congr {f g φ ψ} hfg hf := by
obtain ⟨equiv, hf⟩ := hf
mono_source {f φ ψ s} hs := fun ⟨equiv, hf⟩ ↦ ⟨equiv, hf.mono (by simp; grind)⟩
congr {f g φ ψ} hfg := by
intro ⟨equiv, hf⟩
refine ⟨equiv, EqOn.trans (fun x hx ↦ ?_) (hf.mono (by simp))⟩
have : ((φ.extend I).symm) x ∈ φ.source := by simp_all
grind
Expand Down Expand Up @@ -447,11 +443,11 @@ def complement (h : IsImmersionAt I J n f x) : Type u := by
rw [IsImmersionAt_def] at h
exact Classical.choose h

noncomputable instance (h : IsImmersionAt I J n f x) : NormedAddCommGroup h.complement := by
instance (h : IsImmersionAt I J n f x) : NormedAddCommGroup h.complement := by
rw [IsImmersionAt_def] at h
exact Classical.choose <| Classical.choose_spec h

noncomputable instance (h : IsImmersionAt I J n f x) : NormedSpace 𝕜 h.complement := by
instance (h : IsImmersionAt I J n f x) : NormedSpace 𝕜 h.complement := by
rw [IsImmersionAt_def] at h
exact Classical.choose <| Classical.choose_spec <| Classical.choose_spec h

Expand Down Expand Up @@ -684,10 +680,10 @@ variable {f g : M → N}
`E'` of `N` -/
def complement (h : IsImmersion I J n f) : Type u := Classical.choose h

noncomputable instance (h : IsImmersion I J n f) : NormedAddCommGroup h.complement :=
instance (h : IsImmersion I J n f) : NormedAddCommGroup h.complement :=
Classical.choose <| Classical.choose_spec h

noncomputable instance (h : IsImmersion I J n f) : NormedSpace 𝕜 h.complement :=
instance (h : IsImmersion I J n f) : NormedSpace 𝕜 h.complement :=
Classical.choose <| Classical.choose_spec <| Classical.choose_spec h

lemma isImmersionOfComplement_complement (h : IsImmersion I J n f) :
Expand Down
Loading