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

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ aig.decls.size ≤ (fold aig target).aig.decls.size
Tactic:
unfold fold
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ 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.size

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ 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.size
Tactic:
dsimp
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ aig.decls.size ≤
    (fold.go (aig.mkConstCached true).aig (aig.mkConstCached true).ref 0 target.len (target.stream.cast ⋯)
            target.func).aig.decls.size

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ aig.decls.size ≤
    (fold.go (aig.mkConstCached true).aig (aig.mkConstCached true).ref 0 target.len (target.stream.cast ⋯)
            target.func).aig.decls.size
Tactic:
refine Nat.le_trans ?_ (by apply fold.go_le_size)
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ aig.decls.size ≤ (aig.mkConstCached true).aig.decls.size

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ aig.decls.size ≤ (aig.mkConstCached true).aig.decls.size
Tactic:
apply LawfulOperator.le_size (f := mkConstCached)
State after:
no goals

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig✝ aig : AIG α
target : FoldTarget aig
⊢ ?m.76646 ≤
    (fold.go (aig.mkConstCached true).aig (aig.mkConstCached true).ref 0 target.len (target.stream.cast ⋯)
            target.func).aig.decls.size
Tactic:
apply fold.go_le_size
State after:
no goals