Skip to content

Commit c9fc36e

Browse files
committed
feat: expand API of ContMDiff and MFDeriv (#18623)
Sequel to #17927 and #18447.
1 parent ea4bde9 commit c9fc36e

File tree

6 files changed

+735
-60
lines changed

6 files changed

+735
-60
lines changed

Mathlib/Geometry/Manifold/ContMDiff/Atlas.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,17 @@ theorem contMDiffOn_extChartAt_symm (x : M) :
9999
convert contMDiffOn_extend_symm (chart_mem_maximalAtlas (I := I) x)
100100
rw [extChartAt_target, I.image_eq]
101101

102+
theorem contMDiffWithinAt_extChartAt_symm_target
103+
(x : M) {y : E} (hy : y ∈ (extChartAt I x).target) :
104+
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (extChartAt I x).target y :=
105+
contMDiffOn_extChartAt_symm x y hy
106+
107+
theorem contMDiffWithinAt_extChartAt_symm_range
108+
(x : M) {y : E} (hy : y ∈ (extChartAt I x).target) :
109+
ContMDiffWithinAt 𝓘(𝕜, E) I n (extChartAt I x).symm (range I) y :=
110+
(contMDiffWithinAt_extChartAt_symm_target x hy).mono_of_mem_nhdsWithin
111+
(extChartAt_target_mem_nhdsWithin_of_mem hy)
112+
102113
/-- An element of `contDiffGroupoid ⊤ I` is `C^n` for any `n`. -/
103114
theorem contMDiffOn_of_mem_contDiffGroupoid {e' : PartialHomeomorph H H}
104115
(h : e' ∈ contDiffGroupoid ⊤ I) : ContMDiffOn I I n e' e'.source :=

Mathlib/Geometry/Manifold/ContMDiff/Defs.lean

Lines changed: 79 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -654,10 +654,16 @@ theorem ContMDiffWithinAt.mono (hf : ContMDiffWithinAt I I' n f s x) (hts : t
654654
ContMDiffWithinAt I I' n f t x :=
655655
hf.mono_of_mem_nhdsWithin <| mem_of_superset self_mem_nhdsWithin hts
656656

657-
theorem contMDiffWithinAt_congr_nhds (hst : 𝓝[s] x = 𝓝[t] x) :
657+
theorem contMDiffWithinAt_congr_set (h : s =ᶠ[𝓝 x] t) :
658658
ContMDiffWithinAt I I' n f s x ↔ ContMDiffWithinAt I I' n f t x :=
659-
fun h => h.mono_of_mem_nhdsWithin <| hst ▸ self_mem_nhdsWithin, fun h =>
660-
h.mono_of_mem_nhdsWithin <| hst.symm ▸ self_mem_nhdsWithin⟩
659+
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_set h
660+
661+
theorem ContMDiffWithinAt.congr_set (h : ContMDiffWithinAt I I' n f s x) (hst : s =ᶠ[𝓝 x] t) :
662+
ContMDiffWithinAt I I' n f t x :=
663+
(contMDiffWithinAt_congr_set hst).1 h
664+
665+
@[deprecated (since := "2024-10-23")]
666+
alias contMDiffWithinAt_congr_nhds := contMDiffWithinAt_congr_set
661667

662668
theorem contMDiffWithinAt_insert_self :
663669
ContMDiffWithinAt I I' n f (insert x s) x ↔ ContMDiffWithinAt I I' n f s x := by
@@ -669,24 +675,32 @@ theorem contMDiffWithinAt_insert_self :
669675
alias ⟨ContMDiffWithinAt.of_insert, _⟩ := contMDiffWithinAt_insert_self
670676

671677
-- TODO: use `alias` again once it can make protected theorems
672-
theorem ContMDiffWithinAt.insert (h : ContMDiffWithinAt I I' n f s x) :
678+
protected theorem ContMDiffWithinAt.insert (h : ContMDiffWithinAt I I' n f s x) :
673679
ContMDiffWithinAt I I' n f (insert x s) x :=
674680
contMDiffWithinAt_insert_self.2 h
675681

676-
theorem ContMDiffAt.contMDiffWithinAt (hf : ContMDiffAt I I' n f x) :
682+
/-- Being `C^n` in a set only depends on the germ of the set. Version where one only requires
683+
the two sets to coincide locally in the complement of a point `y`. -/
684+
theorem contMDiffWithinAt_congr_set' (y : M) (h : s =ᶠ[𝓝[{y}ᶜ] x] t) :
685+
ContMDiffWithinAt I I' n f s x ↔ ContMDiffWithinAt I I' n f t x := by
686+
have : T1Space M := I.t1Space M
687+
rw [← contMDiffWithinAt_insert_self (s := s), ← contMDiffWithinAt_insert_self (s := t)]
688+
exact contMDiffWithinAt_congr_set (eventuallyEq_insert h)
689+
690+
protected theorem ContMDiffAt.contMDiffWithinAt (hf : ContMDiffAt I I' n f x) :
677691
ContMDiffWithinAt I I' n f s x :=
678692
ContMDiffWithinAt.mono hf (subset_univ _)
679693

680-
theorem SmoothAt.smoothWithinAt (hf : SmoothAt I I' f x) : SmoothWithinAt I I' f s x :=
694+
protected theorem SmoothAt.smoothWithinAt (hf : SmoothAt I I' f x) : SmoothWithinAt I I' f s x :=
681695
ContMDiffAt.contMDiffWithinAt hf
682696

683697
theorem ContMDiffOn.mono (hf : ContMDiffOn I I' n f s) (hts : t ⊆ s) : ContMDiffOn I I' n f t :=
684698
fun x hx => (hf x (hts hx)).mono hts
685699

686-
theorem ContMDiff.contMDiffOn (hf : ContMDiff I I' n f) : ContMDiffOn I I' n f s := fun x _ =>
687-
(hf x).contMDiffWithinAt
700+
protected theorem ContMDiff.contMDiffOn (hf : ContMDiff I I' n f) : ContMDiffOn I I' n f s :=
701+
fun x _ => (hf x).contMDiffWithinAt
688702

689-
theorem Smooth.smoothOn (hf : Smooth I I' f) : SmoothOn I I' f s :=
703+
protected theorem Smooth.smoothOn (hf : Smooth I I' f) : SmoothOn I I' f s :=
690704
ContMDiff.contMDiffOn hf
691705

692706
theorem contMDiffWithinAt_inter' (ht : t ∈ 𝓝[s] x) :
@@ -697,19 +711,20 @@ theorem contMDiffWithinAt_inter (ht : t ∈ 𝓝 x) :
697711
ContMDiffWithinAt I I' n f (s ∩ t) x ↔ ContMDiffWithinAt I I' n f s x :=
698712
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_inter ht
699713

700-
theorem ContMDiffWithinAt.contMDiffAt (h : ContMDiffWithinAt I I' n f s x) (ht : s ∈ 𝓝 x) :
714+
protected theorem ContMDiffWithinAt.contMDiffAt
715+
(h : ContMDiffWithinAt I I' n f s x) (ht : s ∈ 𝓝 x) :
701716
ContMDiffAt I I' n f x :=
702717
(contDiffWithinAt_localInvariantProp n).liftPropAt_of_liftPropWithinAt h ht
703718

704-
theorem SmoothWithinAt.smoothAt (h : SmoothWithinAt I I' f s x) (ht : s ∈ 𝓝 x) :
719+
protected theorem SmoothWithinAt.smoothAt (h : SmoothWithinAt I I' f s x) (ht : s ∈ 𝓝 x) :
705720
SmoothAt I I' f x :=
706721
ContMDiffWithinAt.contMDiffAt h ht
707722

708-
theorem ContMDiffOn.contMDiffAt (h : ContMDiffOn I I' n f s) (hx : s ∈ 𝓝 x) :
723+
protected theorem ContMDiffOn.contMDiffAt (h : ContMDiffOn I I' n f s) (hx : s ∈ 𝓝 x) :
709724
ContMDiffAt I I' n f x :=
710725
(h x (mem_of_mem_nhds hx)).contMDiffAt hx
711726

712-
theorem SmoothOn.smoothAt (h : SmoothOn I I' f s) (hx : s ∈ 𝓝 x) : SmoothAt I I' f x :=
727+
protected theorem SmoothOn.smoothAt (h : SmoothOn I I' f s) (hx : s ∈ 𝓝 x) : SmoothAt I I' f x :=
713728
h.contMDiffAt hx
714729

715730
theorem contMDiffOn_iff_source_of_mem_maximalAtlas [SmoothManifoldWithCorners I M]
@@ -719,9 +734,8 @@ theorem contMDiffOn_iff_source_of_mem_maximalAtlas [SmoothManifoldWithCorners I
719734
simp_rw [ContMDiffOn, Set.forall_mem_image]
720735
refine forall₂_congr fun x hx => ?_
721736
rw [contMDiffWithinAt_iff_source_of_mem_maximalAtlas he (hs hx)]
722-
apply contMDiffWithinAt_congr_nhds
723-
simp_rw [nhdsWithin_eq_iff_eventuallyEq,
724-
e.extend_symm_preimage_inter_range_eventuallyEq hs (hs hx)]
737+
apply contMDiffWithinAt_congr_set
738+
simp_rw [e.extend_symm_preimage_inter_range_eventuallyEq hs (hs hx)]
725739

726740
-- Porting note: didn't compile; fixed by golfing the proof and moving parts to lemmas
727741
/-- A function is `C^n` within a set at a point, for `n : ℕ`, if and only if it is `C^n` on
@@ -757,6 +771,29 @@ theorem contMDiffWithinAt_iff_contMDiffOn_nhds
757771
rwa [contMDiffOn_iff_of_subset_source' hv₁ hv₂, PartialEquiv.image_symm_image_of_subset_target]
758772
exact hsub.trans inter_subset_left
759773

774+
/-- If a function is `C^m` within a set at a point, for some finite `m`, then it is `C^m` within
775+
this set on an open set around the basepoint.
776+
-/
777+
theorem ContMDiffWithinAt.contMDiffOn'
778+
[SmoothManifoldWithCorners I M] [SmoothManifoldWithCorners I' M']
779+
{m : ℕ} (hm : (m : ℕ∞) ≤ n)
780+
(h : ContMDiffWithinAt I I' n f s x) :
781+
∃ u, IsOpen u ∧ x ∈ u ∧ ContMDiffOn I I' m f (insert x s ∩ u) := by
782+
rcases contMDiffWithinAt_iff_contMDiffOn_nhds.1 (h.of_le hm) with ⟨t, ht, h't⟩
783+
rcases mem_nhdsWithin.1 ht with ⟨u, u_open, xu, hu⟩
784+
rw [inter_comm] at hu
785+
exact ⟨u, u_open, xu, h't.mono hu⟩
786+
787+
/-- If a function is `C^m` within a set at a point, for some finite `m`, then it is `C^m` within
788+
this set on a neighborhood of the basepoint. -/
789+
theorem ContMDiffWithinAt.contMDiffOn
790+
[SmoothManifoldWithCorners I M] [SmoothManifoldWithCorners I' M']
791+
{m : ℕ} (hm : (m : ℕ∞) ≤ n)
792+
(h : ContMDiffWithinAt I I' n f s x) :
793+
∃ u ∈ 𝓝[insert x s] x, u ⊆ insert x s ∧ ContMDiffOn I I' m f u := by
794+
let ⟨_u, uo, xu, h⟩ := h.contMDiffOn' hm
795+
exact ⟨_, inter_mem_nhdsWithin _ (uo.mem_nhds xu), inter_subset_left, h⟩
796+
760797
/-- A function is `C^n` at a point, for `n : ℕ`, if and only if it is `C^n` on
761798
a neighborhood of this point. -/
762799
theorem contMDiffAt_iff_contMDiffOn_nhds
@@ -775,6 +812,19 @@ theorem contMDiffAt_iff_contMDiffAt_nhds
775812
refine (eventually_mem_nhds_iff.mpr hu).mono fun x' hx' => ?_
776813
exact (h x' <| mem_of_mem_nhds hx').contMDiffAt hx'
777814

815+
/-- Note: This does not hold for `n = ∞`. `f` being `C^∞` at `x` means that for every `n`, `f` is
816+
`C^n` on some neighborhood of `x`, but this neighborhood can depend on `n`. -/
817+
theorem contMDiffWithinAt_iff_contMDiffWithinAt_nhdsWithin
818+
[SmoothManifoldWithCorners I M] [SmoothManifoldWithCorners I' M'] {n : ℕ} :
819+
ContMDiffWithinAt I I' n f s x ↔
820+
∀ᶠ x' in 𝓝[insert x s] x, ContMDiffWithinAt I I' n f s x' := by
821+
refine ⟨?_, fun h ↦ mem_of_mem_nhdsWithin (mem_insert x s) h⟩
822+
rw [contMDiffWithinAt_iff_contMDiffOn_nhds]
823+
rintro ⟨u, hu, h⟩
824+
filter_upwards [hu, eventually_mem_nhdsWithin_iff.mpr hu] with x' h'x' hx'
825+
apply (h x' h'x').mono_of_mem_nhdsWithin
826+
exact nhdsWithin_mono _ (subset_insert x s) hx'
827+
778828
/-! ### Congruence lemmas -/
779829

780830
theorem ContMDiffWithinAt.congr (h : ContMDiffWithinAt I I' n f s x) (h₁ : ∀ y ∈ s, f₁ y = f y)
@@ -785,10 +835,23 @@ theorem contMDiffWithinAt_congr (h₁ : ∀ y ∈ s, f₁ y = f y) (hx : f₁ x
785835
ContMDiffWithinAt I I' n f₁ s x ↔ ContMDiffWithinAt I I' n f s x :=
786836
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_iff h₁ hx
787837

838+
theorem ContMDiffWithinAt.congr_of_mem
839+
(h : ContMDiffWithinAt I I' n f s x) (h₁ : ∀ y ∈ s, f₁ y = f y) (hx : x ∈ s) :
840+
ContMDiffWithinAt I I' n f₁ s x :=
841+
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_of_mem h h₁ hx
842+
843+
theorem contMDiffWithinAt_congr_of_mem (h₁ : ∀ y ∈ s, f₁ y = f y) (hx : x ∈ s) :
844+
ContMDiffWithinAt I I' n f₁ s x ↔ ContMDiffWithinAt I I' n f s x :=
845+
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_iff_of_mem h₁ hx
846+
788847
theorem ContMDiffWithinAt.congr_of_eventuallyEq (h : ContMDiffWithinAt I I' n f s x)
789848
(h₁ : f₁ =ᶠ[𝓝[s] x] f) (hx : f₁ x = f x) : ContMDiffWithinAt I I' n f₁ s x :=
790849
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_of_eventuallyEq h h₁ hx
791850

851+
theorem ContMDiffWithinAt.congr_of_eventuallyEq_of_mem (h : ContMDiffWithinAt I I' n f s x)
852+
(h₁ : f₁ =ᶠ[𝓝[s] x] f) (hx : x ∈ s) : ContMDiffWithinAt I I' n f₁ s x :=
853+
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_of_eventuallyEq_of_mem h h₁ hx
854+
792855
theorem Filter.EventuallyEq.contMDiffWithinAt_iff (h₁ : f₁ =ᶠ[𝓝[s] x] f) (hx : f₁ x = f x) :
793856
ContMDiffWithinAt I I' n f₁ s x ↔ ContMDiffWithinAt I I' n f s x :=
794857
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_iff_of_eventuallyEq h₁ hx

Mathlib/Geometry/Manifold/ContMDiff/Product.lean

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜]
3636
{F' : Type*}
3737
[NormedAddCommGroup F'] [NormedSpace 𝕜 F'] {G' : Type*} [TopologicalSpace G']
3838
{J' : ModelWithCorners 𝕜 F' G'} {N' : Type*} [TopologicalSpace N'] [ChartedSpace G' N']
39+
-- declare a few vector spaces
40+
{F₁ : Type*} [NormedAddCommGroup F₁] [NormedSpace 𝕜 F₁]
41+
{F₂ : Type*} [NormedAddCommGroup F₂] [NormedSpace 𝕜 F₂]
3942
-- declare functions, sets, points and smoothness indices
4043
{f : M → M'} {s : Set M} {x : M} {n : ℕ∞}
4144

@@ -229,21 +232,53 @@ theorem Smooth.snd {f : N → M × M'} (hf : Smooth J (I.prod I') f) : Smooth J
229232

230233
end Projections
231234

232-
theorem contMDiffWithinAt_prod_iff (f : M → M' × N') {s : Set M} {x : M} :
235+
theorem contMDiffWithinAt_prod_iff (f : M → M' × N') :
233236
ContMDiffWithinAt I (I'.prod J') n f s x ↔
234237
ContMDiffWithinAt I I' n (Prod.fst ∘ f) s x ∧ ContMDiffWithinAt I J' n (Prod.snd ∘ f) s x :=
235238
fun h => ⟨h.fst, h.snd⟩, fun h => h.1.prod_mk h.2
236239

237-
theorem contMDiffAt_prod_iff (f : M → M' × N') {x : M} :
240+
theorem contMDiffWithinAt_prod_module_iff (f : M → F₁ × F₂) :
241+
ContMDiffWithinAt I 𝓘(𝕜, F₁ × F₂) n f s x ↔
242+
ContMDiffWithinAt I 𝓘(𝕜, F₁) n (Prod.fst ∘ f) s x ∧
243+
ContMDiffWithinAt I 𝓘(𝕜, F₂) n (Prod.snd ∘ f) s x := by
244+
rw [modelWithCornersSelf_prod, ← chartedSpaceSelf_prod]
245+
exact contMDiffWithinAt_prod_iff f
246+
247+
theorem contMDiffAt_prod_iff (f : M → M' × N') :
238248
ContMDiffAt I (I'.prod J') n f x ↔
239249
ContMDiffAt I I' n (Prod.fst ∘ f) x ∧ ContMDiffAt I J' n (Prod.snd ∘ f) x := by
240250
simp_rw [← contMDiffWithinAt_univ]; exact contMDiffWithinAt_prod_iff f
241251

252+
theorem contMDiffAt_prod_module_iff (f : M → F₁ × F₂) :
253+
ContMDiffAt I 𝓘(𝕜, F₁ × F₂) n f x ↔
254+
ContMDiffAt I 𝓘(𝕜, F₁) n (Prod.fst ∘ f) x ∧ ContMDiffAt I 𝓘(𝕜, F₂) n (Prod.snd ∘ f) x := by
255+
rw [modelWithCornersSelf_prod, ← chartedSpaceSelf_prod]
256+
exact contMDiffAt_prod_iff f
257+
258+
theorem contMDiffOn_prod_iff (f : M → M' × N') :
259+
ContMDiffOn I (I'.prod J') n f s ↔
260+
ContMDiffOn I I' n (Prod.fst ∘ f) s ∧ ContMDiffOn I J' n (Prod.snd ∘ f) s :=
261+
fun h ↦ ⟨fun x hx ↦ ((contMDiffWithinAt_prod_iff f).1 (h x hx)).1,
262+
fun x hx ↦ ((contMDiffWithinAt_prod_iff f).1 (h x hx)).2⟩ ,
263+
fun h x hx ↦ (contMDiffWithinAt_prod_iff f).2 ⟨h.1 x hx, h.2 x hx⟩⟩
264+
265+
theorem contMDiffOn_prod_module_iff (f : M → F₁ × F₂) :
266+
ContMDiffOn I 𝓘(𝕜, F₁ × F₂) n f s ↔
267+
ContMDiffOn I 𝓘(𝕜, F₁) n (Prod.fst ∘ f) s ∧ ContMDiffOn I 𝓘(𝕜, F₂) n (Prod.snd ∘ f) s := by
268+
rw [modelWithCornersSelf_prod, ← chartedSpaceSelf_prod]
269+
exact contMDiffOn_prod_iff f
270+
242271
theorem contMDiff_prod_iff (f : M → M' × N') :
243272
ContMDiff I (I'.prod J') n f ↔
244273
ContMDiff I I' n (Prod.fst ∘ f) ∧ ContMDiff I J' n (Prod.snd ∘ f) :=
245274
fun h => ⟨h.fst, h.snd⟩, fun h => by convert h.1.prod_mk h.2
246275

276+
theorem contMDiff_prod_module_iff (f : M → F₁ × F₂) :
277+
ContMDiff I 𝓘(𝕜, F₁ × F₂) n f ↔
278+
ContMDiff I 𝓘(𝕜, F₁) n (Prod.fst ∘ f) ∧ ContMDiff I 𝓘(𝕜, F₂) n (Prod.snd ∘ f) := by
279+
rw [modelWithCornersSelf_prod, ← chartedSpaceSelf_prod]
280+
exact contMDiff_prod_iff f
281+
247282
theorem smoothAt_prod_iff (f : M → M' × N') {x : M} :
248283
SmoothAt I (I'.prod J') f x ↔ SmoothAt I I' (Prod.fst ∘ f) x ∧ SmoothAt I J' (Prod.snd ∘ f) x :=
249284
contMDiffAt_prod_iff f

Mathlib/Geometry/Manifold/LocalInvariantProperties.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,13 @@ theorem liftPropWithinAt_inter (ht : t ∈ 𝓝 x) :
338338
LiftPropWithinAt P g (s ∩ t) x ↔ LiftPropWithinAt P g s x :=
339339
hG.liftPropWithinAt_inter' (mem_nhdsWithin_of_mem_nhds ht)
340340

341+
theorem liftPropWithinAt_congr_set (hu : s =ᶠ[𝓝 x] t) :
342+
LiftPropWithinAt P g s x ↔ LiftPropWithinAt P g t x := by
343+
rw [← hG.liftPropWithinAt_inter (s := s) hu, ← hG.liftPropWithinAt_inter (s := t) hu,
344+
← eq_iff_iff]
345+
congr 1
346+
aesop
347+
341348
theorem liftPropAt_of_liftPropWithinAt (h : LiftPropWithinAt P g s x) (hs : s ∈ 𝓝 x) :
342349
LiftPropAt P g x := by
343350
rwa [← univ_inter s, hG.liftPropWithinAt_inter hs] at h
@@ -370,6 +377,10 @@ theorem liftPropWithinAt_congr_of_eventuallyEq (h : LiftPropWithinAt P g s x) (h
370377
(fun y ↦ chartAt H' (g' x) (g' y) = chartAt H' (g x) (g y)) (mem_chart_source H x)]
371378
exact h₁.mono fun y hy ↦ by rw [hx, hy]
372379

380+
theorem liftPropWithinAt_congr_of_eventuallyEq_of_mem (h : LiftPropWithinAt P g s x)
381+
(h₁ : g' =ᶠ[𝓝[s] x] g) (h₂ : x ∈ s) : LiftPropWithinAt P g' s x :=
382+
liftPropWithinAt_congr_of_eventuallyEq hG h h₁ (mem_of_mem_nhdsWithin h₂ h₁ : _)
383+
373384
theorem liftPropWithinAt_congr_iff_of_eventuallyEq (h₁ : g' =ᶠ[𝓝[s] x] g) (hx : g' x = g x) :
374385
LiftPropWithinAt P g' s x ↔ LiftPropWithinAt P g s x :=
375386
fun h ↦ hG.liftPropWithinAt_congr_of_eventuallyEq h h₁.symm hx.symm,
@@ -379,10 +390,18 @@ theorem liftPropWithinAt_congr_iff (h₁ : ∀ y ∈ s, g' y = g y) (hx : g' x =
379390
LiftPropWithinAt P g' s x ↔ LiftPropWithinAt P g s x :=
380391
hG.liftPropWithinAt_congr_iff_of_eventuallyEq (eventually_nhdsWithin_of_forall h₁) hx
381392

393+
theorem liftPropWithinAt_congr_iff_of_mem (h₁ : ∀ y ∈ s, g' y = g y) (hx : x ∈ s) :
394+
LiftPropWithinAt P g' s x ↔ LiftPropWithinAt P g s x :=
395+
hG.liftPropWithinAt_congr_iff_of_eventuallyEq (eventually_nhdsWithin_of_forall h₁) (h₁ _ hx)
396+
382397
theorem liftPropWithinAt_congr (h : LiftPropWithinAt P g s x) (h₁ : ∀ y ∈ s, g' y = g y)
383398
(hx : g' x = g x) : LiftPropWithinAt P g' s x :=
384399
(hG.liftPropWithinAt_congr_iff h₁ hx).mpr h
385400

401+
theorem liftPropWithinAt_congr_of_mem (h : LiftPropWithinAt P g s x) (h₁ : ∀ y ∈ s, g' y = g y)
402+
(hx : x ∈ s) : LiftPropWithinAt P g' s x :=
403+
(hG.liftPropWithinAt_congr_iff h₁ (h₁ _ hx)).mpr h
404+
386405
theorem liftPropAt_congr_iff_of_eventuallyEq (h₁ : g' =ᶠ[𝓝 x] g) :
387406
LiftPropAt P g' x ↔ LiftPropAt P g x :=
388407
hG.liftPropWithinAt_congr_iff_of_eventuallyEq (by simp_rw [nhdsWithin_univ, h₁]) h₁.eq_of_nhds

0 commit comments

Comments
 (0)