analysis.calculus.implicitMathlib.Analysis.Calculus.Implicit

This file has been ported!

Changes since the initial port

The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -3,7 +3,7 @@ Copyright (c) 2020 Yury Kudryashov. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yury Kudryashov
 -/
-import Analysis.Calculus.Inverse
+import Analysis.Calculus.InverseFunctionTheorem.ApproximatesLinearOn
 import Analysis.NormedSpace.Complemented
 
 #align_import analysis.calculus.implicit from "leanprover-community/mathlib"@"5d0c76894ada7940957143163d7b921345474cbc"
@@ -338,7 +338,7 @@ theorem implicitToPartialHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt
 theorem implicitToPartialHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : ker f') :
     hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker (y + a) = (f (y + a), y) := by
-  simp only [implicit_to_local_homeomorph_of_complemented_apply, add_sub_cancel,
+  simp only [implicit_to_local_homeomorph_of_complemented_apply, add_sub_cancel_right,
     Classical.choose_spec hker]
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply_ker
 -/
Diff
@@ -238,7 +238,7 @@ theorem implicitFunction_hasStrictFDerivAt (g'inv : G →L[𝕜] E)
     HasStrictFDerivAt (φ.implicitFunction (φ.leftFun φ.pt)) g'inv (φ.rightFun φ.pt) :=
   by
   have := φ.has_strict_fderiv_at.to_local_inverse
-  simp only [prod_fun] at this 
+  simp only [prod_fun] at this
   convert this.comp (φ.right_fun φ.pt) ((hasStrictFDerivAt_const _ _).Prod (hasStrictFDerivAt_id _))
   simp only [ContinuousLinearMap.ext_iff, ContinuousLinearMap.coe_comp', Function.comp_apply] at
     hg'inv hg'invf ⊢
Diff
@@ -150,14 +150,14 @@ protected theorem hasStrictFDerivAt :
 #align implicit_function_data.has_strict_fderiv_at ImplicitFunctionData.hasStrictFDerivAt
 -/
 
-#print ImplicitFunctionData.toLocalHomeomorph /-
+#print ImplicitFunctionData.toPartialHomeomorph /-
 /-- Implicit function theorem. If `f : E → F` and `g : E → G` are two maps strictly differentiable
 at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these derivatives are
 complementary subspaces of `E`, then `x ↦ (f x, g x)` defines a local homeomorphism between
 `E` and `F × G`. In particular, `{x | f x = f a}` is locally homeomorphic to `G`. -/
-def toLocalHomeomorph : LocalHomeomorph E (F × G) :=
-  φ.HasStrictFDerivAt.toLocalHomeomorph _
-#align implicit_function_data.to_local_homeomorph ImplicitFunctionData.toLocalHomeomorph
+def toPartialHomeomorph : PartialHomeomorph E (F × G) :=
+  φ.HasStrictFDerivAt.toPartialHomeomorph _
+#align implicit_function_data.to_local_homeomorph ImplicitFunctionData.toPartialHomeomorph
 -/
 
 #print ImplicitFunctionData.implicitFunction /-
@@ -166,34 +166,34 @@ at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these de
 complementary subspaces of `E`, then `implicit_function_of_is_compl_ker` is the unique (germ of a)
 map `φ : F → G → E` such that `f (φ y z) = y` and `g (φ y z) = z`. -/
 def implicitFunction : F → G → E :=
-  Function.curry <| φ.toLocalHomeomorph.symm
+  Function.curry <| φ.toPartialHomeomorph.symm
 #align implicit_function_data.implicit_function ImplicitFunctionData.implicitFunction
 -/
 
-#print ImplicitFunctionData.toLocalHomeomorph_coe /-
+#print ImplicitFunctionData.toPartialHomeomorph_coe /-
 @[simp]
-theorem toLocalHomeomorph_coe : ⇑φ.toLocalHomeomorph = φ.prodFun :=
+theorem toPartialHomeomorph_coe : ⇑φ.toPartialHomeomorph = φ.prodFun :=
   rfl
-#align implicit_function_data.to_local_homeomorph_coe ImplicitFunctionData.toLocalHomeomorph_coe
+#align implicit_function_data.to_local_homeomorph_coe ImplicitFunctionData.toPartialHomeomorph_coe
 -/
 
-#print ImplicitFunctionData.toLocalHomeomorph_apply /-
-theorem toLocalHomeomorph_apply (x : E) : φ.toLocalHomeomorph x = (φ.leftFun x, φ.rightFun x) :=
+#print ImplicitFunctionData.toPartialHomeomorph_apply /-
+theorem toPartialHomeomorph_apply (x : E) : φ.toPartialHomeomorph x = (φ.leftFun x, φ.rightFun x) :=
   rfl
-#align implicit_function_data.to_local_homeomorph_apply ImplicitFunctionData.toLocalHomeomorph_apply
+#align implicit_function_data.to_local_homeomorph_apply ImplicitFunctionData.toPartialHomeomorph_apply
 -/
 
-#print ImplicitFunctionData.pt_mem_toLocalHomeomorph_source /-
-theorem pt_mem_toLocalHomeomorph_source : φ.pt ∈ φ.toLocalHomeomorph.source :=
-  φ.HasStrictFDerivAt.mem_toLocalHomeomorph_source
-#align implicit_function_data.pt_mem_to_local_homeomorph_source ImplicitFunctionData.pt_mem_toLocalHomeomorph_source
+#print ImplicitFunctionData.pt_mem_toPartialHomeomorph_source /-
+theorem pt_mem_toPartialHomeomorph_source : φ.pt ∈ φ.toPartialHomeomorph.source :=
+  φ.HasStrictFDerivAt.mem_toPartialHomeomorph_source
+#align implicit_function_data.pt_mem_to_local_homeomorph_source ImplicitFunctionData.pt_mem_toPartialHomeomorph_source
 -/
 
-#print ImplicitFunctionData.map_pt_mem_toLocalHomeomorph_target /-
-theorem map_pt_mem_toLocalHomeomorph_target :
-    (φ.leftFun φ.pt, φ.rightFun φ.pt) ∈ φ.toLocalHomeomorph.target :=
-  φ.toLocalHomeomorph.map_source <| φ.pt_mem_toLocalHomeomorph_source
-#align implicit_function_data.map_pt_mem_to_local_homeomorph_target ImplicitFunctionData.map_pt_mem_toLocalHomeomorph_target
+#print ImplicitFunctionData.map_pt_mem_toPartialHomeomorph_target /-
+theorem map_pt_mem_toPartialHomeomorph_target :
+    (φ.leftFun φ.pt, φ.rightFun φ.pt) ∈ φ.toPartialHomeomorph.target :=
+  φ.toPartialHomeomorph.map_source <| φ.pt_mem_toPartialHomeomorph_source
+#align implicit_function_data.map_pt_mem_to_local_homeomorph_target ImplicitFunctionData.map_pt_mem_toPartialHomeomorph_target
 -/
 
 #print ImplicitFunctionData.prod_map_implicitFunction /-
@@ -296,13 +296,13 @@ def implicitFunctionDataOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : ra
 #align has_strict_fderiv_at.implicit_function_data_of_complemented HasStrictFDerivAt.implicitFunctionDataOfComplemented
 -/
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented /-
 /-- A local homeomorphism between `E` and `F × f'.ker` sending level surfaces of `f`
 to vertical subspaces. -/
-def implicitToLocalHomeomorphOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
-    (hker : (ker f').ClosedComplemented) : LocalHomeomorph E (F × ker f') :=
-  (implicitFunctionDataOfComplemented f f' hf hf' hker).toLocalHomeomorph
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented
+def implicitToPartialHomeomorphOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
+    (hker : (ker f').ClosedComplemented) : PartialHomeomorph E (F × ker f') :=
+  (implicitFunctionDataOfComplemented f f' hf hf' hker).toPartialHomeomorph
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented
 -/
 
 #print HasStrictFDerivAt.implicitFunctionOfComplemented /-
@@ -315,59 +315,59 @@ def implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range
 
 end Defs
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_fst /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_fst /-
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_fst (hf : HasStrictFDerivAt f f' a)
+theorem implicitToPartialHomeomorphOfComplemented_fst (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (x : E) :
-    (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker x).fst = f x :=
+    (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker x).fst = f x :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_fst HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_fst
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_fst HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_fst
 -/
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply /-
-theorem implicitToLocalHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt f f' a)
+#print HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply /-
+theorem implicitToPartialHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : E) :
-    hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker y =
+    hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker y =
       (f y, Classical.choose hker (y - a)) :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply
 -/
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply_ker /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply_ker /-
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
+theorem implicitToPartialHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : ker f') :
-    hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker (y + a) = (f (y + a), y) := by
+    hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker (y + a) = (f (y + a), y) := by
   simp only [implicit_to_local_homeomorph_of_complemented_apply, add_sub_cancel,
     Classical.choose_spec hker]
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply_ker
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply_ker
 -/
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_self /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_self /-
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_self (hf : HasStrictFDerivAt f f' a)
+theorem implicitToPartialHomeomorphOfComplemented_self (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
-    hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker a = (f a, 0) := by
+    hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker a = (f a, 0) := by
   simp [hf.implicit_to_local_homeomorph_of_complemented_apply]
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_self HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_self
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_self HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_self
 -/
 
-#print HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_source /-
-theorem mem_implicitToLocalHomeomorphOfComplemented_source (hf : HasStrictFDerivAt f f' a)
+#print HasStrictFDerivAt.mem_implicitToPartialHomeomorphOfComplemented_source /-
+theorem mem_implicitToPartialHomeomorphOfComplemented_source (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
-    a ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).source :=
-  mem_toLocalHomeomorph_source _
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_source HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_source
+    a ∈ (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).source :=
+  mem_toPartialHomeomorph_source _
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_source HasStrictFDerivAt.mem_implicitToPartialHomeomorphOfComplemented_source
 -/
 
-#print HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_target /-
-theorem mem_implicitToLocalHomeomorphOfComplemented_target (hf : HasStrictFDerivAt f f' a)
+#print HasStrictFDerivAt.mem_implicitToPartialHomeomorphOfComplemented_target /-
+theorem mem_implicitToPartialHomeomorphOfComplemented_target (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
-    (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).target := by
+    (f a, (0 : ker f')) ∈ (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).target := by
   simpa only [implicit_to_local_homeomorph_of_complemented_self] using
     (hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).map_source <|
       hf.mem_implicit_to_local_homeomorph_of_complemented_source hf' hker
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_target HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_target
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_target HasStrictFDerivAt.mem_implicitToPartialHomeomorphOfComplemented_target
 -/
 
 #print HasStrictFDerivAt.map_implicitFunctionOfComplemented_eq /-
@@ -376,8 +376,8 @@ theorem map_implicitFunctionOfComplemented_eq (hf : HasStrictFDerivAt f f' a) (h
     (hker : (ker f').ClosedComplemented) :
     ∀ᶠ p : F × ker f' in 𝓝 (f a, 0),
       f (hf.implicitFunctionOfComplemented f f' hf' hker p.1 p.2) = p.1 :=
-  ((hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).eventually_right_inverse <|
-        hf.mem_implicitToLocalHomeomorphOfComplemented_target hf' hker).mono
+  ((hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).eventually_right_inverse <|
+        hf.mem_implicitToPartialHomeomorphOfComplemented_target hf' hker).mono
     fun ⟨z, y⟩ h => congr_arg Prod.fst h
 #align has_strict_fderiv_at.map_implicit_function_of_complemented_eq HasStrictFDerivAt.map_implicitFunctionOfComplemented_eq
 -/
@@ -389,7 +389,7 @@ theorem eq_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' :
     (hker : (ker f').ClosedComplemented) :
     ∀ᶠ x in 𝓝 a,
       hf.implicitFunctionOfComplemented f f' hf' hker (f x)
-          (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker x).snd =
+          (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker x).snd =
         x :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).implicitFunction_apply_image
 #align has_strict_fderiv_at.eq_implicit_function_of_complemented HasStrictFDerivAt.eq_implicitFunctionOfComplemented
@@ -455,62 +455,62 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] [CompleteSpace 𝕜] {E
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type _} [NormedAddCommGroup F]
   [NormedSpace 𝕜 F] [FiniteDimensional 𝕜 F] (f : E → F) (f' : E →L[𝕜] F) {a : E}
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorph /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorph /-
 /-- Given a map `f : E → F` to a finite dimensional space with a surjective derivative `f'`,
 returns a local homeomorphism between `E` and `F × ker f'`. -/
-def implicitToLocalHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    LocalHomeomorph E (F × ker f') :=
+def implicitToPartialHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
+    PartialHomeomorph E (F × ker f') :=
   haveI := FiniteDimensional.complete 𝕜 F
   hf.implicit_to_local_homeomorph_of_complemented f f' hf'
     f'.ker_closed_complemented_of_finite_dimensional_range
-#align has_strict_fderiv_at.implicit_to_local_homeomorph HasStrictFDerivAt.implicitToLocalHomeomorph
+#align has_strict_fderiv_at.implicit_to_local_homeomorph HasStrictFDerivAt.implicitToPartialHomeomorph
 -/
 
 #print HasStrictFDerivAt.implicitFunction /-
 /-- Implicit function `g` defined by `f (g z y) = z`. -/
 def implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) : F → ker f' → E :=
-  Function.curry <| (hf.implicitToLocalHomeomorph f f' hf').symm
+  Function.curry <| (hf.implicitToPartialHomeomorph f f' hf').symm
 #align has_strict_fderiv_at.implicit_function HasStrictFDerivAt.implicitFunction
 -/
 
 variable {f f'}
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorph_fst /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorph_fst /-
 @[simp]
-theorem implicitToLocalHomeomorph_fst (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) (x : E) :
-    (hf.implicitToLocalHomeomorph f f' hf' x).fst = f x :=
+theorem implicitToPartialHomeomorph_fst (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
+    (x : E) : (hf.implicitToPartialHomeomorph f f' hf' x).fst = f x :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_fst HasStrictFDerivAt.implicitToLocalHomeomorph_fst
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_fst HasStrictFDerivAt.implicitToPartialHomeomorph_fst
 -/
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorph_apply_ker /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorph_apply_ker /-
 @[simp]
-theorem implicitToLocalHomeomorph_apply_ker (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
-    (y : ker f') : hf.implicitToLocalHomeomorph f f' hf' (y + a) = (f (y + a), y) := by
+theorem implicitToPartialHomeomorph_apply_ker (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
+    (y : ker f') : hf.implicitToPartialHomeomorph f f' hf' (y + a) = (f (y + a), y) := by
   apply implicit_to_local_homeomorph_of_complemented_apply_ker
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorph_apply_ker
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFDerivAt.implicitToPartialHomeomorph_apply_ker
 -/
 
-#print HasStrictFDerivAt.implicitToLocalHomeomorph_self /-
+#print HasStrictFDerivAt.implicitToPartialHomeomorph_self /-
 @[simp]
-theorem implicitToLocalHomeomorph_self (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    hf.implicitToLocalHomeomorph f f' hf' a = (f a, 0) := by
+theorem implicitToPartialHomeomorph_self (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
+    hf.implicitToPartialHomeomorph f f' hf' a = (f a, 0) := by
   apply implicit_to_local_homeomorph_of_complemented_self
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_self HasStrictFDerivAt.implicitToLocalHomeomorph_self
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_self HasStrictFDerivAt.implicitToPartialHomeomorph_self
 -/
 
-#print HasStrictFDerivAt.mem_implicitToLocalHomeomorph_source /-
-theorem mem_implicitToLocalHomeomorph_source (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    a ∈ (hf.implicitToLocalHomeomorph f f' hf').source :=
-  mem_toLocalHomeomorph_source _
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_source HasStrictFDerivAt.mem_implicitToLocalHomeomorph_source
+#print HasStrictFDerivAt.mem_implicitToPartialHomeomorph_source /-
+theorem mem_implicitToPartialHomeomorph_source (hf : HasStrictFDerivAt f f' a)
+    (hf' : range f' = ⊤) : a ∈ (hf.implicitToPartialHomeomorph f f' hf').source :=
+  mem_toPartialHomeomorph_source _
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_source HasStrictFDerivAt.mem_implicitToPartialHomeomorph_source
 -/
 
-#print HasStrictFDerivAt.mem_implicitToLocalHomeomorph_target /-
-theorem mem_implicitToLocalHomeomorph_target (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorph f f' hf').target := by
-  apply mem_implicit_to_local_homeomorph_of_complemented_target
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFDerivAt.mem_implicitToLocalHomeomorph_target
+#print HasStrictFDerivAt.mem_implicitToPartialHomeomorph_target /-
+theorem mem_implicitToPartialHomeomorph_target (hf : HasStrictFDerivAt f f' a)
+    (hf' : range f' = ⊤) : (f a, (0 : ker f')) ∈ (hf.implicitToPartialHomeomorph f f' hf').target :=
+  by apply mem_implicit_to_local_homeomorph_of_complemented_target
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFDerivAt.mem_implicitToPartialHomeomorph_target
 -/
 
 #print HasStrictFDerivAt.tendsto_implicitFunction /-
@@ -552,7 +552,7 @@ theorem implicitFunction_apply_image (hf : HasStrictFDerivAt f f' a) (hf' : rang
 of some point. -/
 theorem eq_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     ∀ᶠ x in 𝓝 a,
-      hf.implicitFunction f f' hf' (f x) (hf.implicitToLocalHomeomorph f f' hf' x).snd = x :=
+      hf.implicitFunction f f' hf' (f x) (hf.implicitToPartialHomeomorph f f' hf' x).snd = x :=
   by apply eq_implicit_function_of_complemented
 #align has_strict_fderiv_at.eq_implicit_function HasStrictFDerivAt.eq_implicitFunction
 -/
Diff
@@ -3,8 +3,8 @@ Copyright (c) 2020 Yury Kudryashov. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yury Kudryashov
 -/
-import Mathbin.Analysis.Calculus.Inverse
-import Mathbin.Analysis.NormedSpace.Complemented
+import Analysis.Calculus.Inverse
+import Analysis.NormedSpace.Complemented
 
 #align_import analysis.calculus.implicit from "leanprover-community/mathlib"@"5d0c76894ada7940957143163d7b921345474cbc"
 
Diff
@@ -528,7 +528,7 @@ theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f'
 #align has_strict_fderiv_at.tendsto_implicit_function HasStrictFDerivAt.tendsto_implicitFunction
 -/
 
-alias tendsto_implicit_function ← _root_.filter.tendsto.implicit_function
+alias _root_.filter.tendsto.implicit_function := tendsto_implicit_function
 #align filter.tendsto.implicit_function Filter.Tendsto.implicitFunction
 
 #print HasStrictFDerivAt.map_implicitFunction_eq /-
Diff
@@ -2,15 +2,12 @@
 Copyright (c) 2020 Yury Kudryashov. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yury Kudryashov
-
-! This file was ported from Lean 3 source module analysis.calculus.implicit
-! leanprover-community/mathlib commit 5d0c76894ada7940957143163d7b921345474cbc
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Analysis.Calculus.Inverse
 import Mathbin.Analysis.NormedSpace.Complemented
 
+#align_import analysis.calculus.implicit from "leanprover-community/mathlib"@"5d0c76894ada7940957143163d7b921345474cbc"
+
 /-!
 # Implicit function theorem
 
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yury Kudryashov
 
 ! This file was ported from Lean 3 source module analysis.calculus.implicit
-! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
+! leanprover-community/mathlib commit 5d0c76894ada7940957143163d7b921345474cbc
 ! Please do not edit these lines, except to modify the commit id
 ! if you have ported upstream changes.
 -/
@@ -14,6 +14,9 @@ import Mathbin.Analysis.NormedSpace.Complemented
 /-!
 # Implicit function theorem
 
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
 We prove three versions of the implicit function theorem. First we define a structure
 `implicit_function_data` that holds arguments for the most general version of the implicit function
 theorem, see `implicit_function_data.implicit_function`
Diff
@@ -92,6 +92,7 @@ needs to have a complete control over the choice of the implicit function.
 -/
 
 
+#print ImplicitFunctionData /-
 /-- Data for the general version of the implicit function theorem. It holds two functions
 `f : E → F` and `g : E → G` (named `left_fun` and `right_fun`) and a point `a` (named `pt`)
 such that
@@ -115,6 +116,7 @@ structure ImplicitFunctionData (𝕜 : Type _) [NontriviallyNormedField 𝕜] (E
   right_range : range right_deriv = ⊤
   isCompl_ker : IsCompl (ker left_deriv) (ker right_deriv)
 #align implicit_function_data ImplicitFunctionData
+-/
 
 namespace ImplicitFunctionData
 
@@ -123,16 +125,21 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddC
   [CompleteSpace F] {G : Type _} [NormedAddCommGroup G] [NormedSpace 𝕜 G] [CompleteSpace G]
   (φ : ImplicitFunctionData 𝕜 E F G)
 
+#print ImplicitFunctionData.prodFun /-
 /-- The function given by `x ↦ (left_fun x, right_fun x)`. -/
 def prodFun (x : E) : F × G :=
   (φ.leftFun x, φ.rightFun x)
 #align implicit_function_data.prod_fun ImplicitFunctionData.prodFun
+-/
 
+#print ImplicitFunctionData.prodFun_apply /-
 @[simp]
 theorem prodFun_apply (x : E) : φ.prodFun x = (φ.leftFun x, φ.rightFun x) :=
   rfl
 #align implicit_function_data.prod_fun_apply ImplicitFunctionData.prodFun_apply
+-/
 
+#print ImplicitFunctionData.hasStrictFDerivAt /-
 protected theorem hasStrictFDerivAt :
     HasStrictFDerivAt φ.prodFun
       (φ.leftDeriv.equivProdOfSurjectiveOfIsCompl φ.rightDeriv φ.left_range φ.right_range
@@ -141,7 +148,9 @@ protected theorem hasStrictFDerivAt :
       φ.pt :=
   φ.left_has_deriv.Prod φ.right_has_deriv
 #align implicit_function_data.has_strict_fderiv_at ImplicitFunctionData.hasStrictFDerivAt
+-/
 
+#print ImplicitFunctionData.toLocalHomeomorph /-
 /-- Implicit function theorem. If `f : E → F` and `g : E → G` are two maps strictly differentiable
 at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these derivatives are
 complementary subspaces of `E`, then `x ↦ (f x, g x)` defines a local homeomorphism between
@@ -149,7 +158,9 @@ complementary subspaces of `E`, then `x ↦ (f x, g x)` defines a local homeomor
 def toLocalHomeomorph : LocalHomeomorph E (F × G) :=
   φ.HasStrictFDerivAt.toLocalHomeomorph _
 #align implicit_function_data.to_local_homeomorph ImplicitFunctionData.toLocalHomeomorph
+-/
 
+#print ImplicitFunctionData.implicitFunction /-
 /-- Implicit function theorem. If `f : E → F` and `g : E → G` are two maps strictly differentiable
 at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these derivatives are
 complementary subspaces of `E`, then `implicit_function_of_is_compl_ker` is the unique (germ of a)
@@ -157,50 +168,70 @@ map `φ : F → G → E` such that `f (φ y z) = y` and `g (φ y z) = z`. -/
 def implicitFunction : F → G → E :=
   Function.curry <| φ.toLocalHomeomorph.symm
 #align implicit_function_data.implicit_function ImplicitFunctionData.implicitFunction
+-/
 
+#print ImplicitFunctionData.toLocalHomeomorph_coe /-
 @[simp]
 theorem toLocalHomeomorph_coe : ⇑φ.toLocalHomeomorph = φ.prodFun :=
   rfl
 #align implicit_function_data.to_local_homeomorph_coe ImplicitFunctionData.toLocalHomeomorph_coe
+-/
 
+#print ImplicitFunctionData.toLocalHomeomorph_apply /-
 theorem toLocalHomeomorph_apply (x : E) : φ.toLocalHomeomorph x = (φ.leftFun x, φ.rightFun x) :=
   rfl
 #align implicit_function_data.to_local_homeomorph_apply ImplicitFunctionData.toLocalHomeomorph_apply
+-/
 
+#print ImplicitFunctionData.pt_mem_toLocalHomeomorph_source /-
 theorem pt_mem_toLocalHomeomorph_source : φ.pt ∈ φ.toLocalHomeomorph.source :=
   φ.HasStrictFDerivAt.mem_toLocalHomeomorph_source
 #align implicit_function_data.pt_mem_to_local_homeomorph_source ImplicitFunctionData.pt_mem_toLocalHomeomorph_source
+-/
 
+#print ImplicitFunctionData.map_pt_mem_toLocalHomeomorph_target /-
 theorem map_pt_mem_toLocalHomeomorph_target :
     (φ.leftFun φ.pt, φ.rightFun φ.pt) ∈ φ.toLocalHomeomorph.target :=
   φ.toLocalHomeomorph.map_source <| φ.pt_mem_toLocalHomeomorph_source
 #align implicit_function_data.map_pt_mem_to_local_homeomorph_target ImplicitFunctionData.map_pt_mem_toLocalHomeomorph_target
+-/
 
+#print ImplicitFunctionData.prod_map_implicitFunction /-
 theorem prod_map_implicitFunction :
     ∀ᶠ p : F × G in 𝓝 (φ.prodFun φ.pt), φ.prodFun (φ.implicitFunction p.1 p.2) = p :=
   φ.HasStrictFDerivAt.eventually_right_inverse.mono fun ⟨z, y⟩ h => h
 #align implicit_function_data.prod_map_implicit_function ImplicitFunctionData.prod_map_implicitFunction
+-/
 
+#print ImplicitFunctionData.left_map_implicitFunction /-
 theorem left_map_implicitFunction :
     ∀ᶠ p : F × G in 𝓝 (φ.prodFun φ.pt), φ.leftFun (φ.implicitFunction p.1 p.2) = p.1 :=
   φ.prod_map_implicitFunction.mono fun z => congr_arg Prod.fst
 #align implicit_function_data.left_map_implicit_function ImplicitFunctionData.left_map_implicitFunction
+-/
 
+#print ImplicitFunctionData.right_map_implicitFunction /-
 theorem right_map_implicitFunction :
     ∀ᶠ p : F × G in 𝓝 (φ.prodFun φ.pt), φ.rightFun (φ.implicitFunction p.1 p.2) = p.2 :=
   φ.prod_map_implicitFunction.mono fun z => congr_arg Prod.snd
 #align implicit_function_data.right_map_implicit_function ImplicitFunctionData.right_map_implicitFunction
+-/
 
+#print ImplicitFunctionData.implicitFunction_apply_image /-
 theorem implicitFunction_apply_image :
     ∀ᶠ x in 𝓝 φ.pt, φ.implicitFunction (φ.leftFun x) (φ.rightFun x) = x :=
   φ.HasStrictFDerivAt.eventually_left_inverse
 #align implicit_function_data.implicit_function_apply_image ImplicitFunctionData.implicitFunction_apply_image
+-/
 
+#print ImplicitFunctionData.map_nhds_eq /-
 theorem map_nhds_eq : map φ.leftFun (𝓝 φ.pt) = 𝓝 (φ.leftFun φ.pt) :=
   show map (Prod.fst ∘ φ.prodFun) (𝓝 φ.pt) = 𝓝 (φ.prodFun φ.pt).1 by
     rw [← map_map, φ.has_strict_fderiv_at.map_nhds_eq_of_equiv, map_fst_nhds]
 #align implicit_function_data.map_nhds_eq ImplicitFunctionData.map_nhds_eq
+-/
 
+#print ImplicitFunctionData.implicitFunction_hasStrictFDerivAt /-
 theorem implicitFunction_hasStrictFDerivAt (g'inv : G →L[𝕜] E)
     (hg'inv : φ.rightDeriv.comp g'inv = ContinuousLinearMap.id 𝕜 G)
     (hg'invf : φ.leftDeriv.comp g'inv = 0) :
@@ -213,6 +244,7 @@ theorem implicitFunction_hasStrictFDerivAt (g'inv : G →L[𝕜] E)
     hg'inv hg'invf ⊢
   simp [ContinuousLinearEquiv.eq_symm_apply, *]
 #align implicit_function_data.implicit_function_has_strict_fderiv_at ImplicitFunctionData.implicitFunction_hasStrictFDerivAt
+-/
 
 end ImplicitFunctionData
 
@@ -243,6 +275,7 @@ section Defs
 
 variable (f f')
 
+#print HasStrictFDerivAt.implicitFunctionDataOfComplemented /-
 /-- Data used to apply the generic implicit function theorem to the case of a strictly
 differentiable map such that its derivative is surjective and has a complemented kernel. -/
 @[simp]
@@ -261,36 +294,46 @@ def implicitFunctionDataOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : ra
   right_range := LinearMap.range_eq_of_proj (Classical.choose_spec hker)
   isCompl_ker := LinearMap.isCompl_of_proj (Classical.choose_spec hker)
 #align has_strict_fderiv_at.implicit_function_data_of_complemented HasStrictFDerivAt.implicitFunctionDataOfComplemented
+-/
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented /-
 /-- A local homeomorphism between `E` and `F × f'.ker` sending level surfaces of `f`
 to vertical subspaces. -/
 def implicitToLocalHomeomorphOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) : LocalHomeomorph E (F × ker f') :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).toLocalHomeomorph
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented
+-/
 
+#print HasStrictFDerivAt.implicitFunctionOfComplemented /-
 /-- Implicit function `g` defined by `f (g z y) = z`. -/
 def implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) : F → ker f' → E :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).implicitFunction
 #align has_strict_fderiv_at.implicit_function_of_complemented HasStrictFDerivAt.implicitFunctionOfComplemented
+-/
 
 end Defs
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_fst /-
 @[simp]
 theorem implicitToLocalHomeomorphOfComplemented_fst (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (x : E) :
     (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker x).fst = f x :=
   rfl
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_fst HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_fst
+-/
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply /-
 theorem implicitToLocalHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : E) :
     hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker y =
       (f y, Classical.choose hker (y - a)) :=
   rfl
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply
+-/
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply_ker /-
 @[simp]
 theorem implicitToLocalHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : ker f') :
@@ -298,20 +341,26 @@ theorem implicitToLocalHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivA
   simp only [implicit_to_local_homeomorph_of_complemented_apply, add_sub_cancel,
     Classical.choose_spec hker]
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply_ker
+-/
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_self /-
 @[simp]
 theorem implicitToLocalHomeomorphOfComplemented_self (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker a = (f a, 0) := by
   simp [hf.implicit_to_local_homeomorph_of_complemented_apply]
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_self HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_self
+-/
 
+#print HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_source /-
 theorem mem_implicitToLocalHomeomorphOfComplemented_source (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     a ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).source :=
   mem_toLocalHomeomorph_source _
 #align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_source HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_source
+-/
 
+#print HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_target /-
 theorem mem_implicitToLocalHomeomorphOfComplemented_target (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).target := by
@@ -319,7 +368,9 @@ theorem mem_implicitToLocalHomeomorphOfComplemented_target (hf : HasStrictFDeriv
     (hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).map_source <|
       hf.mem_implicit_to_local_homeomorph_of_complemented_source hf' hker
 #align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_target HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_target
+-/
 
+#print HasStrictFDerivAt.map_implicitFunctionOfComplemented_eq /-
 /-- `implicit_function_of_complemented` sends `(z, y)` to a point in `f ⁻¹' z`. -/
 theorem map_implicitFunctionOfComplemented_eq (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) :
@@ -329,7 +380,9 @@ theorem map_implicitFunctionOfComplemented_eq (hf : HasStrictFDerivAt f f' a) (h
         hf.mem_implicitToLocalHomeomorphOfComplemented_target hf' hker).mono
     fun ⟨z, y⟩ h => congr_arg Prod.fst h
 #align has_strict_fderiv_at.map_implicit_function_of_complemented_eq HasStrictFDerivAt.map_implicitFunctionOfComplemented_eq
+-/
 
+#print HasStrictFDerivAt.eq_implicitFunctionOfComplemented /-
 /-- Any point in some neighborhood of `a` can be represented as `implicit_function`
 of some point. -/
 theorem eq_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
@@ -340,7 +393,9 @@ theorem eq_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' :
         x :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).implicitFunction_apply_image
 #align has_strict_fderiv_at.eq_implicit_function_of_complemented HasStrictFDerivAt.eq_implicitFunctionOfComplemented
+-/
 
+#print HasStrictFDerivAt.implicitFunctionOfComplemented_apply_image /-
 @[simp]
 theorem implicitFunctionOfComplemented_apply_image (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
@@ -351,7 +406,9 @@ theorem implicitFunctionOfComplemented_apply_image (hf : HasStrictFDerivAt f f'
       (hf.mem_implicit_to_local_homeomorph_of_complemented_source hf' hker)
   exact congr_arg Prod.snd (hf.implicit_to_local_homeomorph_of_complemented_self hf' hker).symm
 #align has_strict_fderiv_at.implicit_function_of_complemented_apply_image HasStrictFDerivAt.implicitFunctionOfComplemented_apply_image
+-/
 
+#print HasStrictFDerivAt.to_implicitFunctionOfComplemented /-
 theorem to_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) :
     HasStrictFDerivAt (hf.implicitFunctionOfComplemented f f' hf' hker (f a)) (ker f').subtypeL 0 :=
@@ -370,6 +427,7 @@ theorem to_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' :
       Function.comp_apply, LinearMap.map_coe_ker, ContinuousLinearMap.zero_apply]
   simp only [implicit_function_data_of_complemented, map_sub, sub_self]
 #align has_strict_fderiv_at.to_implicit_function_of_complemented HasStrictFDerivAt.to_implicitFunctionOfComplemented
+-/
 
 end Complemented
 
@@ -397,6 +455,7 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] [CompleteSpace 𝕜] {E
   [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type _} [NormedAddCommGroup F]
   [NormedSpace 𝕜 F] [FiniteDimensional 𝕜 F] (f : E → F) (f' : E →L[𝕜] F) {a : E}
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorph /-
 /-- Given a map `f : E → F` to a finite dimensional space with a surjective derivative `f'`,
 returns a local homeomorphism between `E` and `F × ker f'`. -/
 def implicitToLocalHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
@@ -405,42 +464,56 @@ def implicitToLocalHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' =
   hf.implicit_to_local_homeomorph_of_complemented f f' hf'
     f'.ker_closed_complemented_of_finite_dimensional_range
 #align has_strict_fderiv_at.implicit_to_local_homeomorph HasStrictFDerivAt.implicitToLocalHomeomorph
+-/
 
+#print HasStrictFDerivAt.implicitFunction /-
 /-- Implicit function `g` defined by `f (g z y) = z`. -/
 def implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) : F → ker f' → E :=
   Function.curry <| (hf.implicitToLocalHomeomorph f f' hf').symm
 #align has_strict_fderiv_at.implicit_function HasStrictFDerivAt.implicitFunction
+-/
 
 variable {f f'}
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorph_fst /-
 @[simp]
 theorem implicitToLocalHomeomorph_fst (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) (x : E) :
     (hf.implicitToLocalHomeomorph f f' hf' x).fst = f x :=
   rfl
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_fst HasStrictFDerivAt.implicitToLocalHomeomorph_fst
+-/
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorph_apply_ker /-
 @[simp]
 theorem implicitToLocalHomeomorph_apply_ker (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (y : ker f') : hf.implicitToLocalHomeomorph f f' hf' (y + a) = (f (y + a), y) := by
   apply implicit_to_local_homeomorph_of_complemented_apply_ker
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorph_apply_ker
+-/
 
+#print HasStrictFDerivAt.implicitToLocalHomeomorph_self /-
 @[simp]
 theorem implicitToLocalHomeomorph_self (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     hf.implicitToLocalHomeomorph f f' hf' a = (f a, 0) := by
   apply implicit_to_local_homeomorph_of_complemented_self
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_self HasStrictFDerivAt.implicitToLocalHomeomorph_self
+-/
 
+#print HasStrictFDerivAt.mem_implicitToLocalHomeomorph_source /-
 theorem mem_implicitToLocalHomeomorph_source (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     a ∈ (hf.implicitToLocalHomeomorph f f' hf').source :=
   mem_toLocalHomeomorph_source _
 #align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_source HasStrictFDerivAt.mem_implicitToLocalHomeomorph_source
+-/
 
+#print HasStrictFDerivAt.mem_implicitToLocalHomeomorph_target /-
 theorem mem_implicitToLocalHomeomorph_target (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorph f f' hf').target := by
   apply mem_implicit_to_local_homeomorph_of_complemented_target
 #align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFDerivAt.mem_implicitToLocalHomeomorph_target
+-/
 
+#print HasStrictFDerivAt.tendsto_implicitFunction /-
 theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) {α : Type _}
     {l : Filter α} {g₁ : α → F} {g₂ : α → ker f'} (h₁ : Tendsto g₁ l (𝓝 <| f a))
     (h₂ : Tendsto g₂ l (𝓝 0)) :
@@ -453,22 +526,28 @@ theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f'
   rw [implicit_to_local_homeomorph_self]
   exact h₁.prod_mk_nhds h₂
 #align has_strict_fderiv_at.tendsto_implicit_function HasStrictFDerivAt.tendsto_implicitFunction
+-/
 
 alias tendsto_implicit_function ← _root_.filter.tendsto.implicit_function
 #align filter.tendsto.implicit_function Filter.Tendsto.implicitFunction
 
+#print HasStrictFDerivAt.map_implicitFunction_eq /-
 /-- `implicit_function` sends `(z, y)` to a point in `f ⁻¹' z`. -/
 theorem map_implicitFunction_eq (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     ∀ᶠ p : F × ker f' in 𝓝 (f a, 0), f (hf.implicitFunction f f' hf' p.1 p.2) = p.1 := by
   apply map_implicit_function_of_complemented_eq
 #align has_strict_fderiv_at.map_implicit_function_eq HasStrictFDerivAt.map_implicitFunction_eq
+-/
 
+#print HasStrictFDerivAt.implicitFunction_apply_image /-
 @[simp]
 theorem implicitFunction_apply_image (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     hf.implicitFunction f f' hf' (f a) 0 = a := by
   apply implicit_function_of_complemented_apply_image
 #align has_strict_fderiv_at.implicit_function_apply_image HasStrictFDerivAt.implicitFunction_apply_image
+-/
 
+#print HasStrictFDerivAt.eq_implicitFunction /-
 /-- Any point in some neighborhood of `a` can be represented as `implicit_function`
 of some point. -/
 theorem eq_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
@@ -476,11 +555,14 @@ theorem eq_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = 
       hf.implicitFunction f f' hf' (f x) (hf.implicitToLocalHomeomorph f f' hf' x).snd = x :=
   by apply eq_implicit_function_of_complemented
 #align has_strict_fderiv_at.eq_implicit_function HasStrictFDerivAt.eq_implicitFunction
+-/
 
+#print HasStrictFDerivAt.to_implicitFunction /-
 theorem to_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     HasStrictFDerivAt (hf.implicitFunction f f' hf' (f a)) (ker f').subtypeL 0 := by
   apply to_implicit_function_of_complemented
 #align has_strict_fderiv_at.to_implicit_function HasStrictFDerivAt.to_implicitFunction
+-/
 
 end FiniteDimensional
 
Diff
@@ -346,7 +346,8 @@ theorem implicitFunctionOfComplemented_apply_image (hf : HasStrictFDerivAt f f'
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     hf.implicitFunctionOfComplemented f f' hf' hker (f a) 0 = a :=
   by
-  convert(hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).left_inv
+  convert
+    (hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).left_inv
       (hf.mem_implicit_to_local_homeomorph_of_complemented_source hf' hker)
   exact congr_arg Prod.snd (hf.implicit_to_local_homeomorph_of_complemented_self hf' hker).symm
 #align has_strict_fderiv_at.implicit_function_of_complemented_apply_image HasStrictFDerivAt.implicitFunctionOfComplemented_apply_image
@@ -355,8 +356,8 @@ theorem to_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' :
     (hker : (ker f').ClosedComplemented) :
     HasStrictFDerivAt (hf.implicitFunctionOfComplemented f f' hf' hker (f a)) (ker f').subtypeL 0 :=
   by
-  convert(implicit_function_data_of_complemented f f' hf hf'
-          hker).implicitFunction_hasStrictFDerivAt
+  convert
+    (implicit_function_data_of_complemented f f' hf hf' hker).implicitFunction_hasStrictFDerivAt
       (ker f').subtypeL _ _
   swap
   · ext;
Diff
@@ -101,9 +101,9 @@ such that
 * the kernels of the derivatives are complementary subspaces of `E`. -/
 @[nolint has_nonempty_instance]
 structure ImplicitFunctionData (𝕜 : Type _) [NontriviallyNormedField 𝕜] (E : Type _)
-  [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] (F : Type _) [NormedAddCommGroup F]
-  [NormedSpace 𝕜 F] [CompleteSpace F] (G : Type _) [NormedAddCommGroup G] [NormedSpace 𝕜 G]
-  [CompleteSpace G] where
+    [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] (F : Type _) [NormedAddCommGroup F]
+    [NormedSpace 𝕜 F] [CompleteSpace F] (G : Type _) [NormedAddCommGroup G] [NormedSpace 𝕜 G]
+    [CompleteSpace G] where
   leftFun : E → F
   leftDeriv : E →L[𝕜] F
   rightFun : E → G
@@ -207,10 +207,10 @@ theorem implicitFunction_hasStrictFDerivAt (g'inv : G →L[𝕜] E)
     HasStrictFDerivAt (φ.implicitFunction (φ.leftFun φ.pt)) g'inv (φ.rightFun φ.pt) :=
   by
   have := φ.has_strict_fderiv_at.to_local_inverse
-  simp only [prod_fun] at this
+  simp only [prod_fun] at this 
   convert this.comp (φ.right_fun φ.pt) ((hasStrictFDerivAt_const _ _).Prod (hasStrictFDerivAt_id _))
   simp only [ContinuousLinearMap.ext_iff, ContinuousLinearMap.coe_comp', Function.comp_apply] at
-    hg'inv hg'invf⊢
+    hg'inv hg'invf ⊢
   simp [ContinuousLinearEquiv.eq_symm_apply, *]
 #align implicit_function_data.implicit_function_has_strict_fderiv_at ImplicitFunctionData.implicitFunction_hasStrictFDerivAt
 
Diff
@@ -51,7 +51,7 @@ implicit function, inverse function
 
 noncomputable section
 
-open Topology
+open scoped Topology
 
 open Filter
 
Diff
@@ -359,12 +359,12 @@ theorem to_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' :
           hker).implicitFunction_hasStrictFDerivAt
       (ker f').subtypeL _ _
   swap
-  · ext
+  · ext;
     simp only [Classical.choose_spec hker, implicit_function_data_of_complemented,
       ContinuousLinearMap.coe_comp', Submodule.coe_subtypeL', Submodule.coeSubtype,
       Function.comp_apply, ContinuousLinearMap.coe_id', id.def]
   swap
-  · ext
+  · ext;
     simp only [ContinuousLinearMap.coe_comp', Submodule.coe_subtypeL', Submodule.coeSubtype,
       Function.comp_apply, LinearMap.map_coe_ker, ContinuousLinearMap.zero_apply]
   simp only [implicit_function_data_of_complemented, map_sub, sub_self]
Diff
@@ -109,8 +109,8 @@ structure ImplicitFunctionData (𝕜 : Type _) [NontriviallyNormedField 𝕜] (E
   rightFun : E → G
   rightDeriv : E →L[𝕜] G
   pt : E
-  left_has_deriv : HasStrictFderivAt left_fun left_deriv pt
-  right_has_deriv : HasStrictFderivAt right_fun right_deriv pt
+  left_has_deriv : HasStrictFDerivAt left_fun left_deriv pt
+  right_has_deriv : HasStrictFDerivAt right_fun right_deriv pt
   left_range : range left_deriv = ⊤
   right_range : range right_deriv = ⊤
   isCompl_ker : IsCompl (ker left_deriv) (ker right_deriv)
@@ -133,21 +133,21 @@ theorem prodFun_apply (x : E) : φ.prodFun x = (φ.leftFun x, φ.rightFun x) :=
   rfl
 #align implicit_function_data.prod_fun_apply ImplicitFunctionData.prodFun_apply
 
-protected theorem hasStrictFderivAt :
-    HasStrictFderivAt φ.prodFun
+protected theorem hasStrictFDerivAt :
+    HasStrictFDerivAt φ.prodFun
       (φ.leftDeriv.equivProdOfSurjectiveOfIsCompl φ.rightDeriv φ.left_range φ.right_range
           φ.isCompl_ker :
         E →L[𝕜] F × G)
       φ.pt :=
   φ.left_has_deriv.Prod φ.right_has_deriv
-#align implicit_function_data.has_strict_fderiv_at ImplicitFunctionData.hasStrictFderivAt
+#align implicit_function_data.has_strict_fderiv_at ImplicitFunctionData.hasStrictFDerivAt
 
 /-- Implicit function theorem. If `f : E → F` and `g : E → G` are two maps strictly differentiable
 at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these derivatives are
 complementary subspaces of `E`, then `x ↦ (f x, g x)` defines a local homeomorphism between
 `E` and `F × G`. In particular, `{x | f x = f a}` is locally homeomorphic to `G`. -/
 def toLocalHomeomorph : LocalHomeomorph E (F × G) :=
-  φ.HasStrictFderivAt.toLocalHomeomorph _
+  φ.HasStrictFDerivAt.toLocalHomeomorph _
 #align implicit_function_data.to_local_homeomorph ImplicitFunctionData.toLocalHomeomorph
 
 /-- Implicit function theorem. If `f : E → F` and `g : E → G` are two maps strictly differentiable
@@ -168,7 +168,7 @@ theorem toLocalHomeomorph_apply (x : E) : φ.toLocalHomeomorph x = (φ.leftFun x
 #align implicit_function_data.to_local_homeomorph_apply ImplicitFunctionData.toLocalHomeomorph_apply
 
 theorem pt_mem_toLocalHomeomorph_source : φ.pt ∈ φ.toLocalHomeomorph.source :=
-  φ.HasStrictFderivAt.mem_toLocalHomeomorph_source
+  φ.HasStrictFDerivAt.mem_toLocalHomeomorph_source
 #align implicit_function_data.pt_mem_to_local_homeomorph_source ImplicitFunctionData.pt_mem_toLocalHomeomorph_source
 
 theorem map_pt_mem_toLocalHomeomorph_target :
@@ -178,7 +178,7 @@ theorem map_pt_mem_toLocalHomeomorph_target :
 
 theorem prod_map_implicitFunction :
     ∀ᶠ p : F × G in 𝓝 (φ.prodFun φ.pt), φ.prodFun (φ.implicitFunction p.1 p.2) = p :=
-  φ.HasStrictFderivAt.eventually_right_inverse.mono fun ⟨z, y⟩ h => h
+  φ.HasStrictFDerivAt.eventually_right_inverse.mono fun ⟨z, y⟩ h => h
 #align implicit_function_data.prod_map_implicit_function ImplicitFunctionData.prod_map_implicitFunction
 
 theorem left_map_implicitFunction :
@@ -193,7 +193,7 @@ theorem right_map_implicitFunction :
 
 theorem implicitFunction_apply_image :
     ∀ᶠ x in 𝓝 φ.pt, φ.implicitFunction (φ.leftFun x) (φ.rightFun x) = x :=
-  φ.HasStrictFderivAt.eventually_left_inverse
+  φ.HasStrictFDerivAt.eventually_left_inverse
 #align implicit_function_data.implicit_function_apply_image ImplicitFunctionData.implicitFunction_apply_image
 
 theorem map_nhds_eq : map φ.leftFun (𝓝 φ.pt) = 𝓝 (φ.leftFun φ.pt) :=
@@ -201,22 +201,22 @@ theorem map_nhds_eq : map φ.leftFun (𝓝 φ.pt) = 𝓝 (φ.leftFun φ.pt) :=
     rw [← map_map, φ.has_strict_fderiv_at.map_nhds_eq_of_equiv, map_fst_nhds]
 #align implicit_function_data.map_nhds_eq ImplicitFunctionData.map_nhds_eq
 
-theorem implicitFunction_hasStrictFderivAt (g'inv : G →L[𝕜] E)
+theorem implicitFunction_hasStrictFDerivAt (g'inv : G →L[𝕜] E)
     (hg'inv : φ.rightDeriv.comp g'inv = ContinuousLinearMap.id 𝕜 G)
     (hg'invf : φ.leftDeriv.comp g'inv = 0) :
-    HasStrictFderivAt (φ.implicitFunction (φ.leftFun φ.pt)) g'inv (φ.rightFun φ.pt) :=
+    HasStrictFDerivAt (φ.implicitFunction (φ.leftFun φ.pt)) g'inv (φ.rightFun φ.pt) :=
   by
   have := φ.has_strict_fderiv_at.to_local_inverse
   simp only [prod_fun] at this
-  convert this.comp (φ.right_fun φ.pt) ((hasStrictFderivAt_const _ _).Prod (hasStrictFderivAt_id _))
+  convert this.comp (φ.right_fun φ.pt) ((hasStrictFDerivAt_const _ _).Prod (hasStrictFDerivAt_id _))
   simp only [ContinuousLinearMap.ext_iff, ContinuousLinearMap.coe_comp', Function.comp_apply] at
     hg'inv hg'invf⊢
   simp [ContinuousLinearEquiv.eq_symm_apply, *]
-#align implicit_function_data.implicit_function_has_strict_fderiv_at ImplicitFunctionData.implicitFunction_hasStrictFderivAt
+#align implicit_function_data.implicit_function_has_strict_fderiv_at ImplicitFunctionData.implicitFunction_hasStrictFDerivAt
 
 end ImplicitFunctionData
 
-namespace HasStrictFderivAt
+namespace HasStrictFDerivAt
 
 section Complemented
 
@@ -246,7 +246,7 @@ variable (f f')
 /-- Data used to apply the generic implicit function theorem to the case of a strictly
 differentiable map such that its derivative is surjective and has a complemented kernel. -/
 @[simp]
-def implicitFunctionDataOfComplemented (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤)
+def implicitFunctionDataOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) : ImplicitFunctionData 𝕜 E F (ker f')
     where
   leftFun := f
@@ -256,107 +256,107 @@ def implicitFunctionDataOfComplemented (hf : HasStrictFderivAt f f' a) (hf' : ra
   pt := a
   left_has_deriv := hf
   right_has_deriv :=
-    (Classical.choose hker).HasStrictFderivAt.comp a ((hasStrictFderivAt_id a).sub_const a)
+    (Classical.choose hker).HasStrictFDerivAt.comp a ((hasStrictFDerivAt_id a).sub_const a)
   left_range := hf'
   right_range := LinearMap.range_eq_of_proj (Classical.choose_spec hker)
   isCompl_ker := LinearMap.isCompl_of_proj (Classical.choose_spec hker)
-#align has_strict_fderiv_at.implicit_function_data_of_complemented HasStrictFderivAt.implicitFunctionDataOfComplemented
+#align has_strict_fderiv_at.implicit_function_data_of_complemented HasStrictFDerivAt.implicitFunctionDataOfComplemented
 
 /-- A local homeomorphism between `E` and `F × f'.ker` sending level surfaces of `f`
 to vertical subspaces. -/
-def implicitToLocalHomeomorphOfComplemented (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤)
+def implicitToLocalHomeomorphOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) : LocalHomeomorph E (F × ker f') :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).toLocalHomeomorph
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented HasStrictFderivAt.implicitToLocalHomeomorphOfComplemented
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented
 
 /-- Implicit function `g` defined by `f (g z y) = z`. -/
-def implicitFunctionOfComplemented (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤)
+def implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) : F → ker f' → E :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).implicitFunction
-#align has_strict_fderiv_at.implicit_function_of_complemented HasStrictFderivAt.implicitFunctionOfComplemented
+#align has_strict_fderiv_at.implicit_function_of_complemented HasStrictFDerivAt.implicitFunctionOfComplemented
 
 end Defs
 
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_fst (hf : HasStrictFderivAt f f' a)
+theorem implicitToLocalHomeomorphOfComplemented_fst (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (x : E) :
     (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker x).fst = f x :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_fst HasStrictFderivAt.implicitToLocalHomeomorphOfComplemented_fst
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_fst HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_fst
 
-theorem implicitToLocalHomeomorphOfComplemented_apply (hf : HasStrictFderivAt f f' a)
+theorem implicitToLocalHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : E) :
     hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker y =
       (f y, Classical.choose hker (y - a)) :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply HasStrictFderivAt.implicitToLocalHomeomorphOfComplemented_apply
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply
 
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_apply_ker (hf : HasStrictFderivAt f f' a)
+theorem implicitToLocalHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : ker f') :
     hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker (y + a) = (f (y + a), y) := by
   simp only [implicit_to_local_homeomorph_of_complemented_apply, add_sub_cancel,
     Classical.choose_spec hker]
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFderivAt.implicitToLocalHomeomorphOfComplemented_apply_ker
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply_ker
 
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_self (hf : HasStrictFderivAt f f' a)
+theorem implicitToLocalHomeomorphOfComplemented_self (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker a = (f a, 0) := by
   simp [hf.implicit_to_local_homeomorph_of_complemented_apply]
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_self HasStrictFderivAt.implicitToLocalHomeomorphOfComplemented_self
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_self HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_self
 
-theorem mem_implicitToLocalHomeomorphOfComplemented_source (hf : HasStrictFderivAt f f' a)
+theorem mem_implicitToLocalHomeomorphOfComplemented_source (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     a ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).source :=
   mem_toLocalHomeomorph_source _
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_source HasStrictFderivAt.mem_implicitToLocalHomeomorphOfComplemented_source
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_source HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_source
 
-theorem mem_implicitToLocalHomeomorphOfComplemented_target (hf : HasStrictFderivAt f f' a)
+theorem mem_implicitToLocalHomeomorphOfComplemented_target (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).target := by
   simpa only [implicit_to_local_homeomorph_of_complemented_self] using
     (hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).map_source <|
       hf.mem_implicit_to_local_homeomorph_of_complemented_source hf' hker
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_target HasStrictFderivAt.mem_implicitToLocalHomeomorphOfComplemented_target
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_target HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_target
 
 /-- `implicit_function_of_complemented` sends `(z, y)` to a point in `f ⁻¹' z`. -/
-theorem map_implicitFunctionOfComplemented_eq (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤)
+theorem map_implicitFunctionOfComplemented_eq (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) :
     ∀ᶠ p : F × ker f' in 𝓝 (f a, 0),
       f (hf.implicitFunctionOfComplemented f f' hf' hker p.1 p.2) = p.1 :=
   ((hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).eventually_right_inverse <|
         hf.mem_implicitToLocalHomeomorphOfComplemented_target hf' hker).mono
     fun ⟨z, y⟩ h => congr_arg Prod.fst h
-#align has_strict_fderiv_at.map_implicit_function_of_complemented_eq HasStrictFderivAt.map_implicitFunctionOfComplemented_eq
+#align has_strict_fderiv_at.map_implicit_function_of_complemented_eq HasStrictFDerivAt.map_implicitFunctionOfComplemented_eq
 
 /-- Any point in some neighborhood of `a` can be represented as `implicit_function`
 of some point. -/
-theorem eq_implicitFunctionOfComplemented (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤)
+theorem eq_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) :
     ∀ᶠ x in 𝓝 a,
       hf.implicitFunctionOfComplemented f f' hf' hker (f x)
           (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker x).snd =
         x :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).implicitFunction_apply_image
-#align has_strict_fderiv_at.eq_implicit_function_of_complemented HasStrictFderivAt.eq_implicitFunctionOfComplemented
+#align has_strict_fderiv_at.eq_implicit_function_of_complemented HasStrictFDerivAt.eq_implicitFunctionOfComplemented
 
 @[simp]
-theorem implicitFunctionOfComplemented_apply_image (hf : HasStrictFderivAt f f' a)
+theorem implicitFunctionOfComplemented_apply_image (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     hf.implicitFunctionOfComplemented f f' hf' hker (f a) 0 = a :=
   by
   convert(hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).left_inv
       (hf.mem_implicit_to_local_homeomorph_of_complemented_source hf' hker)
   exact congr_arg Prod.snd (hf.implicit_to_local_homeomorph_of_complemented_self hf' hker).symm
-#align has_strict_fderiv_at.implicit_function_of_complemented_apply_image HasStrictFderivAt.implicitFunctionOfComplemented_apply_image
+#align has_strict_fderiv_at.implicit_function_of_complemented_apply_image HasStrictFDerivAt.implicitFunctionOfComplemented_apply_image
 
-theorem to_implicitFunctionOfComplemented (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤)
+theorem to_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) :
-    HasStrictFderivAt (hf.implicitFunctionOfComplemented f f' hf' hker (f a)) (ker f').subtypeL 0 :=
+    HasStrictFDerivAt (hf.implicitFunctionOfComplemented f f' hf' hker (f a)) (ker f').subtypeL 0 :=
   by
   convert(implicit_function_data_of_complemented f f' hf hf'
-          hker).implicitFunction_hasStrictFderivAt
+          hker).implicitFunction_hasStrictFDerivAt
       (ker f').subtypeL _ _
   swap
   · ext
@@ -368,7 +368,7 @@ theorem to_implicitFunctionOfComplemented (hf : HasStrictFderivAt f f' a) (hf' :
     simp only [ContinuousLinearMap.coe_comp', Submodule.coe_subtypeL', Submodule.coeSubtype,
       Function.comp_apply, LinearMap.map_coe_ker, ContinuousLinearMap.zero_apply]
   simp only [implicit_function_data_of_complemented, map_sub, sub_self]
-#align has_strict_fderiv_at.to_implicit_function_of_complemented HasStrictFderivAt.to_implicitFunctionOfComplemented
+#align has_strict_fderiv_at.to_implicit_function_of_complemented HasStrictFDerivAt.to_implicitFunctionOfComplemented
 
 end Complemented
 
@@ -398,49 +398,49 @@ variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] [CompleteSpace 𝕜] {E
 
 /-- Given a map `f : E → F` to a finite dimensional space with a surjective derivative `f'`,
 returns a local homeomorphism between `E` and `F × ker f'`. -/
-def implicitToLocalHomeomorph (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
+def implicitToLocalHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     LocalHomeomorph E (F × ker f') :=
   haveI := FiniteDimensional.complete 𝕜 F
   hf.implicit_to_local_homeomorph_of_complemented f f' hf'
     f'.ker_closed_complemented_of_finite_dimensional_range
-#align has_strict_fderiv_at.implicit_to_local_homeomorph HasStrictFderivAt.implicitToLocalHomeomorph
+#align has_strict_fderiv_at.implicit_to_local_homeomorph HasStrictFDerivAt.implicitToLocalHomeomorph
 
 /-- Implicit function `g` defined by `f (g z y) = z`. -/
-def implicitFunction (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) : F → ker f' → E :=
+def implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) : F → ker f' → E :=
   Function.curry <| (hf.implicitToLocalHomeomorph f f' hf').symm
-#align has_strict_fderiv_at.implicit_function HasStrictFderivAt.implicitFunction
+#align has_strict_fderiv_at.implicit_function HasStrictFDerivAt.implicitFunction
 
 variable {f f'}
 
 @[simp]
-theorem implicitToLocalHomeomorph_fst (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) (x : E) :
+theorem implicitToLocalHomeomorph_fst (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) (x : E) :
     (hf.implicitToLocalHomeomorph f f' hf' x).fst = f x :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_fst HasStrictFderivAt.implicitToLocalHomeomorph_fst
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_fst HasStrictFDerivAt.implicitToLocalHomeomorph_fst
 
 @[simp]
-theorem implicitToLocalHomeomorph_apply_ker (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤)
+theorem implicitToLocalHomeomorph_apply_ker (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (y : ker f') : hf.implicitToLocalHomeomorph f f' hf' (y + a) = (f (y + a), y) := by
   apply implicit_to_local_homeomorph_of_complemented_apply_ker
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFderivAt.implicitToLocalHomeomorph_apply_ker
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorph_apply_ker
 
 @[simp]
-theorem implicitToLocalHomeomorph_self (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
+theorem implicitToLocalHomeomorph_self (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     hf.implicitToLocalHomeomorph f f' hf' a = (f a, 0) := by
   apply implicit_to_local_homeomorph_of_complemented_self
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_self HasStrictFderivAt.implicitToLocalHomeomorph_self
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_self HasStrictFDerivAt.implicitToLocalHomeomorph_self
 
-theorem mem_implicitToLocalHomeomorph_source (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
+theorem mem_implicitToLocalHomeomorph_source (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     a ∈ (hf.implicitToLocalHomeomorph f f' hf').source :=
   mem_toLocalHomeomorph_source _
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_source HasStrictFderivAt.mem_implicitToLocalHomeomorph_source
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_source HasStrictFDerivAt.mem_implicitToLocalHomeomorph_source
 
-theorem mem_implicitToLocalHomeomorph_target (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
+theorem mem_implicitToLocalHomeomorph_target (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorph f f' hf').target := by
   apply mem_implicit_to_local_homeomorph_of_complemented_target
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFderivAt.mem_implicitToLocalHomeomorph_target
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFDerivAt.mem_implicitToLocalHomeomorph_target
 
-theorem tendsto_implicitFunction (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) {α : Type _}
+theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) {α : Type _}
     {l : Filter α} {g₁ : α → F} {g₂ : α → ker f'} (h₁ : Tendsto g₁ l (𝓝 <| f a))
     (h₂ : Tendsto g₂ l (𝓝 0)) :
     Tendsto (fun t => hf.implicitFunction f f' hf' (g₁ t) (g₂ t)) l (𝓝 a) :=
@@ -451,37 +451,37 @@ theorem tendsto_implicitFunction (hf : HasStrictFderivAt f f' a) (hf' : range f'
       _
   rw [implicit_to_local_homeomorph_self]
   exact h₁.prod_mk_nhds h₂
-#align has_strict_fderiv_at.tendsto_implicit_function HasStrictFderivAt.tendsto_implicitFunction
+#align has_strict_fderiv_at.tendsto_implicit_function HasStrictFDerivAt.tendsto_implicitFunction
 
 alias tendsto_implicit_function ← _root_.filter.tendsto.implicit_function
 #align filter.tendsto.implicit_function Filter.Tendsto.implicitFunction
 
 /-- `implicit_function` sends `(z, y)` to a point in `f ⁻¹' z`. -/
-theorem map_implicitFunction_eq (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
+theorem map_implicitFunction_eq (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     ∀ᶠ p : F × ker f' in 𝓝 (f a, 0), f (hf.implicitFunction f f' hf' p.1 p.2) = p.1 := by
   apply map_implicit_function_of_complemented_eq
-#align has_strict_fderiv_at.map_implicit_function_eq HasStrictFderivAt.map_implicitFunction_eq
+#align has_strict_fderiv_at.map_implicit_function_eq HasStrictFDerivAt.map_implicitFunction_eq
 
 @[simp]
-theorem implicitFunction_apply_image (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
+theorem implicitFunction_apply_image (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     hf.implicitFunction f f' hf' (f a) 0 = a := by
   apply implicit_function_of_complemented_apply_image
-#align has_strict_fderiv_at.implicit_function_apply_image HasStrictFderivAt.implicitFunction_apply_image
+#align has_strict_fderiv_at.implicit_function_apply_image HasStrictFDerivAt.implicitFunction_apply_image
 
 /-- Any point in some neighborhood of `a` can be represented as `implicit_function`
 of some point. -/
-theorem eq_implicitFunction (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
+theorem eq_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     ∀ᶠ x in 𝓝 a,
       hf.implicitFunction f f' hf' (f x) (hf.implicitToLocalHomeomorph f f' hf' x).snd = x :=
   by apply eq_implicit_function_of_complemented
-#align has_strict_fderiv_at.eq_implicit_function HasStrictFderivAt.eq_implicitFunction
+#align has_strict_fderiv_at.eq_implicit_function HasStrictFDerivAt.eq_implicitFunction
 
-theorem to_implicitFunction (hf : HasStrictFderivAt f f' a) (hf' : range f' = ⊤) :
-    HasStrictFderivAt (hf.implicitFunction f f' hf' (f a)) (ker f').subtypeL 0 := by
+theorem to_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
+    HasStrictFDerivAt (hf.implicitFunction f f' hf' (f a)) (ker f').subtypeL 0 := by
   apply to_implicit_function_of_complemented
-#align has_strict_fderiv_at.to_implicit_function HasStrictFderivAt.to_implicitFunction
+#align has_strict_fderiv_at.to_implicit_function HasStrictFDerivAt.to_implicitFunction
 
 end FiniteDimensional
 
-end HasStrictFderivAt
+end HasStrictFDerivAt
 
Diff
@@ -346,8 +346,7 @@ theorem implicitFunctionOfComplemented_apply_image (hf : HasStrictFderivAt f f'
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     hf.implicitFunctionOfComplemented f f' hf' hker (f a) 0 = a :=
   by
-  convert
-    (hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).left_inv
+  convert(hf.implicit_to_local_homeomorph_of_complemented f f' hf' hker).left_inv
       (hf.mem_implicit_to_local_homeomorph_of_complemented_source hf' hker)
   exact congr_arg Prod.snd (hf.implicit_to_local_homeomorph_of_complemented_self hf' hker).symm
 #align has_strict_fderiv_at.implicit_function_of_complemented_apply_image HasStrictFderivAt.implicitFunctionOfComplemented_apply_image
@@ -356,8 +355,8 @@ theorem to_implicitFunctionOfComplemented (hf : HasStrictFderivAt f f' a) (hf' :
     (hker : (ker f').ClosedComplemented) :
     HasStrictFderivAt (hf.implicitFunctionOfComplemented f f' hf' hker (f a)) (ker f').subtypeL 0 :=
   by
-  convert
-    (implicit_function_data_of_complemented f f' hf hf' hker).implicitFunction_hasStrictFderivAt
+  convert(implicit_function_data_of_complemented f f' hf hf'
+          hker).implicitFunction_hasStrictFderivAt
       (ker f').subtypeL _ _
   swap
   · ext

Changes in mathlib4

mathlib3
mathlib4
chore: superfluous parentheses part 2 (#12131)

Co-authored-by: Moritz Firsching <firsching@google.com>

Diff
@@ -356,8 +356,8 @@ theorem to_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' :
   · ext
     -- Porting note: added parentheses to help `simp`
     simp only [Classical.choose_spec hker, implicitFunctionDataOfComplemented,
-      (ContinuousLinearMap.comp_apply), Submodule.coe_subtypeL', Submodule.coeSubtype,
-      (ContinuousLinearMap.id_apply)]
+      ContinuousLinearMap.comp_apply, Submodule.coe_subtypeL', Submodule.coeSubtype,
+      ContinuousLinearMap.id_apply]
   swap
   · ext
     -- Porting note: added parentheses to help `simp`
chore: classify porting notes referring to missing linters (#12098)

Reference the newly created issues #12094 and #12096, as well as the pre-existing #5171. Change all references to #10927 to #5171. Some of these changes were not labelled as "porting note"; change this for good measure.

Diff
@@ -96,7 +96,7 @@ needs to have a complete control over the choice of the implicit function.
 * both functions are strictly differentiable at `a`;
 * the derivatives are surjective;
 * the kernels of the derivatives are complementary subspaces of `E`. -/
--- Porting note: not yet supported @[nolint has_nonempty_instance]
+-- Porting note(#5171): linter not yet ported @[nolint has_nonempty_instance]
 structure ImplicitFunctionData (𝕜 : Type*) [NontriviallyNormedField 𝕜] (E : Type*)
     [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] (F : Type*) [NormedAddCommGroup F]
     [NormedSpace 𝕜 F] [CompleteSpace F] (G : Type*) [NormedAddCommGroup G] [NormedSpace 𝕜 G]
chore: Rename mul-div cancellation lemmas (#11530)

Lemma names around cancellation of multiplication and division are a mess.

This PR renames a handful of them according to the following table (each big row contains the multiplicative statement, then the three rows contain the GroupWithZero lemma name, the Group lemma, the AddGroup lemma name).

| Statement | New name | Old name | |

Diff
@@ -293,7 +293,7 @@ theorem implicitToPartialHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt
 theorem implicitToPartialHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : ker f') :
     hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker (y + a) = (f (y + a), y) := by
-  simp only [implicitToPartialHomeomorphOfComplemented_apply, add_sub_cancel,
+  simp only [implicitToPartialHomeomorphOfComplemented_apply, add_sub_cancel_right,
     Classical.choose_spec hker]
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply_ker
 
style: homogenise porting notes (#11145)

Homogenises porting notes via capitalisation and addition of whitespace.

It makes the following changes:

  • converts "--porting note" into "-- Porting note";
  • converts "porting note" into "Porting note".
Diff
@@ -205,7 +205,7 @@ theorem implicitFunction_hasStrictFDerivAt (g'inv : G →L[𝕜] E)
   have := φ.hasStrictFDerivAt.to_localInverse
   simp only [prodFun] at this
   convert this.comp (φ.rightFun φ.pt) ((hasStrictFDerivAt_const _ _).prod (hasStrictFDerivAt_id _))
-  -- porting note: added parentheses to help `simp`
+  -- Porting note: added parentheses to help `simp`
   simp only [ContinuousLinearMap.ext_iff, (ContinuousLinearMap.comp_apply)] at hg'inv hg'invf ⊢
   -- porting note (#10745): was `simp [ContinuousLinearEquiv.eq_symm_apply]`;
   -- both `simp` and `rw` fail here, `erw` works
@@ -416,7 +416,7 @@ theorem implicitToPartialHomeomorph_fst (hf : HasStrictFDerivAt f f' a) (hf' : r
 @[simp]
 theorem implicitToPartialHomeomorph_apply_ker (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (y : ker f') : hf.implicitToPartialHomeomorph f f' hf' (y + a) = (f (y + a), y) :=
-  -- porting note: had to add `haveI` (here and below)
+  -- Porting note: had to add `haveI` (here and below)
   haveI := FiniteDimensional.complete 𝕜 F
   implicitToPartialHomeomorphOfComplemented_apply_ker ..
 #align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFDerivAt.implicitToPartialHomeomorph_apply_ker
chore: classify was simp porting notes (#10746)

Classifies by adding issue number (#10745) to porting notes claiming was simp.

Diff
@@ -207,7 +207,7 @@ theorem implicitFunction_hasStrictFDerivAt (g'inv : G →L[𝕜] E)
   convert this.comp (φ.rightFun φ.pt) ((hasStrictFDerivAt_const _ _).prod (hasStrictFDerivAt_id _))
   -- porting note: added parentheses to help `simp`
   simp only [ContinuousLinearMap.ext_iff, (ContinuousLinearMap.comp_apply)] at hg'inv hg'invf ⊢
-  -- porting note: was `simp [ContinuousLinearEquiv.eq_symm_apply]`;
+  -- porting note (#10745): was `simp [ContinuousLinearEquiv.eq_symm_apply]`;
   -- both `simp` and `rw` fail here, `erw` works
   intro x
   erw [ContinuousLinearEquiv.eq_symm_apply]
chore: audit remaining uses of "local homeomorphism" in comments (#9245)

Almost all of them should speak about partial homeomorphisms instead. In two cases, I decided removing the "local" was clearer than adding "partial".

Follow-up to #8982; complements #9238.

Diff
@@ -68,7 +68,7 @@ Consider two functions `f : E → F` and `g : E → G` and a point `a` such that
 * the derivatives are surjective;
 * the kernels of the derivatives are complementary subspaces of `E`.
 
-Note that the map `x ↦ (f x, g x)` has a bijective derivative, hence it is a local homeomorphism
+Note that the map `x ↦ (f x, g x)` has a bijective derivative, hence it is a partial homeomorphism
 between `E` and `F × G`. We use this fact to define a function `φ : F → G → E`
 (see `ImplicitFunctionData.implicitFunction`) such that for `(y, z)` close enough to `(f a, g a)`
 we have `f (φ y z) = y` and `g (φ y z) = z`.
@@ -141,7 +141,7 @@ protected theorem hasStrictFDerivAt :
 
 /-- Implicit function theorem. If `f : E → F` and `g : E → G` are two maps strictly differentiable
 at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these derivatives are
-complementary subspaces of `E`, then `x ↦ (f x, g x)` defines a local homeomorphism between
+complementary subspaces of `E`, then `x ↦ (f x, g x)` defines a partial homeomorphism between
 `E` and `F × G`. In particular, `{x | f x = f a}` is locally homeomorphic to `G`. -/
 def toPartialHomeomorph : PartialHomeomorph E (F × G) :=
   φ.hasStrictFDerivAt.toPartialHomeomorph _
@@ -260,7 +260,7 @@ def implicitFunctionDataOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : ra
   isCompl_ker := LinearMap.isCompl_of_proj (Classical.choose_spec hker)
 #align has_strict_fderiv_at.implicit_function_data_of_complemented HasStrictFDerivAt.implicitFunctionDataOfComplemented
 
-/-- A local homeomorphism between `E` and `F × f'.ker` sending level surfaces of `f`
+/-- A partial homeomorphism between `E` and `F × f'.ker` sending level surfaces of `f`
 to vertical subspaces. -/
 def implicitToPartialHomeomorphOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) : PartialHomeomorph E (F × ker f') :=
@@ -392,7 +392,7 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] [CompleteSpace 𝕜] {E :
   [NormedSpace 𝕜 F] [FiniteDimensional 𝕜 F] (f : E → F) (f' : E →L[𝕜] F) {a : E}
 
 /-- Given a map `f : E → F` to a finite dimensional space with a surjective derivative `f'`,
-returns a local homeomorphism between `E` and `F × ker f'`. -/
+returns a partial homeomorphism between `E` and `F × ker f'`. -/
 def implicitToPartialHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     PartialHomeomorph E (F × ker f') :=
   haveI := FiniteDimensional.complete 𝕜 F
chore: rename LocalHomeomorph to PartialHomeomorph (#8982)

LocalHomeomorph evokes a "local homeomorphism": this is not what this means. Instead, this is a homeomorphism on an open set of the domain (extended to the whole space, by the junk value pattern). Hence, partial homeomorphism is more appropriate, and avoids confusion with IsLocallyHomeomorph.

A future PR will rename LocalEquiv to PartialEquiv.

Zulip discussion

Diff
@@ -143,35 +143,35 @@ protected theorem hasStrictFDerivAt :
 at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these derivatives are
 complementary subspaces of `E`, then `x ↦ (f x, g x)` defines a local homeomorphism between
 `E` and `F × G`. In particular, `{x | f x = f a}` is locally homeomorphic to `G`. -/
-def toLocalHomeomorph : LocalHomeomorph E (F × G) :=
-  φ.hasStrictFDerivAt.toLocalHomeomorph _
-#align implicit_function_data.to_local_homeomorph ImplicitFunctionData.toLocalHomeomorph
+def toPartialHomeomorph : PartialHomeomorph E (F × G) :=
+  φ.hasStrictFDerivAt.toPartialHomeomorph _
+#align implicit_function_data.to_local_homeomorph ImplicitFunctionData.toPartialHomeomorph
 
 /-- Implicit function theorem. If `f : E → F` and `g : E → G` are two maps strictly differentiable
 at `a`, their derivatives `f'`, `g'` are surjective, and the kernels of these derivatives are
 complementary subspaces of `E`, then `implicitFunction` is the unique (germ of a) map
 `φ : F → G → E` such that `f (φ y z) = y` and `g (φ y z) = z`. -/
 def implicitFunction : F → G → E :=
-  Function.curry <| φ.toLocalHomeomorph.symm
+  Function.curry <| φ.toPartialHomeomorph.symm
 #align implicit_function_data.implicit_function ImplicitFunctionData.implicitFunction
 
 @[simp]
-theorem toLocalHomeomorph_coe : ⇑φ.toLocalHomeomorph = φ.prodFun :=
+theorem toPartialHomeomorph_coe : ⇑φ.toPartialHomeomorph = φ.prodFun :=
   rfl
-#align implicit_function_data.to_local_homeomorph_coe ImplicitFunctionData.toLocalHomeomorph_coe
+#align implicit_function_data.to_local_homeomorph_coe ImplicitFunctionData.toPartialHomeomorph_coe
 
-theorem toLocalHomeomorph_apply (x : E) : φ.toLocalHomeomorph x = (φ.leftFun x, φ.rightFun x) :=
+theorem toPartialHomeomorph_apply (x : E) : φ.toPartialHomeomorph x = (φ.leftFun x, φ.rightFun x) :=
   rfl
-#align implicit_function_data.to_local_homeomorph_apply ImplicitFunctionData.toLocalHomeomorph_apply
+#align implicit_function_data.to_local_homeomorph_apply ImplicitFunctionData.toPartialHomeomorph_apply
 
-theorem pt_mem_toLocalHomeomorph_source : φ.pt ∈ φ.toLocalHomeomorph.source :=
-  φ.hasStrictFDerivAt.mem_toLocalHomeomorph_source
-#align implicit_function_data.pt_mem_to_local_homeomorph_source ImplicitFunctionData.pt_mem_toLocalHomeomorph_source
+theorem pt_mem_toPartialHomeomorph_source : φ.pt ∈ φ.toPartialHomeomorph.source :=
+  φ.hasStrictFDerivAt.mem_toPartialHomeomorph_source
+#align implicit_function_data.pt_mem_to_local_homeomorph_source ImplicitFunctionData.pt_mem_toPartialHomeomorph_source
 
-theorem map_pt_mem_toLocalHomeomorph_target :
-    (φ.leftFun φ.pt, φ.rightFun φ.pt) ∈ φ.toLocalHomeomorph.target :=
-  φ.toLocalHomeomorph.map_source <| φ.pt_mem_toLocalHomeomorph_source
-#align implicit_function_data.map_pt_mem_to_local_homeomorph_target ImplicitFunctionData.map_pt_mem_toLocalHomeomorph_target
+theorem map_pt_mem_toPartialHomeomorph_target :
+    (φ.leftFun φ.pt, φ.rightFun φ.pt) ∈ φ.toPartialHomeomorph.target :=
+  φ.toPartialHomeomorph.map_source <| φ.pt_mem_toPartialHomeomorph_source
+#align implicit_function_data.map_pt_mem_to_local_homeomorph_target ImplicitFunctionData.map_pt_mem_toPartialHomeomorph_target
 
 theorem prod_map_implicitFunction :
     ∀ᶠ p : F × G in 𝓝 (φ.prodFun φ.pt), φ.prodFun (φ.implicitFunction p.1 p.2) = p :=
@@ -262,10 +262,10 @@ def implicitFunctionDataOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : ra
 
 /-- A local homeomorphism between `E` and `F × f'.ker` sending level surfaces of `f`
 to vertical subspaces. -/
-def implicitToLocalHomeomorphOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
-    (hker : (ker f').ClosedComplemented) : LocalHomeomorph E (F × ker f') :=
-  (implicitFunctionDataOfComplemented f f' hf hf' hker).toLocalHomeomorph
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented
+def implicitToPartialHomeomorphOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
+    (hker : (ker f').ClosedComplemented) : PartialHomeomorph E (F × ker f') :=
+  (implicitFunctionDataOfComplemented f f' hf hf' hker).toPartialHomeomorph
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented
 
 /-- Implicit function `g` defined by `f (g z y) = z`. -/
 def implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
@@ -276,55 +276,55 @@ def implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range
 end Defs
 
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_fst (hf : HasStrictFDerivAt f f' a)
+theorem implicitToPartialHomeomorphOfComplemented_fst (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (x : E) :
-    (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker x).fst = f x :=
+    (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker x).fst = f x :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_fst HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_fst
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_fst HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_fst
 
-theorem implicitToLocalHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt f f' a)
+theorem implicitToPartialHomeomorphOfComplemented_apply (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : E) :
-    hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker y =
+    hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker y =
       (f y, Classical.choose hker (y - a)) :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply
 
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
+theorem implicitToPartialHomeomorphOfComplemented_apply_ker (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) (y : ker f') :
-    hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker (y + a) = (f (y + a), y) := by
-  simp only [implicitToLocalHomeomorphOfComplemented_apply, add_sub_cancel,
+    hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker (y + a) = (f (y + a), y) := by
+  simp only [implicitToPartialHomeomorphOfComplemented_apply, add_sub_cancel,
     Classical.choose_spec hker]
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_apply_ker
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_apply_ker HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_apply_ker
 
 @[simp]
-theorem implicitToLocalHomeomorphOfComplemented_self (hf : HasStrictFDerivAt f f' a)
+theorem implicitToPartialHomeomorphOfComplemented_self (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
-    hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker a = (f a, 0) := by
-  simp [hf.implicitToLocalHomeomorphOfComplemented_apply]
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_self HasStrictFDerivAt.implicitToLocalHomeomorphOfComplemented_self
+    hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker a = (f a, 0) := by
+  simp [hf.implicitToPartialHomeomorphOfComplemented_apply]
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_of_complemented_self HasStrictFDerivAt.implicitToPartialHomeomorphOfComplemented_self
 
-theorem mem_implicitToLocalHomeomorphOfComplemented_source (hf : HasStrictFDerivAt f f' a)
+theorem mem_implicitToPartialHomeomorphOfComplemented_source (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
-    a ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).source :=
-  ImplicitFunctionData.pt_mem_toLocalHomeomorph_source _
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_source HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_source
+    a ∈ (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).source :=
+  ImplicitFunctionData.pt_mem_toPartialHomeomorph_source _
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_source HasStrictFDerivAt.mem_implicitToPartialHomeomorphOfComplemented_source
 
-theorem mem_implicitToLocalHomeomorphOfComplemented_target (hf : HasStrictFDerivAt f f' a)
+theorem mem_implicitToPartialHomeomorphOfComplemented_target (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
-    (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).target := by
-  simpa only [implicitToLocalHomeomorphOfComplemented_self] using
-    (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).map_source <|
-      hf.mem_implicitToLocalHomeomorphOfComplemented_source hf' hker
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_target HasStrictFDerivAt.mem_implicitToLocalHomeomorphOfComplemented_target
+    (f a, (0 : ker f')) ∈ (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).target := by
+  simpa only [implicitToPartialHomeomorphOfComplemented_self] using
+    (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).map_source <|
+      hf.mem_implicitToPartialHomeomorphOfComplemented_source hf' hker
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_of_complemented_target HasStrictFDerivAt.mem_implicitToPartialHomeomorphOfComplemented_target
 
 /-- `HasStrictFDerivAt.implicitFunctionOfComplemented` sends `(z, y)` to a point in `f ⁻¹' z`. -/
 theorem map_implicitFunctionOfComplemented_eq (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) :
     ∀ᶠ p : F × ker f' in 𝓝 (f a, 0),
       f (hf.implicitFunctionOfComplemented f f' hf' hker p.1 p.2) = p.1 :=
-  ((hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).eventually_right_inverse <|
-        hf.mem_implicitToLocalHomeomorphOfComplemented_target hf' hker).mono
+  ((hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).eventually_right_inverse <|
+        hf.mem_implicitToPartialHomeomorphOfComplemented_target hf' hker).mono
     fun ⟨_, _⟩ h => congr_arg Prod.fst h
 #align has_strict_fderiv_at.map_implicit_function_of_complemented_eq HasStrictFDerivAt.map_implicitFunctionOfComplemented_eq
 
@@ -333,7 +333,7 @@ theorem map_implicitFunctionOfComplemented_eq (hf : HasStrictFDerivAt f f' a) (h
 theorem eq_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
     (hker : (ker f').ClosedComplemented) :
     ∀ᶠ x in 𝓝 a, hf.implicitFunctionOfComplemented f f' hf' hker (f x)
-      (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker x).snd = x :=
+      (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker x).snd = x :=
   (implicitFunctionDataOfComplemented f f' hf hf' hker).implicitFunction_apply_image
 #align has_strict_fderiv_at.eq_implicit_function_of_complemented HasStrictFDerivAt.eq_implicitFunctionOfComplemented
 
@@ -341,9 +341,9 @@ theorem eq_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' :
 theorem implicitFunctionOfComplemented_apply_image (hf : HasStrictFDerivAt f f' a)
     (hf' : range f' = ⊤) (hker : (ker f').ClosedComplemented) :
     hf.implicitFunctionOfComplemented f f' hf' hker (f a) 0 = a := by
-  simpa only [implicitToLocalHomeomorphOfComplemented_self] using
-      (hf.implicitToLocalHomeomorphOfComplemented f f' hf' hker).left_inv
-      (hf.mem_implicitToLocalHomeomorphOfComplemented_source hf' hker)
+  simpa only [implicitToPartialHomeomorphOfComplemented_self] using
+      (hf.implicitToPartialHomeomorphOfComplemented f f' hf' hker).left_inv
+      (hf.mem_implicitToPartialHomeomorphOfComplemented_source hf' hker)
 #align has_strict_fderiv_at.implicit_function_of_complemented_apply_image HasStrictFDerivAt.implicitFunctionOfComplemented_apply_image
 
 theorem to_implicitFunctionOfComplemented (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
@@ -393,60 +393,60 @@ variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] [CompleteSpace 𝕜] {E :
 
 /-- Given a map `f : E → F` to a finite dimensional space with a surjective derivative `f'`,
 returns a local homeomorphism between `E` and `F × ker f'`. -/
-def implicitToLocalHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    LocalHomeomorph E (F × ker f') :=
+def implicitToPartialHomeomorph (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
+    PartialHomeomorph E (F × ker f') :=
   haveI := FiniteDimensional.complete 𝕜 F
-  hf.implicitToLocalHomeomorphOfComplemented f f' hf'
+  hf.implicitToPartialHomeomorphOfComplemented f f' hf'
     f'.ker_closedComplemented_of_finiteDimensional_range
-#align has_strict_fderiv_at.implicit_to_local_homeomorph HasStrictFDerivAt.implicitToLocalHomeomorph
+#align has_strict_fderiv_at.implicit_to_local_homeomorph HasStrictFDerivAt.implicitToPartialHomeomorph
 
 /-- Implicit function `g` defined by `f (g z y) = z`. -/
 def implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) : F → ker f' → E :=
-  Function.curry <| (hf.implicitToLocalHomeomorph f f' hf').symm
+  Function.curry <| (hf.implicitToPartialHomeomorph f f' hf').symm
 #align has_strict_fderiv_at.implicit_function HasStrictFDerivAt.implicitFunction
 
 variable {f f'}
 
 @[simp]
-theorem implicitToLocalHomeomorph_fst (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) (x : E) :
-    (hf.implicitToLocalHomeomorph f f' hf' x).fst = f x :=
+theorem implicitToPartialHomeomorph_fst (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
+    (x : E) : (hf.implicitToPartialHomeomorph f f' hf' x).fst = f x :=
   rfl
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_fst HasStrictFDerivAt.implicitToLocalHomeomorph_fst
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_fst HasStrictFDerivAt.implicitToPartialHomeomorph_fst
 
 @[simp]
-theorem implicitToLocalHomeomorph_apply_ker (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
-    (y : ker f') : hf.implicitToLocalHomeomorph f f' hf' (y + a) = (f (y + a), y) :=
+theorem implicitToPartialHomeomorph_apply_ker (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤)
+    (y : ker f') : hf.implicitToPartialHomeomorph f f' hf' (y + a) = (f (y + a), y) :=
   -- porting note: had to add `haveI` (here and below)
   haveI := FiniteDimensional.complete 𝕜 F
-  implicitToLocalHomeomorphOfComplemented_apply_ker ..
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFDerivAt.implicitToLocalHomeomorph_apply_ker
+  implicitToPartialHomeomorphOfComplemented_apply_ker ..
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_apply_ker HasStrictFDerivAt.implicitToPartialHomeomorph_apply_ker
 
 @[simp]
-theorem implicitToLocalHomeomorph_self (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    hf.implicitToLocalHomeomorph f f' hf' a = (f a, 0) :=
+theorem implicitToPartialHomeomorph_self (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
+    hf.implicitToPartialHomeomorph f f' hf' a = (f a, 0) :=
   haveI := FiniteDimensional.complete 𝕜 F
-  implicitToLocalHomeomorphOfComplemented_self ..
-#align has_strict_fderiv_at.implicit_to_local_homeomorph_self HasStrictFDerivAt.implicitToLocalHomeomorph_self
+  implicitToPartialHomeomorphOfComplemented_self ..
+#align has_strict_fderiv_at.implicit_to_local_homeomorph_self HasStrictFDerivAt.implicitToPartialHomeomorph_self
 
-theorem mem_implicitToLocalHomeomorph_source (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    a ∈ (hf.implicitToLocalHomeomorph f f' hf').source :=
+theorem mem_implicitToPartialHomeomorph_source (hf : HasStrictFDerivAt f f' a)
+    (hf' : range f' = ⊤) : a ∈ (hf.implicitToPartialHomeomorph f f' hf').source :=
   haveI := FiniteDimensional.complete 𝕜 F
-  ImplicitFunctionData.pt_mem_toLocalHomeomorph_source _
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_source HasStrictFDerivAt.mem_implicitToLocalHomeomorph_source
+  ImplicitFunctionData.pt_mem_toPartialHomeomorph_source _
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_source HasStrictFDerivAt.mem_implicitToPartialHomeomorph_source
 
-theorem mem_implicitToLocalHomeomorph_target (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
-    (f a, (0 : ker f')) ∈ (hf.implicitToLocalHomeomorph f f' hf').target :=
+theorem mem_implicitToPartialHomeomorph_target (hf : HasStrictFDerivAt f f' a)
+    (hf' : range f' = ⊤) : (f a, (0 : ker f')) ∈ (hf.implicitToPartialHomeomorph f f' hf').target :=
   haveI := FiniteDimensional.complete 𝕜 F
-  mem_implicitToLocalHomeomorphOfComplemented_target ..
-#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFDerivAt.mem_implicitToLocalHomeomorph_target
+  mem_implicitToPartialHomeomorphOfComplemented_target ..
+#align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFDerivAt.mem_implicitToPartialHomeomorph_target
 
 theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) {α : Type*}
     {l : Filter α} {g₁ : α → F} {g₂ : α → ker f'} (h₁ : Tendsto g₁ l (𝓝 <| f a))
     (h₂ : Tendsto g₂ l (𝓝 0)) :
     Tendsto (fun t => hf.implicitFunction f f' hf' (g₁ t) (g₂ t)) l (𝓝 a) := by
-  refine' ((hf.implicitToLocalHomeomorph f f' hf').tendsto_symm
-    (hf.mem_implicitToLocalHomeomorph_source hf')).comp _
-  rw [implicitToLocalHomeomorph_self]
+  refine' ((hf.implicitToPartialHomeomorph f f' hf').tendsto_symm
+    (hf.mem_implicitToPartialHomeomorph_source hf')).comp _
+  rw [implicitToPartialHomeomorph_self]
   exact h₁.prod_mk_nhds h₂
 #align has_strict_fderiv_at.tendsto_implicit_function HasStrictFDerivAt.tendsto_implicitFunction
 
@@ -471,7 +471,7 @@ theorem implicitFunction_apply_image (hf : HasStrictFDerivAt f f' a) (hf' : rang
 of some point. -/
 theorem eq_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) :
     ∀ᶠ x in 𝓝 a,
-      hf.implicitFunction f f' hf' (f x) (hf.implicitToLocalHomeomorph f f' hf' x).snd = x :=
+      hf.implicitFunction f f' hf' (f x) (hf.implicitToPartialHomeomorph f f' hf' x).snd = x :=
   haveI := FiniteDimensional.complete 𝕜 F
   eq_implicitFunctionOfComplemented ..
 #align has_strict_fderiv_at.eq_implicit_function HasStrictFDerivAt.eq_implicitFunction
chore(Calculus/Inverse): split (#8603)
Diff
@@ -3,7 +3,9 @@ Copyright (c) 2020 Yury Kudryashov. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yury Kudryashov
 -/
-import Mathlib.Analysis.Calculus.Inverse
+import Mathlib.Analysis.Calculus.InverseFunctionTheorem.FDeriv
+import Mathlib.Analysis.Calculus.FDeriv.Add
+import Mathlib.Analysis.Calculus.FDeriv.Prod
 import Mathlib.Analysis.NormedSpace.Complemented
 
 #align_import analysis.calculus.implicit from "leanprover-community/mathlib"@"f2ce6086713c78a7f880485f7917ea547a215982"
feat: patch for new alias command (#6172)
Diff
@@ -448,7 +448,7 @@ theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f'
   exact h₁.prod_mk_nhds h₂
 #align has_strict_fderiv_at.tendsto_implicit_function HasStrictFDerivAt.tendsto_implicitFunction
 
-alias tendsto_implicitFunction ← _root_.Filter.Tendsto.implicitFunction
+alias _root_.Filter.Tendsto.implicitFunction := tendsto_implicitFunction
 #align filter.tendsto.implicit_function Filter.Tendsto.implicitFunction
 
 /-- `HasStrictFDerivAt.implicitFunction` sends `(z, y)` to a point in `f ⁻¹' z`. -/
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -95,9 +95,9 @@ needs to have a complete control over the choice of the implicit function.
 * the derivatives are surjective;
 * the kernels of the derivatives are complementary subspaces of `E`. -/
 -- Porting note: not yet supported @[nolint has_nonempty_instance]
-structure ImplicitFunctionData (𝕜 : Type _) [NontriviallyNormedField 𝕜] (E : Type _)
-    [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] (F : Type _) [NormedAddCommGroup F]
-    [NormedSpace 𝕜 F] [CompleteSpace F] (G : Type _) [NormedAddCommGroup G] [NormedSpace 𝕜 G]
+structure ImplicitFunctionData (𝕜 : Type*) [NontriviallyNormedField 𝕜] (E : Type*)
+    [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] (F : Type*) [NormedAddCommGroup F]
+    [NormedSpace 𝕜 F] [CompleteSpace F] (G : Type*) [NormedAddCommGroup G] [NormedSpace 𝕜 G]
     [CompleteSpace G] where
   leftFun : E → F
   leftDeriv : E →L[𝕜] F
@@ -113,9 +113,9 @@ structure ImplicitFunctionData (𝕜 : Type _) [NontriviallyNormedField 𝕜] (E
 
 namespace ImplicitFunctionData
 
-variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddCommGroup E]
-  [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type _} [NormedAddCommGroup F] [NormedSpace 𝕜 F]
-  [CompleteSpace F] {G : Type _} [NormedAddCommGroup G] [NormedSpace 𝕜 G] [CompleteSpace G]
+variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {E : Type*} [NormedAddCommGroup E]
+  [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type*} [NormedAddCommGroup F] [NormedSpace 𝕜 F]
+  [CompleteSpace F] {G : Type*} [NormedAddCommGroup G] [NormedSpace 𝕜 G] [CompleteSpace G]
   (φ : ImplicitFunctionData 𝕜 E F G)
 
 /-- The function given by `x ↦ (leftFun x, rightFun x)`. -/
@@ -232,8 +232,8 @@ Note that a map with these properties is not unique. E.g., different choices of
 complementary to `ker f'` lead to different maps `φ`.
 -/
 
-variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] {E : Type _} [NormedAddCommGroup E]
-  [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type _} [NormedAddCommGroup F] [NormedSpace 𝕜 F]
+variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] {E : Type*} [NormedAddCommGroup E]
+  [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type*} [NormedAddCommGroup F] [NormedSpace 𝕜 F]
   [CompleteSpace F] {f : E → F} {f' : E →L[𝕜] F} {a : E}
 
 section Defs
@@ -385,8 +385,8 @@ complementary to `ker f'` lead to different maps `φ`.
 
 section FiniteDimensional
 
-variable {𝕜 : Type _} [NontriviallyNormedField 𝕜] [CompleteSpace 𝕜] {E : Type _}
-  [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type _} [NormedAddCommGroup F]
+variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] [CompleteSpace 𝕜] {E : Type*}
+  [NormedAddCommGroup E] [NormedSpace 𝕜 E] [CompleteSpace E] {F : Type*} [NormedAddCommGroup F]
   [NormedSpace 𝕜 F] [FiniteDimensional 𝕜 F] (f : E → F) (f' : E →L[𝕜] F) {a : E}
 
 /-- Given a map `f : E → F` to a finite dimensional space with a surjective derivative `f'`,
@@ -438,7 +438,7 @@ theorem mem_implicitToLocalHomeomorph_target (hf : HasStrictFDerivAt f f' a) (hf
   mem_implicitToLocalHomeomorphOfComplemented_target ..
 #align has_strict_fderiv_at.mem_implicit_to_local_homeomorph_target HasStrictFDerivAt.mem_implicitToLocalHomeomorph_target
 
-theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) {α : Type _}
+theorem tendsto_implicitFunction (hf : HasStrictFDerivAt f f' a) (hf' : range f' = ⊤) {α : Type*}
     {l : Filter α} {g₁ : α → F} {g₂ : α → ker f'} (h₁ : Tendsto g₁ l (𝓝 <| f a))
     (h₂ : Tendsto g₂ l (𝓝 0)) :
     Tendsto (fun t => hf.implicitFunction f f' hf' (g₁ t) (g₂ t)) l (𝓝 a) := by
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -2,15 +2,12 @@
 Copyright (c) 2020 Yury Kudryashov. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Yury Kudryashov
-
-! This file was ported from Lean 3 source module analysis.calculus.implicit
-! leanprover-community/mathlib commit f2ce6086713c78a7f880485f7917ea547a215982
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Analysis.Calculus.Inverse
 import Mathlib.Analysis.NormedSpace.Complemented
 
+#align_import analysis.calculus.implicit from "leanprover-community/mathlib"@"f2ce6086713c78a7f880485f7917ea547a215982"
+
 /-!
 # Implicit function theorem
 
feat: port Analysis.Calculus.Implicit (#4665)

Co-authored-by: Moritz Firsching <firsching@google.com> Co-authored-by: Yury G. Kudryashov <urkud@urkud.name>

Dependencies 12 + 882

883 files ported (98.7%)
389556 lines ported (98.6%)
Show graph

The unported dependencies are

The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file