Theorem: Matrix.vecMul_injective_iff_isUnit
File: Mathlib/LinearAlgebra/Matrix/NonsingularInverse.lean

tactic: refine ⟨fun h ↦ ?_, fun h ↦ ?_⟩
state_before: l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
⊢ (Function.Injective fun v => v ᵥ* A) ↔ IsUnit A
state_after: case refine_1
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : Function.Injective fun v => v ᵥ* A
⊢ IsUnit A

case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
⊢ Function.Injective fun v => v ᵥ* A

tactic: change Function.Injective A.vecMulLinear
state_before: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
⊢ Function.Injective fun v => v ᵥ* A
state_after: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
⊢ Function.Injective ⇑A.vecMulLinear

tactic: rw [← LinearMap.ker_eq_bot, LinearMap.ker_eq_bot']
state_before: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
⊢ Function.Injective ⇑A.vecMulLinear
state_after: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
⊢ ∀ (m_1 : m → K), A.vecMulLinear m_1 = 0 → m_1 = 0

tactic: intro c hc
state_before: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
⊢ ∀ (m_1 : m → K), A.vecMulLinear m_1 = 0 → m_1 = 0
state_after: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
c : m → K
hc : A.vecMulLinear c = 0
⊢ c = 0

tactic: replace h := h.invertible
state_before: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : IsUnit A
c : m → K
hc : A.vecMulLinear c = 0
⊢ c = 0
state_after: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
c : m → K
hc : A.vecMulLinear c = 0
h : Invertible A
⊢ c = 0

tactic: simpa using congr_arg A⁻¹.vecMulLinear hc
state_before: case refine_2
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
c : m → K
hc : A.vecMulLinear c = 0
h : Invertible A
⊢ c = 0
state_after: no goals

tactic: rw [← vecMul_surjective_iff_isUnit]
state_before: case refine_1
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : Function.Injective fun v => v ᵥ* A
⊢ IsUnit A
state_after: case refine_1
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : Function.Injective fun v => v ᵥ* A
⊢ Function.Surjective fun v => v ᵥ* A

tactic: exact LinearMap.surjective_of_injective (f := A.vecMulLinear) h
state_before: case refine_1
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
K : Type u_3
inst✝² : CommRing R
inst✝¹ : Field K
inst✝ : Fintype m
A : Matrix m m K
h : Function.Injective fun v => v ᵥ* A
⊢ Function.Surjective fun v => v ᵥ* A
state_after: no goals