internlm/Lean-Github huggingface dataset:
Theorem: AIG.RefStream.ite.denote_go
Proof state before:
case isTrue.inr
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
assign : α → Bool
w : Nat
aig : AIG α
curr : Nat
hcurr : curr ≤ w
discr : aig.Ref
lhs rhs : aig.RefStream w
s : aig.RefStream curr
idx : Nat
hidx1 : idx < w
hidx2 : curr ≤ idx
res : RefStreamEntry α w
h✝ : curr < w
hgo :
  go (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).aig (curr + 1) ⋯
      { gate := discr.gate, hgate := ⋯ } (lhs.cast ⋯) (rhs.cast ⋯)
      ((s.cast ⋯).pushRef
        (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).ref) =
    res
heq : curr < idx
⊢ ((rhs.cast ⋯).getRef idx hidx1).gate < aig.decls.size
Tactic:
simp [Ref.hgate]
Proof state after:
no goals
Theorem: AIG.RefStream.ite.denote_go
Proof state before:
case isTrue.inr
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
assign : α → Bool
w : Nat
aig : AIG α
curr : Nat
hcurr : curr ≤ w
discr : aig.Ref
lhs rhs : aig.RefStream w
s : aig.RefStream curr
idx : Nat
hidx1 : idx < w
hidx2 : curr ≤ idx
res : RefStreamEntry α w
h✝ : curr < w
hgo :
  go (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).aig (curr + 1) ⋯
      { gate := discr.gate, hgate := ⋯ } (lhs.cast ⋯) (rhs.cast ⋯)
      ((s.cast ⋯).pushRef
        (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).ref) =
    res
heq : curr < idx
⊢ discr.gate < aig.decls.size
Tactic:
simp [Ref.hgate]
Proof state after:
no goals
Theorem: AIG.RefStream.ite.denote_go
Proof state before:
case isTrue.inr
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
assign : α → Bool
w : Nat
aig : AIG α
curr : Nat
hcurr : curr ≤ w
discr : aig.Ref
lhs rhs : aig.RefStream w
s : aig.RefStream curr
idx : Nat
hidx1 : idx < w
hidx2 : curr ≤ idx
res : RefStreamEntry α w
h✝ : curr < w
hgo :
  go (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).aig (curr + 1) ⋯
      { gate := discr.gate, hgate := ⋯ } (lhs.cast ⋯) (rhs.cast ⋯)
      ((s.cast ⋯).pushRef
        (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).ref) =
    res
heq : curr < idx
⊢ ((lhs.cast ⋯).getRef idx hidx1).gate < aig.decls.size
Tactic:
simp [Ref.hgate]
Proof state after:
no goals
Theorem: AIG.RefStream.ite.denote_go
Proof state before:
case isTrue.inr.a
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
assign : α → Bool
w : Nat
aig : AIG α
curr : Nat
hcurr : curr ≤ w
discr : aig.Ref
lhs rhs : aig.RefStream w
s : aig.RefStream curr
idx : Nat
hidx1 : idx < w
hidx2 : curr ≤ idx
res : RefStreamEntry α w
h✝ : curr < w
hgo :
  go (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).aig (curr + 1) ⋯
      { gate := discr.gate, hgate := ⋯ } (lhs.cast ⋯) (rhs.cast ⋯)
      ((s.cast ⋯).pushRef
        (aig.mkIfCached { discr := discr, lhs := lhs.getRef curr h✝, rhs := rhs.getRef curr h✝ }).ref) =
    res
heq : curr < idx
⊢ curr + 1 ≤ idx
Tactic:
omega
Proof state after:
no goals
Theorem: AIG.RefStream.ite.denote_go
Proof state before:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
assign : α → Bool
w : Nat
aig : AIG α
curr : Nat
hcurr : curr ≤ w
discr : aig.Ref
lhs rhs : aig.RefStream w
s : aig.RefStream curr
idx : Nat
hidx1 : idx < w
hidx2 : curr ≤ idx
res : RefStreamEntry α w
h✝ : ¬curr < w
hgo :
  (let_fun this := ⋯;
    { aig := aig, stream := this ▸ s }) =
    res
⊢ ⟦{ aig := res.aig, ref := res.stream.getRef idx hidx1 }, assign⟧ =
    if ⟦{ aig := aig, ref := discr }, assign⟧ = true then ⟦{ aig := aig, ref := lhs.getRef idx hidx1 }, assign⟧
    else ⟦{ aig := aig, ref := rhs.getRef idx hidx1 }, assign⟧
Tactic:
omega
Proof state after:
no goals
Theorem: AIG.RefStream.denote_ite
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
⊢ ∀ (idx : Nat) (hidx : idx < w),
    ⟦{ aig := (ite aig input).aig, ref := (ite aig input).stream.getRef idx hidx }, assign⟧ =
      if ⟦{ aig := aig, ref := input.discr }, assign⟧ = true then
        ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧
      else ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧
Tactic:
intro idx hidx
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ ⟦{ aig := (ite aig input).aig, ref := (ite aig input).stream.getRef idx hidx }, assign⟧ =
    if ⟦{ aig := aig, ref := input.discr }, assign⟧ = true then
      ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧
    else ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧
Theorem: AIG.RefStream.denote_ite
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ ⟦{ aig := (ite aig input).aig, ref := (ite aig input).stream.getRef idx hidx }, assign⟧ =
    if ⟦{ aig := aig, ref := input.discr }, assign⟧ = true then
      ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧
    else ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧
Tactic:
unfold ite
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ ⟦{
        aig :=
          (match input with
            | { discr := discr, lhs := lhs, rhs := rhs } => ite.go aig 0 ⋯ discr lhs rhs empty).aig,
        ref :=
          (match input with
                | { discr := discr, lhs := lhs, rhs := rhs } => ite.go aig 0 ⋯ discr lhs rhs empty).stream.getRef
            idx hidx },
      assign⟧ =
    if ⟦{ aig := aig, ref := input.discr }, assign⟧ = true then
      ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧
    else ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧
Theorem: AIG.RefStream.denote_ite
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ ⟦{
        aig :=
          (match input with
            | { discr := discr, lhs := lhs, rhs := rhs } => ite.go aig 0 ⋯ discr lhs rhs empty).aig,
        ref :=
          (match input with
                | { discr := discr, lhs := lhs, rhs := rhs } => ite.go aig 0 ⋯ discr lhs rhs empty).stream.getRef
            idx hidx },
      assign⟧ =
    if ⟦{ aig := aig, ref := input.discr }, assign⟧ = true then
      ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧
    else ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧
Tactic:
dsimp
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ ⟦{ aig := (ite.go aig 0 ⋯ input.discr input.lhs input.rhs empty).aig,
        ref := (ite.go aig 0 ⋯ input.discr input.lhs input.rhs empty).stream.getRef idx hidx },
      assign⟧ =
    if ⟦{ aig := aig, ref := input.discr }, assign⟧ = true then
      ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧
    else ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧
Theorem: AIG.RefStream.denote_ite
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ ⟦{ aig := (ite.go aig 0 ⋯ input.discr input.lhs input.rhs empty).aig,
        ref := (ite.go aig 0 ⋯ input.discr input.lhs input.rhs empty).stream.getRef idx hidx },
      assign⟧ =
    if ⟦{ aig := aig, ref := input.discr }, assign⟧ = true then
      ⟦{ aig := aig, ref := input.lhs.getRef idx hidx }, assign⟧
    else ⟦{ aig := aig, ref := input.rhs.getRef idx hidx }, assign⟧
Tactic:
rw [ite.denote_go]
Proof state after:
case a
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ 0 ≤ idx
Theorem: AIG.RefStream.denote_ite
Proof state before:
case a
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
w : Nat
assign : α → Bool
aig : AIG α
input : IfInput aig w
idx : Nat
hidx : idx < w
⊢ 0 ≤ idx
Tactic:
omega
Proof state after:
no goals
Theorem: bitvec_InstCombineShift__476
Proof state before:
⊢ ∀ (Y X C C2 : BitVec 64), (X >>> C &&& C2 ||| Y) <<< C = X &&& C2 <<< C ||| Y <<< C
Tactic:
intros
Proof state after:
Y✝ X✝ C✝ C2✝ : BitVec 64
⊢ (X✝ >>> C✝ &&& C2✝ ||| Y✝) <<< C✝ = X✝ &&& C2✝ <<< C✝ ||| Y✝ <<< C✝
Theorem: bitvec_InstCombineShift__476
Proof state before:
Y✝ X✝ C✝ C2✝ : BitVec 64
⊢ (X✝ >>> C✝ &&& C2✝ ||| Y✝) <<< C✝ = X✝ &&& C2✝ <<< C✝ ||| Y✝ <<< C✝
Tactic:
bv_decide
Proof state after:
no goals
Theorem: bitvec_AddSub_1619
Proof state before:
⊢ ∀ (Y X : BitVec 64), X - Y - X = 0 - Y
Tactic:
intros
Proof state after:
Y✝ X✝ : BitVec 64
⊢ X✝ - Y✝ - X✝ = 0 - Y✝
Theorem: bitvec_AddSub_1619
Proof state before:
Y✝ X✝ : BitVec 64
⊢ X✝ - Y✝ - X✝ = 0 - Y✝
Tactic:
bv_decide
Proof state after:
no goals
Theorem: bitvec_InstCombineShift__239
Proof state before:
⊢ ∀ (X C : BitVec 64), X <<< C >>> C = X &&& (-1) >>> C
Tactic:
intros
Proof state after:
X✝ C✝ : BitVec 64
⊢ X✝ <<< C✝ >>> C✝ = X✝ &&& (-1) >>> C✝
Theorem: bitvec_InstCombineShift__239
Proof state before:
X✝ C✝ : BitVec 64
⊢ X✝ <<< C✝ >>> C✝ = X✝ &&& (-1) >>> C✝
Tactic:
bv_decide
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
hfoo : aig.decls.size ≤ (go aig w input newWidth curr hcurr s).aig.decls.size
⊢ idx < newWidth
Tactic:
omega
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
⊢ ∀ (idx : Nat) (hidx : idx < curr) (hfoo : aig.decls.size ≤ (go aig w input newWidth curr hcurr s).aig.decls.size),
    (go aig w input newWidth curr hcurr s).stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
intro idx hidx
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
⊢ ∀ (hfoo : aig.decls.size ≤ (go aig w input newWidth curr hcurr s).aig.decls.size),
    (go aig w input newWidth curr hcurr s).stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
⊢ ∀ (hfoo : aig.decls.size ≤ (go aig w input newWidth curr hcurr s).aig.decls.size),
    (go aig w input newWidth curr hcurr s).stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
generalize hgo : go aig w input newWidth curr hcurr s = res
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
hgo : go aig w input newWidth curr hcurr s = res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
hgo : go aig w input newWidth curr hcurr s = res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
unfold go at hgo
Proof state after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
hgo :
  (if hcurr1 : curr < newWidth then
      if hcurr2 : curr < w then
        let s := s.pushRef (input.getRef curr hcurr2);
        go aig w input newWidth (curr + 1) ⋯ s
      else
        let res := aig.mkConstCached false;
        let aig_1 := res.aig;
        let zeroRef := res.ref;
        let_fun hcast := ⋯;
        let input := input.cast hcast;
        let s := s.cast hcast;
        let s := s.pushRef zeroRef;
        go aig_1 w input newWidth (curr + 1) ⋯ s
    else
      let_fun hcurr := ⋯;
      { aig := aig, stream := hcurr ▸ s }) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
hgo :
  (if hcurr1 : curr < newWidth then
      if hcurr2 : curr < w then
        let s := s.pushRef (input.getRef curr hcurr2);
        go aig w input newWidth (curr + 1) ⋯ s
      else
        let res := aig.mkConstCached false;
        let aig_1 := res.aig;
        let zeroRef := res.ref;
        let_fun hcast := ⋯;
        let input := input.cast hcast;
        let s := s.cast hcast;
        let s := s.pushRef zeroRef;
        go aig_1 w input newWidth (curr + 1) ⋯ s
    else
      let_fun hcurr := ⋯;
      { aig := aig, stream := hcurr ▸ s }) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
split at hgo
Proof state after:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : curr < newWidth
hgo :
  (if hcurr2 : curr < w then
      let s := s.pushRef (input.getRef curr hcurr2);
      go aig w input newWidth (curr + 1) ⋯ s
    else
      let res := aig.mkConstCached false;
      let aig_1 := res.aig;
      let zeroRef := res.ref;
      let_fun hcast := ⋯;
      let input := input.cast hcast;
      let s := s.cast hcast;
      let s := s.pushRef zeroRef;
      go aig_1 w input newWidth (curr + 1) ⋯ s) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo

case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : ¬curr < newWidth
hgo :
  (let_fun hcurr := ⋯;
    { aig := aig, stream := hcurr ▸ s }) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : curr < newWidth
hgo :
  (if hcurr2 : curr < w then
      let s := s.pushRef (input.getRef curr hcurr2);
      go aig w input newWidth (curr + 1) ⋯ s
    else
      let res := aig.mkConstCached false;
      let aig_1 := res.aig;
      let zeroRef := res.ref;
      let_fun hcast := ⋯;
      let input := input.cast hcast;
      let s := s.cast hcast;
      let s := s.pushRef zeroRef;
      go aig_1 w input newWidth (curr + 1) ⋯ s) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo

case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : ¬curr < newWidth
hgo :
  (let_fun hcurr := ⋯;
    { aig := aig, stream := hcurr ▸ s }) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
. dsimp at hgo
  split at hgo
  . rw [← hgo]
    intros
    rw [go_getRef_aux]
    rw [AIG.RefStream.getRef_push_ref_lt]
  . rw [← hgo]
    intros
    rw [go_getRef_aux]
    rw [AIG.RefStream.getRef_push_ref_lt]
    . simp only [Ref.cast, Ref.mk.injEq]
      rw [AIG.RefStream.getRef_cast]
      . simp
      . assumption
    . apply go_le_size
Proof state after:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : ¬curr < newWidth
hgo :
  (let_fun hcurr := ⋯;
    { aig := aig, stream := hcurr ▸ s }) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : ¬curr < newWidth
hgo :
  (let_fun hcurr := ⋯;
    { aig := aig, stream := hcurr ▸ s }) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
. dsimp at hgo
  rw [← hgo]
  simp only [Nat.le_refl, RefStream.getRef, Ref_cast', Ref.mk.injEq, true_implies]
  congr
  . omega
  . simp
Proof state after:
no goals
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : curr < newWidth
hgo :
  (if hcurr2 : curr < w then
      let s := s.pushRef (input.getRef curr hcurr2);
      go aig w input newWidth (curr + 1) ⋯ s
    else
      let res := aig.mkConstCached false;
      let aig_1 := res.aig;
      let zeroRef := res.ref;
      let_fun hcast := ⋯;
      let input := input.cast hcast;
      let s := s.cast hcast;
      let s := s.pushRef zeroRef;
      go aig_1 w input newWidth (curr + 1) ⋯ s) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
dsimp at hgo
Proof state after:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : curr < newWidth
hgo :
  (if hcurr2 : curr < w then go aig w input newWidth (curr + 1) ⋯ (s.pushRef (input.getRef curr hcurr2))
    else
      go (aig.mkConstCached false).aig w (input.cast ⋯) newWidth (curr + 1) ⋯
        ((s.cast ⋯).pushRef (aig.mkConstCached false).ref)) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝ : curr < newWidth
hgo :
  (if hcurr2 : curr < w then go aig w input newWidth (curr + 1) ⋯ (s.pushRef (input.getRef curr hcurr2))
    else
      go (aig.mkConstCached false).aig w (input.cast ⋯) newWidth (curr + 1) ⋯
        ((s.cast ⋯).pushRef (aig.mkConstCached false).ref)) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
split at hgo
Proof state after:
case isTrue.isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝¹ : curr < newWidth
h✝ : curr < w
hgo : go aig w input newWidth (curr + 1) ⋯ (s.pushRef (input.getRef curr h✝)) = res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo

case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝¹ : curr < newWidth
h✝ : ¬curr < w
hgo :
  go (aig.mkConstCached false).aig w (input.cast ⋯) newWidth (curr + 1) ⋯
      ((s.cast ⋯).pushRef (aig.mkConstCached false).ref) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
case isTrue.isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝¹ : curr < newWidth
h✝ : curr < w
hgo : go aig w input newWidth (curr + 1) ⋯ (s.pushRef (input.getRef curr h✝)) = res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo

case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝¹ : curr < newWidth
h✝ : ¬curr < w
hgo :
  go (aig.mkConstCached false).aig w (input.cast ⋯) newWidth (curr + 1) ⋯
      ((s.cast ⋯).pushRef (aig.mkConstCached false).ref) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
. rw [← hgo]
  intros
  rw [go_getRef_aux]
  rw [AIG.RefStream.getRef_push_ref_lt]
Proof state after:
case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝¹ : curr < newWidth
h✝ : ¬curr < w
hgo :
  go (aig.mkConstCached false).aig w (input.cast ⋯) newWidth (curr + 1) ⋯
      ((s.cast ⋯).pushRef (aig.mkConstCached false).ref) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Theorem: BVExpr.bitblast.blastZeroExtend.go_getRef_aux
Proof state before:
case isTrue.isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
w : Nat
input : aig.RefStream w
newWidth curr : Nat
hcurr : curr ≤ newWidth
s : aig.RefStream curr
idx : Nat
hidx : idx < curr
res : RefStreamEntry α newWidth
h✝¹ : curr < newWidth
h✝ : ¬curr < w
hgo :
  go (aig.mkConstCached false).aig w (input.cast ⋯) newWidth (curr + 1) ⋯
      ((s.cast ⋯).pushRef (aig.mkConstCached false).ref) =
    res
⊢ ∀ (hfoo : aig.decls.size ≤ res.aig.decls.size), res.stream.getRef idx ⋯ = (s.getRef idx hidx).cast hfoo
Tactic:
. rw [← hgo]
  intros
  rw [go_getRef_aux]
  rw [AIG.RefStream.getRef_push_ref_lt]
  . simp only [Ref.cast, Ref.mk.injEq]
    rw [AIG.RefStream.getRef_cast]
    . simp
    . assumption
  . apply go_le_size
Proof state after:
no goals