-- Mathlib/.lake/packages/lean4/src/lean/Std/Sat/AIG/CNF.lean
theorem Cache.IsExtensionBy_trans_left (cache1 : Cache aig cnf1) (cache2 : Cache aig cnf2)
    (cache3 : Cache aig cnf3) (h12 : IsExtensionBy cache1 cache2 new1 hnew1)
    (h23 : IsExtensionBy cache2 cache3 new2 hnew2) : IsExtensionBy cache1 cache3 new1 hnew1

Proof state:
case extension
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
⊢ ∀ (idx : Nat) (hidx : idx < aig.decls.size), cache1.marks[idx] = true → cache3.marks[idx] = true

Tactic:
intro idx hidx hmarked

Result:
case extension
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ cache3.marks[idx] = true

Proof state:
case extension.a.hidx
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ idx < aig.decls.size

Tactic:
omega

Result:
no goals

Proof state:
case extension.a.a
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ cache1.marks[idx] = true

Tactic:
exact hmarked

Result:
no goals

Proof state:
case extension.a
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ cache2.marks[idx] = true

Tactic:
apply h12.extension

Result:
case extension.a.a
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ cache1.marks[idx] = true

case extension.a.hidx
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ idx < aig.decls.size

Proof state:
case extension.hidx
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ idx < aig.decls.size

Tactic:
omega

Result:
no goals

Proof state:
case trueAt.hidx
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
⊢ new1 < aig.decls.size

Tactic:
omega

Result:
no goals

Proof state:
case trueAt.a
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
⊢ cache2.marks[new1] = true

Tactic:
exact h12.trueAt

Result:
no goals

Proof state:
case trueAt
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
⊢ cache3.marks[new1] = true

Tactic:
apply h23.extension

Result:
case trueAt.a
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
⊢ cache2.marks[new1] = true

case trueAt.hidx
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
⊢ new1 < aig.decls.size

Proof state:
case extension
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ cache3.marks[idx] = true

Tactic:
apply h23.extension

Result:
case extension.a
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ cache2.marks[idx] = true

case extension.hidx
aig : AIG Nat
cnf1 cnf2 cnf3 : CNF aig.CNFVar
new1 : Nat
hnew1 : new1 < aig.decls.size
new2 : Nat
hnew2 : new2 < aig.decls.size
cache1 : Cache aig cnf1
cache2 : Cache aig cnf2
cache3 : Cache aig cnf3
h12 : cache1.IsExtensionBy cache2 new1 hnew1
h23 : cache2.IsExtensionBy cache3 new2 hnew2
idx : Nat
hidx : idx < aig.decls.size
hmarked : cache1.marks[idx] = true
⊢ idx < aig.decls.size