Theorem: UInt.mul_assoc (Algdata/Classes/UInt.lean)

State before:
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ a * b * c = a * (b * c)
Tactic:
apply toNat_inj
State after:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat (a * b * c) = toNat (a * (b * c))

State before:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat (a * b * c) = toNat (a * (b * c))
Tactic:
simp [toNat_mul]
State after:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat a * toNat b % 2 ^ length α * toNat c % 2 ^ length α =
    toNat a * (toNat b * toNat c % 2 ^ length α) % 2 ^ length α

State before:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat a * toNat b % 2 ^ length α * toNat c % 2 ^ length α =
    toNat a * (toNat b * toNat c % 2 ^ length α) % 2 ^ length α
Tactic:
conv => lhs; rw [Nat.mod_mul_mod]
State after:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat a * toNat b * toNat c % 2 ^ length α = toNat a * (toNat b * toNat c % 2 ^ length α) % 2 ^ length α

State before:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat a * toNat b * toNat c % 2 ^ length α = toNat a * (toNat b * toNat c % 2 ^ length α) % 2 ^ length α
Tactic:
conv => rhs; rw [Nat.mul_comm, Nat.mod_mul_mod, Nat.mul_comm]
State after:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat a * toNat b * toNat c % 2 ^ length α = toNat a * (toNat b * toNat c) % 2 ^ length α

State before:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat a * toNat b * toNat c % 2 ^ length α = toNat a * (toNat b * toNat c) % 2 ^ length α
Tactic:
rw [Nat.mul_assoc]
State after:
no goals