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

State before:
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
⊢ toNat b + toNat c < length α → a <<< b <<< c = a <<< (b + c)
Tactic:
intro h
State after:
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
h : toNat b + toNat c < length α
⊢ a <<< b <<< c = a <<< (b + c)

State before:
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
h : toNat b + toNat c < length α
⊢ 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 : α
h : toNat b + toNat c < length α
⊢ toNat (a <<< b <<< c) = toNat (a <<< (b + c))

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

State before:
case a
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
h : toNat b + toNat c < length α
⊢ toNat a * 2 ^ (toNat b % length α) % 2 ^ length α * 2 ^ (toNat c % length α) % 2 ^ length α =
    toNat a * 2 ^ ((toNat b + toNat c) % 2 ^ length α % length α) % 2 ^ length α
Tactic:
rw [
  Nat.mod_eq_of_lt (trans (Nat.le_add_right (toNat b) (toNat c)) h),
  Nat.mod_eq_of_lt (trans (Nat.le_add_left (toNat c) (toNat b)) h),
  Nat.mod_eq_of_lt (trans h (Nat.exp_lt_pow _ (by decide))),
  Nat.mod_eq_of_lt h,
  Nat.mod_mul_mod,
  Nat.mul_assoc (toNat a),
  Nat.pow_add
]
State after:
no goals

State before:
α : Type
inst✝¹ : (n : Nat) → OfNat α n
inst✝ : UInt α
a b c : α
h : toNat b + toNat c < length α
⊢ 2 ≥ 2
Tactic:
decide
State after:
no goals