Theorem: ContinuousLinearMap.isOpenMap
File: Mathlib/Analysis/NormedSpace/Banach.lean

tactic: intro s hs
state_before: 𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
⊢ IsOpenMap ↑f

tactic: rcases exists_preimage_norm_le f surj with ⟨C, Cpos, hC⟩
state_before: 𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
⊢ IsOpen (↑f '' s)

tactic: refine' isOpen_iff.2 fun y yfs => _
state_before: case intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
⊢ IsOpen (↑f '' s)

tactic: rcases mem_image_iff_bex.1 yfs with ⟨x, xs, fxy⟩
state_before: case intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
⊢ ∃ ε, ε > 0 ∧ ball y ε ⊆ ↑f '' s

tactic: rcases isOpen_iff.1 hs x xs with ⟨ε, εpos, hε⟩
state_before: case intro.intro.intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
⊢ ∃ ε, ε > 0 ∧ ball y ε ⊆ ↑f '' s

tactic: refine' ⟨ε / C, div_pos εpos Cpos, fun z hz => _⟩
state_before: case intro.intro.intro.intro.intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
⊢ ∃ ε, ε > 0 ∧ ball y ε ⊆ ↑f '' s

tactic: rcases hC (z - y) with ⟨w, wim, wnorm⟩
state_before: case intro.intro.intro.intro.intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
⊢ z ∈ ↑f '' s

tactic: have : f (x + w) = z := by rw [f.map_add, wim, fxy, add_sub_cancel'_right]
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
⊢ z ∈ ↑f '' s

tactic: rw [← this]
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
this : ↑f (x + w) = z
⊢ z ∈ ↑f '' s

tactic: have : x + w ∈ ball x ε :=
  calc
    dist (x + w) x = ‖w‖ := by
      rw [dist_eq_norm]
      simp
    _ ≤ C * ‖z - y‖ := wnorm
    _ < C * (ε / C) := by
      apply mul_lt_mul_of_pos_left _ Cpos
      rwa [mem_ball, dist_eq_norm] at hz
    _ = ε := mul_div_cancel' _ (ne_of_gt Cpos)
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
this : ↑f (x + w) = z
⊢ ↑f (x + w) ∈ ↑f '' s

tactic: exact Set.mem_image_of_mem _ (hε this)
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
this✝ : ↑f (x + w) = z
this : x + w ∈ ball x ε
⊢ ↑f (x + w) ∈ ↑f '' s

tactic: rw [f.map_add, wim, fxy, add_sub_cancel'_right]
state_before: 𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
⊢ ↑f (x + w) = z

tactic: rw [dist_eq_norm]
state_before: 𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
this : ↑f (x + w) = z
⊢ dist (x + w) x = ‖w‖

tactic: simp
state_before: 𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
this : ↑f (x + w) = z
⊢ ‖x + w - x‖ = ‖w‖

tactic: apply mul_lt_mul_of_pos_left _ Cpos
state_before: 𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
this : ↑f (x + w) = z
⊢ C * ‖z - y‖ < C * (ε / C)

tactic: rwa [mem_ball, dist_eq_norm] at hz
state_before: 𝕜 : Type u_3
inst✝⁶ : NontriviallyNormedField 𝕜
E : Type u_1
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
F : Type u_2
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
f : E →L[𝕜] F
inst✝¹ : CompleteSpace F
inst✝ : CompleteSpace E
surj : Surjective ↑f
s : Set E
hs : IsOpen s
C : ℝ
Cpos : C > 0
hC : ∀ (y : F), ∃ x, ↑f x = y ∧ ‖x‖ ≤ C * ‖y‖
y : F
yfs : y ∈ ↑f '' s
x : E
xs : x ∈ s
fxy : ↑f x = y
ε : ℝ
εpos : ε > 0
hε : ball x ε ⊆ s
z : F
hz : z ∈ ball y (ε / C)
w : E
wim : ↑f w = z - y
wnorm : ‖w‖ ≤ C * ‖z - y‖
this : ↑f (x + w) = z
⊢ ‖z - y‖ < ε / C