Theorem: AIG.RefStream.fold_decl_eq (LeanSAT/AIG/RefStreamOperator.lean)

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ ∀ (idx : Nat) (h1 : idx < aig.decls.size) (h2 : idx < (fold aig target).aig.decls.size),
    (fold aig target).aig.decls[idx] = aig.decls[idx]
Tactic:
intros
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (fold aig target).aig.decls[idx✝] = aig.decls[idx✝]

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (fold aig target).aig.decls[idx✝] = aig.decls[idx✝]
Tactic:
unfold fold
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (let res := aig.mkConstCached true;
          let aig_1 := res.aig;
          let acc := res.ref;
          let input := target.stream.cast ⋯;
          fold.go aig_1 acc 0 target.len input target.func).aig.decls[idx✝] =
    aig.decls[idx✝]

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (let res := aig.mkConstCached true;
          let aig_1 := res.aig;
          let acc := res.ref;
          let input := target.stream.cast ⋯;
          fold.go aig_1 acc 0 target.len input target.func).aig.decls[idx✝] =
    aig.decls[idx✝]
Tactic:
dsimp
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (fold.go (aig.mkConstCached true).aig (aig.mkConstCached true).ref 0 target.len (target.stream.cast ⋯)
            target.func).aig.decls[idx✝] =
    aig.decls[idx✝]

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (fold.go (aig.mkConstCached true).aig (aig.mkConstCached true).ref 0 target.len (target.stream.cast ⋯)
            target.func).aig.decls[idx✝] =
    aig.decls[idx✝]
Tactic:
rw [fold.go_decl_eq]
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (aig.mkConstCached true).aig.decls[idx✝] = aig.decls[idx✝]

case h1
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ idx✝ < (aig.mkConstCached true).aig.decls.size

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ (aig.mkConstCached true).aig.decls[idx✝] = aig.decls[idx✝]

case h1
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ idx✝ < (aig.mkConstCached true).aig.decls.size
Tactic:
rw [LawfulOperator.decl_eq (f := mkConstCached)]
State after:
case h2
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ idx✝ < (aig.mkConstCached true).aig.decls.size

State before:
case h2
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ idx✝ < (aig.mkConstCached true).aig.decls.size
Tactic:
apply LawfulOperator.lt_size_of_lt_aig_size (f := mkConstCached)
State after:
case h2.h
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ idx✝ < aig.decls.size

State before:
case h2.h
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
idx✝ : Nat
h1✝ : idx✝ < aig.decls.size
h2✝ : idx✝ < (fold aig target).aig.decls.size
⊢ idx✝ < aig.decls.size
Tactic:
assumption
State after:
no goals