Theorem: AIG.mkConstCached_decl_eq (LeanSAT/AIG/CachedLemmas.lean)

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
⊢ (aig.mkConstCached val).aig.decls[idx] = aig.decls[idx]
Tactic:
match hcache:aig.cache.find? (.const val) with
| some gate =>
  have := mkConstCached_hit_aig aig hcache
  simp [this]
| none =>
  have := mkConstCached_miss_aig aig hcache
  simp only [this, Array.get_push]
  split
  . rfl
  . contradiction
State after:
no goals

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
gate : CacheHit aig.decls (Decl.const val)
hcache : aig.cache.find? (Decl.const val) = some gate
⊢ (aig.mkConstCached val).aig.decls[idx] = aig.decls[idx]
Tactic:
have := mkConstCached_hit_aig aig hcache
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
gate : CacheHit aig.decls (Decl.const val)
hcache : aig.cache.find? (Decl.const val) = some gate
this : (aig.mkConstCached val).aig = aig
⊢ (aig.mkConstCached val).aig.decls[idx] = aig.decls[idx]

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
gate : CacheHit aig.decls (Decl.const val)
hcache : aig.cache.find? (Decl.const val) = some gate
this : (aig.mkConstCached val).aig = aig
⊢ (aig.mkConstCached val).aig.decls[idx] = aig.decls[idx]
Tactic:
simp [this]
State after:
no goals

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
⊢ (aig.mkConstCached val).aig.decls[idx] = aig.decls[idx]
Tactic:
have := mkConstCached_miss_aig aig hcache
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
⊢ (aig.mkConstCached val).aig.decls[idx] = aig.decls[idx]

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
⊢ (aig.mkConstCached val).aig.decls[idx] = aig.decls[idx]
Tactic:
simp only [this, Array.get_push]
State after:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
⊢ (if h : idx < aig.decls.size then aig.decls[idx] else Decl.const val) = aig.decls[idx]

State before:
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
⊢ (if h : idx < aig.decls.size then aig.decls[idx] else Decl.const val) = aig.decls[idx]
Tactic:
split
State after:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]

case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : ¬idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]

State before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]

case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : ¬idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]
Tactic:
. rfl
State after:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : ¬idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]

State before:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : ¬idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]
Tactic:
. contradiction
State after:
no goals

State before:
case isTrue
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]
Tactic:
rfl
State after:
no goals

State before:
case isFalse
α : Type
inst✝² : BEq α
inst✝¹ : Hashable α
inst✝ : DecidableEq α
aig : AIG α
val : Bool
idx : Nat
h : idx < aig.decls.size
hbound : idx < (aig.mkConstCached val).aig.decls.size
hcache : aig.cache.find? (Decl.const val) = none
this : (aig.mkConstCached val).aig.decls = aig.decls.push (Decl.const val)
h✝ : ¬idx < aig.decls.size
⊢ aig.decls[idx] = aig.decls[idx]
Tactic:
contradiction
State after:
no goals