Theorem: BVExpr.bitblast.blastZeroExtend_eq_eval_getLsb (LeanSAT/Reflect/BVExpr/BitBlast/Lemmas/ZeroExtend.lean)

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

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

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

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