Theorem: Matrix.nondegenerate_iff_det_ne_zero
File: Mathlib/LinearAlgebra/Matrix/ToLinearEquiv.lean

tactic: refine' Iff.trans _ (not_iff_not.mpr exists_vecMul_eq_zero_iff)
state_before: R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M ↔ det M ≠ 0

tactic: simp only [not_exists]
state_before: R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M ↔ ¬∃ v x, vecMul v M = 0

tactic: constructor
state_before: R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M ↔ ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0

tactic: intro hM v hv hMv
state_before: case mp
R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ Nondegenerate M → ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0

tactic: obtain ⟨w, hwMv⟩ := hM.exists_not_ortho_of_ne_zero hv
state_before: case mp
R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : Nondegenerate M
v : n → A
hv : v ≠ 0
hMv : vecMul v M = 0
⊢ False

tactic: simp [dotProduct_mulVec, hMv, zero_dotProduct, ne_eq, not_true] at hwMv
state_before: case mp.intro
R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
hM : Nondegenerate M
v : n → A
hv : v ≠ 0
hMv : vecMul v M = 0
w : n → A
hwMv : v ⬝ᵥ mulVec M w ≠ 0
⊢ False

tactic: intro h v hv
state_before: case mpr
R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
⊢ (∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0) → Nondegenerate M

tactic: refine' not_imp_not.mp (h v) (funext fun i => _)
state_before: case mpr
R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ mulVec M w = 0
⊢ v = 0

tactic: simpa only [dotProduct_mulVec, dotProduct_single, mul_one] using hv (Pi.single i 1)
state_before: case mpr
R : Type ?u.534603
M✝ : Type ?u.534606
inst✝⁶ : CommRing R
inst✝⁵ : AddCommGroup M✝
inst✝⁴ : Module R M✝
n : Type u_2
inst✝³ : Fintype n
A : Type u_1
inst✝² : DecidableEq n
inst✝¹ : CommRing A
inst✝ : IsDomain A
M : Matrix n n A
h : ∀ (x : n → A), x ≠ 0 → ¬vecMul x M = 0
v : n → A
hv : ∀ (w : n → A), v ⬝ᵥ mulVec M w = 0
i : n
⊢ vecMul v M i = OfNat.ofNat 0 i