internlm/Lean-Github huggingface dataset:
Theorem: BVExpr.bitblast.blastAdd_eq_eval_getLsb
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := (aig.mkConstCached false).aig, ref := { gate := (input.lhs.getRef idx✝ hidx✝).gate, hgate := ⋯ } },
      assign⟧ =
    lhs.getLsb idx✝
Tactic:
rw [LawfulOperator.denote_mem_prefix (f := mkConstCached)]
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := aig, ref := { gate := (input.lhs.getRef idx✝ hidx✝).gate, hgate := ?m.42315 } }, assign⟧ = lhs.getLsb idx✝

α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ (input.lhs.getRef idx✝ hidx✝).gate < aig.decls.size
Theorem: BVExpr.bitblast.blastAdd_eq_eval_getLsb
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := aig, ref := { gate := (input.lhs.getRef idx✝ hidx✝).gate, hgate := ?m.42315 } }, assign⟧ = lhs.getLsb idx✝

α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ (input.lhs.getRef idx✝ hidx✝).gate < aig.decls.size
Tactic:
rw [hleft]
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastAdd_eq_eval_getLsb
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
⊢ ∀ (idx : Nat) (hidx : idx < w),
    ⟦{ aig := (aig.mkConstCached false).aig, ref := (input.cast ⋯).rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
Tactic:
intros
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := (aig.mkConstCached false).aig, ref := (input.cast ⋯).rhs.getRef idx✝ hidx✝ }, assign⟧ = rhs.getLsb idx✝
Theorem: BVExpr.bitblast.blastAdd_eq_eval_getLsb
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := (aig.mkConstCached false).aig, ref := (input.cast ⋯).rhs.getRef idx✝ hidx✝ }, assign⟧ = rhs.getLsb idx✝
Tactic:
simp only [BinaryRefStream.rhs_getRef_cast, Ref_cast']
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := (aig.mkConstCached false).aig, ref := { gate := (input.rhs.getRef idx✝ hidx✝).gate, hgate := ⋯ } },
      assign⟧ =
    rhs.getLsb idx✝
Theorem: BVExpr.bitblast.blastAdd_eq_eval_getLsb
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := (aig.mkConstCached false).aig, ref := { gate := (input.rhs.getRef idx✝ hidx✝).gate, hgate := ⋯ } },
      assign⟧ =
    rhs.getLsb idx✝
Tactic:
rw [LawfulOperator.denote_mem_prefix (f := mkConstCached)]
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := aig, ref := { gate := (input.rhs.getRef idx✝ hidx✝).gate, hgate := ?m.43169 } }, assign⟧ = rhs.getLsb idx✝

α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ (input.rhs.getRef idx✝ hidx✝).gate < aig.decls.size
Theorem: BVExpr.bitblast.blastAdd_eq_eval_getLsb
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ ⟦{ aig := aig, ref := { gate := (input.rhs.getRef idx✝ hidx✝).gate, hgate := ?m.43169 } }, assign⟧ = rhs.getLsb idx✝

α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
idx✝ : Nat
hidx✝ : idx✝ < w
⊢ (input.rhs.getRef idx✝ hidx✝).gate < aig.decls.size
Tactic:
rw [hright]
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastAdd_eq_eval_getLsb
Proof state before:
case i_lt
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
lhs rhs : BitVec w
assign : α → Bool
input : aig.BinaryRefStream w
hleft : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧ = lhs.getLsb idx
hright : ∀ (idx : Nat) (hidx : idx < w), ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧ = rhs.getLsb idx
idx : Nat
hidx : idx < w
⊢ idx < w
Tactic:
assumption
Proof state after:
no goals
Theorem: bitvec_AndOrXor_2475
Proof state before:
⊢ ∀ (x C : BitVec 64), C - x ^^^ -1 = x + (-1 - C)
Tactic:
intros
Proof state after:
x✝ C✝ : BitVec 64
⊢ C✝ - x✝ ^^^ -1 = x✝ + (-1 - C✝)
Theorem: bitvec_AndOrXor_2475
Proof state before:
x✝ C✝ : BitVec 64
⊢ C✝ - x✝ ^^^ -1 = x✝ + (-1 - C✝)
Tactic:
bv_decide
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
⊢ idx < w
Tactic:
omega
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
⊢ ∀ (idx : Nat) (hidx : idx < curr), (go input distance curr hcurr s).getRef idx ⋯ = s.getRef idx hidx
Tactic:
intro idx hidx
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
⊢ (go input distance curr hcurr s).getRef idx ⋯ = s.getRef idx hidx
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
⊢ (go input distance curr hcurr s).getRef idx ⋯ = s.getRef idx hidx
Tactic:
unfold go
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
⊢ (if hcurr1 : curr < w then
          if hcurr2 : curr < distance % w then
            let ref := input.getRef (w - distance % w + curr) ⋯;
            let s := s.pushRef ref;
            go input distance (curr + 1) ⋯ s
          else
            let ref := input.getRef (curr - distance % w) ⋯;
            let s := s.pushRef ref;
            go input distance (curr + 1) ⋯ s
        else
          let_fun hcurr := ⋯;
          hcurr ▸ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
⊢ (if hcurr1 : curr < w then
          if hcurr2 : curr < distance % w then
            let ref := input.getRef (w - distance % w + curr) ⋯;
            let s := s.pushRef ref;
            go input distance (curr + 1) ⋯ s
          else
            let ref := input.getRef (curr - distance % w) ⋯;
            let s := s.pushRef ref;
            go input distance (curr + 1) ⋯ s
        else
          let_fun hcurr := ⋯;
          hcurr ▸ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Tactic:
split
Proof state after:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : curr < w
⊢ (if hcurr2 : curr < distance % w then
          let ref := input.getRef (w - distance % w + curr) ⋯;
          let s := s.pushRef ref;
          go input distance (curr + 1) ⋯ s
        else
          let ref := input.getRef (curr - distance % w) ⋯;
          let s := s.pushRef ref;
          go input distance (curr + 1) ⋯ s).getRef
      idx ⋯ =
    s.getRef idx hidx

case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : ¬curr < w
⊢ (let_fun hcurr := ⋯;
        hcurr ▸ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : curr < w
⊢ (if hcurr2 : curr < distance % w then
          let ref := input.getRef (w - distance % w + curr) ⋯;
          let s := s.pushRef ref;
          go input distance (curr + 1) ⋯ s
        else
          let ref := input.getRef (curr - distance % w) ⋯;
          let s := s.pushRef ref;
          go input distance (curr + 1) ⋯ s).getRef
      idx ⋯ =
    s.getRef idx hidx

case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : ¬curr < w
⊢ (let_fun hcurr := ⋯;
        hcurr ▸ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Tactic:
. dsimp
  split
  . rw [go_getRef_aux]
    rw [AIG.RefStream.getRef_push_ref_lt]
  . rw [go_getRef_aux]
    rw [AIG.RefStream.getRef_push_ref_lt]
Proof state after:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : ¬curr < w
⊢ (let_fun hcurr := ⋯;
        hcurr ▸ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : ¬curr < w
⊢ (let_fun hcurr := ⋯;
        hcurr ▸ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Tactic:
. dsimp
  simp only [RefStream.getRef, Ref.mk.injEq]
  congr
  . omega
  . simp
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : curr < w
⊢ (if hcurr2 : curr < distance % w then
          let ref := input.getRef (w - distance % w + curr) ⋯;
          let s := s.pushRef ref;
          go input distance (curr + 1) ⋯ s
        else
          let ref := input.getRef (curr - distance % w) ⋯;
          let s := s.pushRef ref;
          go input distance (curr + 1) ⋯ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Tactic:
dsimp
Proof state after:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : curr < w
⊢ (if hcurr2 : curr < distance % w then
          go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (w - distance % w + curr) ⋯))
        else go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (curr - distance % w) ⋯))).getRef
      idx ⋯ =
    s.getRef idx hidx
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : curr < w
⊢ (if hcurr2 : curr < distance % w then
          go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (w - distance % w + curr) ⋯))
        else go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (curr - distance % w) ⋯))).getRef
      idx ⋯ =
    s.getRef idx hidx
Tactic:
split
Proof state after:
case isTrue.isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (w - distance % w + curr) ⋯))).getRef idx ⋯ =
    s.getRef idx hidx

case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (curr - distance % w) ⋯))).getRef idx ⋯ = s.getRef idx hidx
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue.isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (w - distance % w + curr) ⋯))).getRef idx ⋯ =
    s.getRef idx hidx

case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (curr - distance % w) ⋯))).getRef idx ⋯ = s.getRef idx hidx
Tactic:
. rw [go_getRef_aux]
  rw [AIG.RefStream.getRef_push_ref_lt]
Proof state after:
case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (curr - distance % w) ⋯))).getRef idx ⋯ = s.getRef idx hidx
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (curr - distance % w) ⋯))).getRef idx ⋯ = s.getRef idx hidx
Tactic:
. rw [go_getRef_aux]
  rw [AIG.RefStream.getRef_push_ref_lt]
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue.isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (w - distance % w + curr) ⋯))).getRef idx ⋯ =
    s.getRef idx hidx
Tactic:
rw [go_getRef_aux]
Proof state after:
case isTrue.isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : curr < distance % w
⊢ (s.pushRef (input.getRef (w - distance % w + curr) ⋯)).getRef idx ?isTrue.isTrue.hidx = s.getRef idx hidx

case isTrue.isTrue.hidx
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : curr < distance % w
⊢ idx < curr + 1
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue.isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : curr < distance % w
⊢ (s.pushRef (input.getRef (w - distance % w + curr) ⋯)).getRef idx ?isTrue.isTrue.hidx = s.getRef idx hidx

case isTrue.isTrue.hidx
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : curr < distance % w
⊢ idx < curr + 1
Tactic:
rw [AIG.RefStream.getRef_push_ref_lt]
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ (go input distance (curr + 1) ⋯ (s.pushRef (input.getRef (curr - distance % w) ⋯))).getRef idx ⋯ = s.getRef idx hidx
Tactic:
rw [go_getRef_aux]
Proof state after:
case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ (s.pushRef (input.getRef (curr - distance % w) ⋯)).getRef idx ?isTrue.isFalse.hidx = s.getRef idx hidx

case isTrue.isFalse.hidx
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ idx < curr + 1
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ (s.pushRef (input.getRef (curr - distance % w) ⋯)).getRef idx ?isTrue.isFalse.hidx = s.getRef idx hidx

case isTrue.isFalse.hidx
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝¹ : curr < w
h✝ : ¬curr < distance % w
⊢ idx < curr + 1
Tactic:
rw [AIG.RefStream.getRef_push_ref_lt]
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastRotateLeft.go_getRef_aux
Proof state before:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : ¬curr < w
⊢ (let_fun hcurr := ⋯;
        hcurr ▸ s).getRef
      idx ⋯ =
    s.getRef idx hidx
Tactic:
dsimp
Proof state after:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
aig : AIG α
distance : Nat
input : aig.RefStream w
curr : Nat
hcurr : curr ≤ w
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
h✝ : ¬curr < w
⊢ (⋯ ▸ s).getRef idx ⋯ = s.getRef idx hidx