Theorem: NormedAddGroupHom.ker_completion
File: Mathlib/Analysis/Normed/Group/HomCompletion.lean

tactic: refine le_antisymm ?_ (closure_minimal f.ker_le_ker_completion f.completion.isClosed_ker)
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
⊢ ↑(ker (completion f)) = closure ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f))))

tactic: rintro hatg (hatg_in : f.completion hatg = 0)
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
⊢ ↑(ker (completion f)) ≤ closure ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f))))

tactic: rw [SeminormedAddCommGroup.mem_closure_iff]
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
⊢ hatg ∈ closure ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f))))

tactic: intro ε ε_pos
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
⊢ ∀ (ε : ℝ), 0 < ε → ∃ b, b ∈ ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f)))) ∧ ‖hatg - b‖ < ε

tactic: rcases h.exists_pos with ⟨C', C'_pos, hC'⟩
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
⊢ ∃ b, b ∈ ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f)))) ∧ ‖hatg - b‖ < ε

tactic: rcases exists_pos_mul_lt ε_pos (1 + C' * ‖f‖) with ⟨δ, δ_pos, hδ⟩
state_before: case intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
⊢ ∃ b, b ∈ ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f)))) ∧ ‖hatg - b‖ < ε

tactic: obtain ⟨_, ⟨g : G, rfl⟩, hg : ‖hatg - g‖ < δ⟩ :=
  SeminormedAddCommGroup.mem_closure_iff.mp (Completion.denseInducing_coe.dense hatg) δ δ_pos
state_before: case intro.intro.intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
⊢ ∃ b, b ∈ ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f)))) ∧ ‖hatg - b‖ < ε

tactic: obtain ⟨g' : G, hgg' : f g' = f g, hfg : ‖g'‖ ≤ C' * ‖f g‖⟩ := hC' (f g) (mem_range_self _ g)
state_before: case intro.intro.intro.intro.intro.intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
⊢ ∃ b, b ∈ ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f)))) ∧ ‖hatg - b‖ < ε

tactic: have mem_ker : g - g' ∈ f.ker := by rw [f.mem_ker, map_sub, sub_eq_zero.mpr hgg'.symm]
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
⊢ ∃ b, b ∈ ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f)))) ∧ ‖hatg - b‖ < ε

tactic: refine ⟨_, ⟨⟨g - g', mem_ker⟩, rfl⟩, ?_⟩
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
⊢ ∃ b, b ∈ ↑(range (NormedAddGroupHom.comp toCompl (incl (ker f)))) ∧ ‖hatg - b‖ < ε

tactic: have : ‖f g‖ ≤ ‖f‖ * δ
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
⊢ ‖hatg - ↑(toAddMonoidHom (NormedAddGroupHom.comp toCompl (incl (ker f)))) { val := g - g', property := mem_ker }‖ < ε

tactic: calc ‖f g‖ ≤ ‖f‖ * ‖hatg - g‖ := by simpa [hatg_in] using f.completion.le_opNorm (hatg - g)
  _ ≤ ‖f‖ * δ := by gcongr
state_before: case this
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
⊢ ‖↑f g‖ ≤ ‖f‖ * δ

case intro.intro.intro.intro.intro.intro.intro.intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
this : ‖↑f g‖ ≤ ‖f‖ * δ
⊢ ‖hatg - ↑(toAddMonoidHom (NormedAddGroupHom.comp toCompl (incl (ker f)))) { val := g - g', property := mem_ker }‖ < ε

tactic: calc ‖hatg - ↑(g - g')‖ = ‖hatg - g + g'‖ := by rw [Completion.coe_sub, sub_add]
  _ ≤ ‖hatg - g‖ + ‖(g' : Completion G)‖ := norm_add_le _ _
  _ = ‖hatg - g‖ + ‖g'‖ := by rw [Completion.norm_coe]
  _ < δ + C' * ‖f g‖ := add_lt_add_of_lt_of_le hg hfg
  _ ≤ δ + C' * (‖f‖ * δ) := by gcongr
  _ < ε := by simpa only [add_mul, one_mul, mul_assoc] using hδ
state_before: case intro.intro.intro.intro.intro.intro.intro.intro.intro
G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
this : ‖↑f g‖ ≤ ‖f‖ * δ
⊢ ‖hatg - ↑(toAddMonoidHom (NormedAddGroupHom.comp toCompl (incl (ker f)))) { val := g - g', property := mem_ker }‖ < ε

tactic: rw [f.mem_ker, map_sub, sub_eq_zero.mpr hgg'.symm]
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
⊢ g - g' ∈ ker f

tactic: simpa [hatg_in] using f.completion.le_opNorm (hatg - g)
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
⊢ ‖↑f g‖ ≤ ‖f‖ * ‖hatg - ↑G g‖

tactic: gcongr
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
⊢ ‖f‖ * ‖hatg - ↑G g‖ ≤ ‖f‖ * δ

tactic: rw [Completion.coe_sub, sub_add]
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
this : ‖↑f g‖ ≤ ‖f‖ * δ
⊢ ‖hatg - ↑G (g - g')‖ = ‖hatg - ↑G g + ↑G g'‖

tactic: rw [Completion.norm_coe]
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
this : ‖↑f g‖ ≤ ‖f‖ * δ
⊢ ‖hatg - ↑G g‖ + ‖↑G g'‖ = ‖hatg - ↑G g‖ + ‖g'‖

tactic: gcongr
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
this : ‖↑f g‖ ≤ ‖f‖ * δ
⊢ δ + C' * ‖↑f g‖ ≤ δ + C' * (‖f‖ * δ)

tactic: simpa only [add_mul, one_mul, mul_assoc] using hδ
state_before: G : Type u_1
inst✝² : SeminormedAddCommGroup G
H : Type u_2
inst✝¹ : SeminormedAddCommGroup H
K : Type ?u.21573
inst✝ : SeminormedAddCommGroup K
f : NormedAddGroupHom G H
C : ℝ
h : SurjectiveOnWith f (range f) C
hatg : Completion G
hatg_in : ↑(completion f) hatg = 0
ε : ℝ
ε_pos : 0 < ε
C' : ℝ
C'_pos : C' > 0
hC' : SurjectiveOnWith f (range f) C'
δ : ℝ
δ_pos : 0 < δ
hδ : (1 + C' * ‖f‖) * δ < ε
g : G
hg : ‖hatg - ↑G g‖ < δ
g' : G
hgg' : ↑f g' = ↑f g
hfg : ‖g'‖ ≤ C' * ‖↑f g‖
mem_ker : g - g' ∈ ker f
this : ‖↑f g‖ ≤ ‖f‖ * δ
⊢ δ + C' * (‖f‖ * δ) < ε