Theorem: Module.Dual.range_eq_top_of_ne_zero
File: Mathlib/LinearAlgebra/Dual.lean

tactic: obtain ⟨v, hv⟩ : ∃ v, f v ≠ 0 := by contrapose! hf; ext v; simpa using hf v
state_before: K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : f ≠ 0
⊢ LinearMap.range f = ⊤
state_after: case intro
K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : f ≠ 0
v : V₁
hv : f v ≠ 0
⊢ LinearMap.range f = ⊤

tactic: rw [eq_top_iff]
state_before: case intro
K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : f ≠ 0
v : V₁
hv : f v ≠ 0
⊢ LinearMap.range f = ⊤
state_after: case intro
K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : f ≠ 0
v : V₁
hv : f v ≠ 0
⊢ ⊤ ≤ LinearMap.range f

tactic: exact fun x _ ↦ ⟨x • (f v)⁻¹ • v, by simp [inv_mul_cancel hv]⟩
state_before: case intro
K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : f ≠ 0
v : V₁
hv : f v ≠ 0
⊢ ⊤ ≤ LinearMap.range f
state_after: no goals

tactic: contrapose! hf
state_before: K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : f ≠ 0
⊢ ∃ v, f v ≠ 0
state_after: K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : ∀ (v : V₁), f v = 0
⊢ f = 0

tactic: ext v
state_before: K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : ∀ (v : V₁), f v = 0
⊢ f = 0
state_after: case h
K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : ∀ (v : V₁), f v = 0
v : V₁
⊢ f v = 0 v

tactic: simpa using hf v
state_before: case h
K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : ∀ (v : V₁), f v = 0
v : V₁
⊢ f v = 0 v
state_after: no goals

tactic: simp [inv_mul_cancel hv]
state_before: K : Type uK
inst✝⁵ : Field K
V₁ : Type uV₁
V₂ : Type uV₂
inst✝⁴ : AddCommGroup V₁
inst✝³ : Module K V₁
inst✝² : AddCommGroup V₂
inst✝¹ : Module K V₂
inst✝ : FiniteDimensional K V₁
f : Dual K V₁
hf : f ≠ 0
v : V₁
hv : f v ≠ 0
x : K
x✝ : x ∈ ⊤
⊢ f (x • (f v)⁻¹ • v) = x
state_after: no goals