Skip to content

Commit 9aa5b55

Browse files
committed
feat: the set of points where IsImmersionAt(OfComplement) holds is open (#30356)
Prove an API lemma which `chrisflav` requested in #28793, which was split from that PR to keep the diff smaller.
1 parent ea4910a commit 9aa5b55

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

Mathlib/Geometry/Manifold/Immersion.lean

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ This shortens the overall argument, as the definition of submersions has the sam
4545
* `IsImmersionAtOfComplement.congr_F`, `IsImmersionOfComplement.congr_F`:
4646
being an immersion (at `x`) w.r.t. `F` is stable under
4747
replacing the complement `F` by an isomorphic copy
48+
* `IsOpen.isImmersionAtOfComplement` and `IsOpen.isImmersionAt`:
49+
the set of points where `IsImmersionAt(OfComplement)` holds is open.
4850
4951
## Implementation notes
5052
@@ -64,7 +66,6 @@ This shortens the overall argument, as the definition of submersions has the sam
6466
## TODO
6567
* The converse to `IsImmersionAtOfComplement.congr_F` also holds: any two complements are
6668
isomorphic, as they are isomorphic to the cokernel of the differential `mfderiv I J f x`.
67-
* The set where `IsImmersionAt(OfComplement)` holds is open.
6869
* `IsImmersionAt.contMDiffAt`: if f is an immersion at `x`, it is `C^n` at `x`.
6970
* `IsImmersion.contMDiff`: if f is an immersion, it is `C^n`.
7071
* `IsImmersionAt.prodMap`: the product of two immersions is an immersion.
@@ -356,6 +357,12 @@ lemma congr_F (e : F ≃L[𝕜] F') :
356357
IsImmersionAtOfComplement F I J n f x ↔ IsImmersionAtOfComplement F' I J n f x :=
357358
fun h ↦ trans_F (e := e) h, fun h ↦ trans_F (e := e.symm) h⟩
358359

360+
/- The set of points where `IsImmersionAtOfComplement` holds is open. -/
361+
lemma _root_.IsOpen.isImmersionAtOfComplement :
362+
IsOpen {x | IsImmersionAtOfComplement F I J n f x} := by
363+
simp_rw [IsImmersionAtOfComplement_def]
364+
exact .liftSourceTargetPropertyAt
365+
359366
/-- If `f` is an immersion at `x` w.r.t. some complement `F`, it is an immersion at `x`.
360367
361368
Note that the proof contains a small formalisation-related subtlety: `F` can live in any universe,
@@ -515,6 +522,14 @@ lemma congr_iff (hfg : f =ᶠ[𝓝 x] g) :
515522
IsImmersionAt I J n f x ↔ IsImmersionAt I J n g x :=
516523
fun h ↦ h.congr_of_eventuallyEq hfg, fun h ↦ h.congr_of_eventuallyEq hfg.symm⟩
517524

525+
/- The set of points where `IsImmersionAt` holds is open. -/
526+
lemma _root_.IsOpen.isImmersionAt :
527+
IsOpen {x | IsImmersionAt I J n f x} := by
528+
rw [isOpen_iff_forall_mem_open]
529+
exact fun x hx ↦ ⟨{x | IsImmersionAtOfComplement hx.complement I J n f x },
530+
fun y hy ↦ hy.isImmersionAt, .isImmersionAtOfComplement,
531+
by simp [hx.isImmersionAtOfComplement_complement]⟩
532+
518533
end IsImmersionAt
519534

520535
variable (F I J n) in

Mathlib/Geometry/Manifold/LocalSourceTargetProperty.lean

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ local property of this form.
3333
`f` has this property at `x` if there exist charts `φ` and `ψ` such that `P f φ ψ` holds.
3434
* `Manifold.LiftSourceTargetPropertyAt.congr_of_eventuallyEq`: if `f` has property `P` at `x`
3535
and `g` equals `f` near `x`, then `g` also has property `P` at `x`.
36+
* `IsOpen.liftSourceTargetPropertyAt`: the set of points at which `LiftSourceTargetPropertyAt`
37+
holds is open
3638
3739
-/
3840

@@ -194,6 +196,19 @@ lemma congr_iff_of_eventuallyEq (hP : IsLocalSourceTargetProperty P) (h' : f =
194196
LiftSourceTargetPropertyAt I I' n f x P ↔ LiftSourceTargetPropertyAt I I' n g x P :=
195197
fun hf ↦ hf.congr_of_eventuallyEq hP h', fun hg ↦ hg.congr_of_eventuallyEq hP h'.symm⟩
196198

199+
/- The set of points where `LiftSourceTargetPropertyAt` holds is open. -/
200+
lemma _root_.IsOpen.liftSourceTargetPropertyAt :
201+
IsOpen {x | LiftSourceTargetPropertyAt I I' n g x P} := by
202+
rw [isOpen_iff_forall_mem_open]
203+
intro x hx
204+
-- Suppose the lifted property `P` holds at `x`:
205+
-- choose slice charts `φ` near `x` and `ψ` near `f x` s.t. `P f φ ψ` holds.
206+
-- Then the same charts witness that `P f φ ψ` holds at any `y ∈ φ.source`.
207+
refine ⟨hx.domChart.source, fun y hy ↦ ?_, hx.domChart.open_source, hx.mem_domChart_source⟩
208+
exact ⟨hx.domChart, hx.codChart, hy, hx.source_subset_preimage_source hy,
209+
hx.domChart_mem_maximalAtlas, hx.codChart_mem_maximalAtlas, hx.source_subset_preimage_source,
210+
hx.property⟩
211+
197212
end LiftSourceTargetPropertyAt
198213

199214
end Manifold

0 commit comments

Comments
 (0)