Theorem: ApproximatesLinearOn.exists_homeomorph_extension
File: Mathlib/Analysis/Calculus/Inverse.lean

tactic: obtain ⟨u, hu, uf⟩ :
  ∃ u : E → F, LipschitzWith (lipschitzExtensionConstant F * c) u ∧ EqOn (f - ⇑f') u s :=
  hf.lipschitzOnWith.extend_finite_dimension
state_before: 𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
⊢ ∃ g, EqOn f (↑g) s

tactic: let g : E → F := fun x => f' x + u x
state_before: case intro.intro
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
⊢ ∃ g, EqOn f (↑g) s

tactic: have fg : EqOn f g s := fun x hx => by simp_rw [← uf hx, Pi.sub_apply, add_sub_cancel'_right]
state_before: case intro.intro
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
⊢ ∃ g, EqOn f (↑g) s

tactic: have hg : ApproximatesLinearOn g (f' : E →L[ℝ] F) univ (lipschitzExtensionConstant F * c) := by
  apply LipschitzOnWith.approximatesLinearOn
  rw [lipschitz_on_univ]
  convert hu
  ext x
  simp only [add_sub_cancel', ContinuousLinearEquiv.coe_coe, Pi.sub_apply]
state_before: case intro.intro
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
⊢ ∃ g, EqOn f (↑g) s

tactic: haveI : FiniteDimensional ℝ E := f'.symm.finiteDimensional
state_before: case intro.intro
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
hg : ApproximatesLinearOn g (↑f') univ (lipschitzExtensionConstant F * c)
⊢ ∃ g, EqOn f (↑g) s

tactic: exact ⟨hg.toHomeomorph g hc, fg⟩
state_before: case intro.intro
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
hg : ApproximatesLinearOn g (↑f') univ (lipschitzExtensionConstant F * c)
this : FiniteDimensional ℝ E
⊢ ∃ g, EqOn f (↑g) s

tactic: simp_rw [← uf hx, Pi.sub_apply, add_sub_cancel'_right]
state_before: 𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
x : E
hx : x ∈ s
⊢ f x = g x

tactic: apply LipschitzOnWith.approximatesLinearOn
state_before: 𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
⊢ ApproximatesLinearOn g (↑f') univ (lipschitzExtensionConstant F * c)

tactic: rw [lipschitz_on_univ]
state_before: case a
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
⊢ LipschitzOnWith (lipschitzExtensionConstant F * c) (g - ↑↑f') univ

tactic: convert hu
state_before: case a
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
⊢ LipschitzWith (lipschitzExtensionConstant F * c) (g - ↑↑f')

tactic: ext x
state_before: case h.e'_6
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
⊢ g - ↑↑f' = u

tactic: simp only [add_sub_cancel', ContinuousLinearEquiv.coe_coe, Pi.sub_apply]
state_before: case h.e'_6.h
𝕜 : Type ?u.461349
inst✝¹⁴ : NontriviallyNormedField 𝕜
E✝ : Type ?u.461355
inst✝¹³ : NormedAddCommGroup E✝
inst✝¹² : NormedSpace 𝕜 E✝
F✝ : Type ?u.461465
inst✝¹¹ : NormedAddCommGroup F✝
inst✝¹⁰ : NormedSpace 𝕜 F✝
G : Type ?u.461568
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type ?u.461671
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
ε : ℝ
inst✝⁵ : CompleteSpace E✝
f✝ : E✝ → F✝
f'✝ : E✝ ≃L[𝕜] F✝
s✝ : Set E✝
c✝ : ℝ≥0
E : Type u_1
inst✝⁴ : NormedAddCommGroup E
inst✝³ : NormedSpace ℝ E
F : Type u_2
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : FiniteDimensional ℝ F
s : Set E
f : E → F
f' : E ≃L[ℝ] F
c : ℝ≥0
hf : ApproximatesLinearOn f (↑f') s c
hc : Subsingleton E ∨ lipschitzExtensionConstant F * c < ‖↑(ContinuousLinearEquiv.symm f')‖₊⁻¹
u : E → F
hu : LipschitzWith (lipschitzExtensionConstant F * c) u
uf : EqOn (f - ↑f') u s
g : E → F := fun x => ↑f' x + u x
fg : EqOn f g s
x : E
⊢ (g - ↑↑f') x = u x