@@ -654,10 +654,16 @@ theorem ContMDiffWithinAt.mono (hf : ContMDiffWithinAt I I' n f s x) (hts : t
654
654
ContMDiffWithinAt I I' n f t x :=
655
655
hf.mono_of_mem_nhdsWithin <| mem_of_superset self_mem_nhdsWithin hts
656
656
657
- theorem contMDiffWithinAt_congr_nhds (hst : 𝓝[s] x = 𝓝[t] x ) :
657
+ theorem contMDiffWithinAt_congr_set (h : s =ᶠ[𝓝 x] t ) :
658
658
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
661
667
662
668
theorem contMDiffWithinAt_insert_self :
663
669
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 :
669
675
alias ⟨ContMDiffWithinAt.of_insert, _⟩ := contMDiffWithinAt_insert_self
670
676
671
677
-- 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) :
673
679
ContMDiffWithinAt I I' n f (insert x s) x :=
674
680
contMDiffWithinAt_insert_self.2 h
675
681
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) :
677
691
ContMDiffWithinAt I I' n f s x :=
678
692
ContMDiffWithinAt.mono hf (subset_univ _)
679
693
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 :=
681
695
ContMDiffAt.contMDiffWithinAt hf
682
696
683
697
theorem ContMDiffOn.mono (hf : ContMDiffOn I I' n f s) (hts : t ⊆ s) : ContMDiffOn I I' n f t :=
684
698
fun x hx => (hf x (hts hx)).mono hts
685
699
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
688
702
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 :=
690
704
ContMDiff.contMDiffOn hf
691
705
692
706
theorem contMDiffWithinAt_inter' (ht : t ∈ 𝓝[s] x) :
@@ -697,19 +711,20 @@ theorem contMDiffWithinAt_inter (ht : t ∈ 𝓝 x) :
697
711
ContMDiffWithinAt I I' n f (s ∩ t) x ↔ ContMDiffWithinAt I I' n f s x :=
698
712
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_inter ht
699
713
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) :
701
716
ContMDiffAt I I' n f x :=
702
717
(contDiffWithinAt_localInvariantProp n).liftPropAt_of_liftPropWithinAt h ht
703
718
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) :
705
720
SmoothAt I I' f x :=
706
721
ContMDiffWithinAt.contMDiffAt h ht
707
722
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) :
709
724
ContMDiffAt I I' n f x :=
710
725
(h x (mem_of_mem_nhds hx)).contMDiffAt hx
711
726
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 :=
713
728
h.contMDiffAt hx
714
729
715
730
theorem contMDiffOn_iff_source_of_mem_maximalAtlas [SmoothManifoldWithCorners I M]
@@ -719,9 +734,8 @@ theorem contMDiffOn_iff_source_of_mem_maximalAtlas [SmoothManifoldWithCorners I
719
734
simp_rw [ContMDiffOn, Set.forall_mem_image]
720
735
refine forall₂_congr fun x hx => ?_
721
736
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)]
725
739
726
740
-- Porting note: didn't compile; fixed by golfing the proof and moving parts to lemmas
727
741
/-- 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
757
771
rwa [contMDiffOn_iff_of_subset_source' hv₁ hv₂, PartialEquiv.image_symm_image_of_subset_target]
758
772
exact hsub.trans inter_subset_left
759
773
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
+
760
797
/-- A function is `C^n` at a point, for `n : ℕ`, if and only if it is `C^n` on
761
798
a neighborhood of this point. -/
762
799
theorem contMDiffAt_iff_contMDiffOn_nhds
@@ -775,6 +812,19 @@ theorem contMDiffAt_iff_contMDiffAt_nhds
775
812
refine (eventually_mem_nhds_iff.mpr hu).mono fun x' hx' => ?_
776
813
exact (h x' <| mem_of_mem_nhds hx').contMDiffAt hx'
777
814
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
+
778
828
/-! ### Congruence lemmas -/
779
829
780
830
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
785
835
ContMDiffWithinAt I I' n f₁ s x ↔ ContMDiffWithinAt I I' n f s x :=
786
836
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_iff h₁ hx
787
837
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
+
788
847
theorem ContMDiffWithinAt.congr_of_eventuallyEq (h : ContMDiffWithinAt I I' n f s x)
789
848
(h₁ : f₁ =ᶠ[𝓝[s] x] f) (hx : f₁ x = f x) : ContMDiffWithinAt I I' n f₁ s x :=
790
849
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_of_eventuallyEq h h₁ hx
791
850
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
+
792
855
theorem Filter.EventuallyEq.contMDiffWithinAt_iff (h₁ : f₁ =ᶠ[𝓝[s] x] f) (hx : f₁ x = f x) :
793
856
ContMDiffWithinAt I I' n f₁ s x ↔ ContMDiffWithinAt I I' n f s x :=
794
857
(contDiffWithinAt_localInvariantProp n).liftPropWithinAt_congr_iff_of_eventuallyEq h₁ hx
0 commit comments