Skip to content

Commit 44d8803

Browse files
committed
feat: uniqueness API for implicit function of IsContDiffImplicitAt (#31988)
1 parent 4d9d3c5 commit 44d8803

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

Mathlib/Analysis/Calculus/Implicit.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,9 @@ complementary subspaces of `E`, then `implicitFunction` is the unique (germ of a
161161
def implicitFunction : F → G → E :=
162162
Function.curry <| φ.toOpenPartialHomeomorph.symm
163163

164+
lemma implicitFunction_apply {x : F} {y : G} :
165+
φ.implicitFunction x y = φ.toOpenPartialHomeomorph.symm (x, y) := rfl
166+
164167
@[simp]
165168
theorem toOpenPartialHomeomorph_coe : ⇑φ.toOpenPartialHomeomorph = φ.prodFun :=
166169
rfl
@@ -272,6 +275,11 @@ theorem map_implicitFunction_nhdsWithin_preimage (φ : ImplicitFunctionData 𝕜
272275
φ.toOpenPartialHomeomorph.leftInvOn hxs]
273276
· exact φ.toOpenPartialHomeomorph.mapsTo φ.pt_mem_toOpenPartialHomeomorph_source
274277

278+
theorem eventuallyEq_implicitFunction {ψ : F → G → E}
279+
(h : ∀ᶠ x in 𝓝 φ.pt, ψ (φ.leftFun x) (φ.rightFun x) = x) :
280+
Function.uncurry ψ =ᶠ[𝓝 (φ.prodFun φ.pt)] Function.uncurry φ.implicitFunction :=
281+
HasStrictFDerivAt.localInverse_unique _ h
282+
275283
end ImplicitFunctionData
276284

277285
namespace HasStrictFDerivAt

Mathlib/Analysis/Calculus/ImplicitContDiff.lean

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,16 @@ def implicitFunctionData (h : IsContDiffImplicitAt n f f' a) :
9898
exact ⟨(0, y), by simp, x - (0, y), by simp [map_sub, ← hy], by abel⟩
9999

100100
@[simp]
101-
lemma implicitFunctionData_leftFun_pt (h : IsContDiffImplicitAt n f f' a) :
102-
h.implicitFunctionData.leftFun h.implicitFunctionData.pt = a.1 := rfl
101+
lemma implicitFunctionData_pt (h : IsContDiffImplicitAt n f f' a) :
102+
h.implicitFunctionData.pt = a := rfl
103103

104104
@[simp]
105-
lemma implicitFunctionData_rightFun_pt (h : IsContDiffImplicitAt n f f' a) :
106-
h.implicitFunctionData.rightFun h.implicitFunctionData.pt = f a := rfl
105+
lemma implicitFunctionData_leftFun_apply {h : IsContDiffImplicitAt n f f' a} {xy : E × F} :
106+
h.implicitFunctionData.leftFun xy = xy.1 := rfl
107+
108+
@[simp]
109+
lemma implicitFunctionData_rightFun_apply {h : IsContDiffImplicitAt n f f' a} {xy : E × F} :
110+
h.implicitFunctionData.rightFun xy = f xy := rfl
107111

108112
/-- The implicit function provided by the general theorem, from which we construct the more useful
109113
form `IsContDiffImplicitAt.implicitFunction`. -/
@@ -126,6 +130,10 @@ lemma implicitFunction_def (h : IsContDiffImplicitAt n f f' a) :
126130
h.implicitFunction = fun x ↦ (h.implicitFunctionData.implicitFunction.uncurry (x, f a)).2 :=
127131
rfl
128132

133+
@[simp]
134+
lemma implicitFunction_apply (h : IsContDiffImplicitAt n f f' a) (x : E) :
135+
h.implicitFunction x = (h.implicitFunctionData.implicitFunction x (f a)).2 := rfl
136+
129137
/-- `implicitFunction` is indeed the (local) implicit function defined by `f`. -/
130138
lemma apply_implicitFunction (h : IsContDiffImplicitAt n f f' a) :
131139
∀ᶠ x in 𝓝 a.1, f (x, h.implicitFunction x) = f a := by
@@ -142,6 +150,11 @@ lemma apply_implicitFunction (h : IsContDiffImplicitAt n f f' a) :
142150
· rw [h1]
143151
· rfl
144152

153+
theorem eventually_implicitFunction_apply_eq (h : IsContDiffImplicitAt n f f' a) :
154+
∀ᶠ xy in 𝓝 a, f xy = f a → h.implicitFunction xy.1 = xy.2 := by
155+
refine h.implicitFunctionData.implicitFunction_apply_image.mono fun xy h₁ h₂ ↦ ?_
156+
simp_all
157+
145158
/-- If the implicit equation `f` is $C^n$ at `(x, y)`, then its implicit function `φ` around `x` is
146159
also $C^n$ at `x`. -/
147160
theorem contDiffAt_implicitFunction (h : IsContDiffImplicitAt n f f' a) :

0 commit comments

Comments
 (0)