Theorem: BVExpr.bitblast.blastShiftRight_eq_eval_getLsb (LeanSAT/Reflect/BVExpr/BitBlast/Lemmas/ShiftRight.lean)

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
idx : Nat
hidx✝ : idx < w
hidx : target.distance + idx < w
⊢ target.distance + idx < w
Tactic:
omega
State after:
no goals

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
⊢ ∀ (idx : Nat) (hidx : idx < w),
    ⟦{ aig := (blastShiftRightConst aig target).aig, ref := (blastShiftRightConst aig target).stream.getRef idx hidx },
        assign⟧ =
      if hidx : target.distance + idx < w then
        ⟦{ aig := aig, ref := target.stream.getRef (target.distance + idx) ⋯ }, assign⟧
      else false
Tactic:
intros
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := (blastShiftRightConst aig target).aig, ref := (blastShiftRightConst aig target).stream.getRef idx✝ hidx✝ },
      assign⟧ =
    if hidx : target.distance + idx✝ < w then
      ⟦{ aig := aig, ref := target.stream.getRef (target.distance + idx✝) ⋯ }, assign⟧
    else false

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := (blastShiftRightConst aig target).aig, ref := (blastShiftRightConst aig target).stream.getRef idx✝ hidx✝ },
      assign⟧ =
    if hidx : target.distance + idx✝ < w then
      ⟦{ aig := aig, ref := target.stream.getRef (target.distance + idx✝) ⋯ }, assign⟧
    else false
Tactic:
unfold blastShiftRightConst
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{
        aig :=
          (match target with
            | { stream := input, distance := distance } =>
              blastShiftRightConst.go aig input distance 0 ⋯ RefStream.empty).aig,
        ref :=
          (match target with
                | { stream := input, distance := distance } =>
                  blastShiftRightConst.go aig input distance 0 ⋯ RefStream.empty).stream.getRef
            idx✝ hidx✝ },
      assign⟧ =
    if hidx : target.distance + idx✝ < w then
      ⟦{ aig := aig, ref := target.stream.getRef (target.distance + idx✝) ⋯ }, assign⟧
    else false

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{
        aig :=
          (match target with
            | { stream := input, distance := distance } =>
              blastShiftRightConst.go aig input distance 0 ⋯ RefStream.empty).aig,
        ref :=
          (match target with
                | { stream := input, distance := distance } =>
                  blastShiftRightConst.go aig input distance 0 ⋯ RefStream.empty).stream.getRef
            idx✝ hidx✝ },
      assign⟧ =
    if hidx : target.distance + idx✝ < w then
      ⟦{ aig := aig, ref := target.stream.getRef (target.distance + idx✝) ⋯ }, assign⟧
    else false
Tactic:
apply blastShiftRightConst.go_eq_eval_getLsb
State after:
case a
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ 0 ≤ idx✝

State before:
case a
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
target : aig.ShiftTarget w
assign : α → Bool
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ 0 ≤ idx✝
Tactic:
omega
State after:
no goals