-- Mathlib/.lake/packages/lean4/src/lean/Std/Sat/AIG/CachedLemmas.lean
theorem mkAtomCached_le_size (aig : AIG α) (var : α) :
    aig.decls.size ≤ (aig.mkAtomCached var).aig.decls.size

Proof state:
α : Type
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
var : α
⊢ aig.decls.size ≤
    (match aig.cache.get? (Decl.atom var) with
          | some hit =>
            { aig := { decls := aig.decls, cache := aig.cache, invariant := ⋯ },
              ref := { gate := hit.idx, hgate := ⋯ } }
          | none =>
            {
              aig :=
                { decls := aig.decls.push (Decl.atom var), cache := Cache.insert aig.decls aig.cache (Decl.atom var),
                  invariant := ⋯ },
              ref := { gate := aig.decls.size, hgate := ⋯ } }).aig.decls.size

Tactic:
split

Result:
case h_1
α : Type
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
var : α
x✝ : Option (CacheHit aig.decls (Decl.atom var))
hit✝ : CacheHit aig.decls (Decl.atom var)
heq✝ : aig.cache.get? (Decl.atom var) = some hit✝
⊢ aig.decls.size ≤
    { aig := { decls := aig.decls, cache := aig.cache, invariant := ⋯ },
            ref := { gate := hit✝.idx, hgate := ⋯ } }.aig.decls.size

case h_2
α : Type
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
var : α
x✝ : Option (CacheHit aig.decls (Decl.atom var))
heq✝ : aig.cache.get? (Decl.atom var) = none
⊢ aig.decls.size ≤
    {
            aig :=
              { decls := aig.decls.push (Decl.atom var), cache := Cache.insert aig.decls aig.cache (Decl.atom var),
                invariant := ⋯ },
            ref := { gate := aig.decls.size, hgate := ⋯ } }.aig.decls.size

Proof state:
α : Type
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
var : α
⊢ aig.decls.size ≤ (aig.mkAtomCached var).aig.decls.size

Tactic:
dsimp only [mkAtomCached]

Result:
α : Type
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
var : α
⊢ aig.decls.size ≤
    (match aig.cache.get? (Decl.atom var) with
          | some hit =>
            { aig := { decls := aig.decls, cache := aig.cache, invariant := ⋯ },
              ref := { gate := hit.idx, hgate := ⋯ } }
          | none =>
            {
              aig :=
                { decls := aig.decls.push (Decl.atom var), cache := Cache.insert aig.decls aig.cache (Decl.atom var),
                  invariant := ⋯ },
              ref := { gate := aig.decls.size, hgate := ⋯ } }).aig.decls.size

Proof state:
case h_1
α : Type
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
var : α
x✝ : Option (CacheHit aig.decls (Decl.atom var))
hit✝ : CacheHit aig.decls (Decl.atom var)
heq✝ : aig.cache.get? (Decl.atom var) = some hit✝
⊢ aig.decls.size ≤
    { aig := { decls := aig.decls, cache := aig.cache, invariant := ⋯ },
            ref := { gate := hit✝.idx, hgate := ⋯ } }.aig.decls.size

Tactic:
simp

Result:
no goals

Proof state:
case h_2
α : Type
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
var : α
x✝ : Option (CacheHit aig.decls (Decl.atom var))
heq✝ : aig.cache.get? (Decl.atom var) = none
⊢ aig.decls.size ≤
    {
            aig :=
              { decls := aig.decls.push (Decl.atom var), cache := Cache.insert aig.decls aig.cache (Decl.atom var),
                invariant := ⋯ },
            ref := { gate := aig.decls.size, hgate := ⋯ } }.aig.decls.size

Tactic:
simp_arith

Result:
no goals