Theorem: UInt.shiftRight_shiftRight (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_shiftRight, 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 >>> (toNat b % length α + toNat c % length α) = toNat a >>> ((toNat b + toNat c) % 2 ^ length α % length α)

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