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

tactic: cases nonempty_fintype n
state_before: l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
⊢ (Function.Surjective fun v => v ᵥ* A) ↔ ∃ B, B * A = 1
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
⊢ (Function.Surjective fun v => v ᵥ* A) ↔ ∃ B, B * A = 1

tactic: refine ⟨fun h ↦ ?_, fun ⟨B, hBA⟩ y ↦ ⟨y ᵥ* B, by simp [hBA]⟩⟩
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
⊢ (Function.Surjective fun v => v ᵥ* A) ↔ ∃ B, B * A = 1
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
⊢ ∃ B, B * A = 1

tactic: refine ⟨Matrix.of rows, Matrix.ext fun i j => ?_⟩
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
⊢ ∃ B, B * A = 1
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows * A) i j = 1 i j

tactic: rw [mul_apply_eq_vecMul, one_eq_pi_single, ← hrows]
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows * A) i j = 1 i j
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows i ᵥ* A) j = (fun v => v ᵥ* A) (rows i) j

tactic: rfl
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows i ᵥ* A) j = (fun v => v ᵥ* A) (rows i) j
state_after: no goals

tactic: simp [hBA]
state_before: l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
x✝ : ∃ B, B * A = 1
y : n → R
B : Matrix n m R
hBA : B * A = 1
⊢ (fun v => v ᵥ* A) (y ᵥ* B) = y
state_after: no goals