Theorem: isUnit_iff_mem_nonZeroDivisors_of_finite
File: Mathlib/Algebra/GroupWithZero/NonZeroDivisors.lean

Proof steps:
state_before: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
⊢ IsUnit a ↔ a ∈ R⁰
state_after: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
⊢ IsUnit a
tactic: refine ⟨IsUnit.mem_nonZeroDivisors, fun ha ↦ ?_⟩
state_before: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
⊢ IsUnit a
state_after: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
⊢ Function.Injective fun x => x * a
tactic: rw [IsUnit.isUnit_iff_mulRight_bijective, ← Finite.injective_iff_bijective]
state_before: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
⊢ Function.Injective fun x => x * a
state_after: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
b c : R
hbc : (fun x => x * a) b = (fun x => x * a) c
⊢ b = c
tactic: intro b c hbc
state_before: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
b c : R
hbc : (fun x => x * a) b = (fun x => x * a) c
⊢ b = c
state_after: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
b c : R
hbc : (b - c) * a = 0
⊢ b = c
tactic: rw [← sub_eq_zero, ← sub_mul] at hbc
state_before: M₀ : Type u_1
inst✝⁷ : MonoidWithZero M₀
M : Type u_2
M' : Type u_3
M₁ : Type u_4
R : Type u_5
R' : Type u_6
F : Type u_7
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : FunLike F M M'
inst✝ : Finite R
a : R
ha : a ∈ R⁰
b c : R
hbc : (b - c) * a = 0
⊢ b = c
state_after: no goals
tactic: exact sub_eq_zero.mp (ha _ hbc)