Dev B5: the not phase run lemma
Development split of SatTo3CNFMachine: not_phase, the full run lemma for the not clause emission.
namespace CLRSnamespace Chapter34open CLRS.Chapter34open Computability StateTransitionopen Turingnamespace Turingnamespace TM3CNF
The emitNot phase for Formula.not f: emit the two clauses
[¬c, ¬y₁] and [c, y₁] of notClauses c y₁ onto o (reversed), build the
result value variable c on val, restore the counter to c + 1, and reach
reduce. (c is the result variable's index, equal to the counter at entry;
y₁ is the child value variable's index, stored on top of val.)
lemma not_phase (inp T : List FormulaSym) (c : Nat) (y₁ : Nat) (V : List Bool) (F : List Frame)
(O U : List CNFSym) (hV : V.head? ≠ some true) :
(flip bind Sstep)^[4 * c + 3 * y₁ + 16]
(some (⟨some Label.emitNot, St.emitNot, stk inp T c (false :: List.replicate (y₁ + 1) true ++ V) F [] O U⟩ : (mach).Cfg))
= some (⟨some Label.reduce, St.done, stk inp T (c + 1)
(false :: List.replicate (c + 1) true ++ V) F []
((encCNF (notClauses c y₁)).reverse ++ O) U⟩ : (mach).Cfg) := by
have h1 := emitNot_step St.emitNot inp T c false (List.replicate (y₁ + 1) true ++ V) F [] O U
have h2 := moveCnt_phase Label.not₂ inp T c (List.replicate (y₁ + 1) true ++ V) F []
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O) U
rw [List.append_nil] at h2
have h3 := not₂_step (St.rsDone Label.not₂ Op.auxEmit) inp T 0 (List.replicate (y₁ + 1) true ++ V) F
(List.replicate c ()) (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)) U
have h4 := restoreCnt_phase Label.not₃ inp T 0 c (List.replicate (y₁ + 1) true ++ V) F
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)) U
rw [Nat.zero_add] at h4
have h5 := not₃_step (St.rsDone Label.not₃ Op.auxEmit) inp T c (List.replicate (y₁ + 1) true ++ V) F []
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)) U
have h6 := moveVal_varEmit_phase Label.not₄ (y₁ + 1) inp T c V F []
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))) U hV
rw [List.append_nil] at h6
have h7 := not₄_step (St.rsDone Label.not₄ Op.varEmit) inp T c V F
(List.replicate (y₁ + 1) ()) (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)))) U
have h8 := restoreVal_phase Label.not₅ (y₁ + 1) inp T c V F
(CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))) U
have h9 := not₅_step (St.rsDone Label.not₅ Op.varEmit) inp T c (List.replicate (y₁ + 1) true ++ V) F []
(CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))) U
have h10 := moveCnt_phase Label.not₆ inp T c (List.replicate (y₁ + 1) true ++ V) F []
(CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))) U
rw [List.append_nil] at h10
have h11 := not₆_step (St.rsDone Label.not₆ Op.auxEmit) inp T 0 (List.replicate (y₁ + 1) true ++ V) F
(List.replicate c ()) (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark ::
(List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)))))) U
have h12 := moveVal_varPop_phase Label.constMake (y₁ + 1) inp T 0 V F
(List.replicate c ()) (CNFSym.varMark :: CNFSym.posMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))))) U hV
have h13 := constMake_phase c (St.rsDone Label.constMake Op.varPop) inp T 0 V F
(List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark ::
(List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)))))))) U
calc
(flip bind Sstep)^[4 * c + 3 * y₁ + 16]
(some (⟨some Label.emitNot, St.emitNot, stk inp T c (false :: List.replicate (y₁ + 1) true ++ V) F [] O U⟩ : (mach).Cfg))
= (flip bind Sstep)^[4 * c + 3 * y₁ + 15]
(some (⟨some Label.moveCnt, St.mv Label.not₂ Op.auxEmit, stk inp T c (List.replicate (y₁ + 1) true ++ V) F []
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O) U⟩ : (mach).Cfg)) := by
rw [show 4 * c + 3 * y₁ + 16 = (4 * c + 3 * y₁ + 15) + 1 by omega]
rw [Function.iterate_add]
rw [Function.iterate_one]
exact congrArg (fun x => (flip bind Sstep)^[4 * c + 3 * y₁ + 15] x) h1
_ = (flip bind Sstep)^[3 * c + 3 * y₁ + 14]
(some (⟨some Label.not₂, St.rsDone Label.not₂ Op.auxEmit, stk inp T 0 (List.replicate (y₁ + 1) true ++ V) F
(List.replicate c ()) (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)) U⟩ : (mach).Cfg)) := by
rw [show 4 * c + 3 * y₁ + 15 = (3 * c + 3 * y₁ + 14) + (c + 1) by omega]
rw [Function.iterate_add]
exact congrArg (fun x => (flip bind Sstep)^[3 * c + 3 * y₁ + 14] x) h2
_ = (flip bind Sstep)^[3 * c + 3 * y₁ + 13]
(some (⟨some Label.restoreCnt, St.rs Label.not₃ Op.auxEmit, stk inp T 0 (List.replicate (y₁ + 1) true ++ V) F
(List.replicate c ()) (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)) U⟩ : (mach).Cfg)) := by
rw [show 3 * c + 3 * y₁ + 14 = (3 * c + 3 * y₁ + 13) + 1 by omega]
rw [Function.iterate_add]
rw [Function.iterate_one]
exact congrArg (fun x => (flip bind Sstep)^[3 * c + 3 * y₁ + 13] x) h3
_ = (flip bind Sstep)^[2 * c + 3 * y₁ + 12]
(some (⟨some Label.not₃, St.rsDone Label.not₃ Op.auxEmit, stk inp T c (List.replicate (y₁ + 1) true ++ V) F []
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)) U⟩ : (mach).Cfg)) := by
rw [show 3 * c + 3 * y₁ + 13 = (2 * c + 3 * y₁ + 12) + (c + 1) by omega]
rw [Function.iterate_add]
exact congrArg (fun x => (flip bind Sstep)^[2 * c + 3 * y₁ + 12] x) h4
_ = (flip bind Sstep)^[2 * c + 3 * y₁ + 11]
(some (⟨some Label.moveVal, St.mv Label.not₄ Op.varEmit, stk inp T c (List.replicate (y₁ + 1) true ++ V) F []
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))) U⟩ : (mach).Cfg)) := by
rw [show 2 * c + 3 * y₁ + 12 = (2 * c + 3 * y₁ + 11) + 1 by omega]
rw [Function.iterate_add]
rw [Function.iterate_one]
exact congrArg (fun x => (flip bind Sstep)^[2 * c + 3 * y₁ + 11] x) h5
_ = (flip bind Sstep)^[2 * c + 2 * y₁ + 9]
(some (⟨some Label.not₄, St.rsDone Label.not₄ Op.varEmit, stk inp T c V F
(List.replicate (y₁ + 1) ()) (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)))) U⟩ : (mach).Cfg)) := by
rw [show 2 * c + 3 * y₁ + 11 = (2 * c + 2 * y₁ + 9) + (y₁ + 2) by omega]
rw [Function.iterate_add]
exact congrArg (fun x => (flip bind Sstep)^[2 * c + 2 * y₁ + 9] x) h6
_ = (flip bind Sstep)^[2 * c + 2 * y₁ + 8]
(some (⟨some Label.restoreVal, St.rs Label.not₅ Op.varEmit, stk inp T c V F
(List.replicate (y₁ + 1) ()) (CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))) U⟩ : (mach).Cfg)) := by
rw [show 2 * c + 2 * y₁ + 9 = (2 * c + 2 * y₁ + 8) + 1 by omega]
rw [Function.iterate_add]
rw [Function.iterate_one]
exact congrArg (fun x => (flip bind Sstep)^[2 * c + 2 * y₁ + 8] x) h7
_ = (flip bind Sstep)^[2 * c + y₁ + 6]
(some (⟨some Label.not₅, St.rsDone Label.not₅ Op.varEmit, stk inp T c (List.replicate (y₁ + 1) true ++ V) F []
(CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))) U⟩ : (mach).Cfg)) := by
rw [show 2 * c + 2 * y₁ + 8 = (2 * c + y₁ + 6) + (y₁ + 2) by omega]
rw [Function.iterate_add]
exact congrArg (fun x => (flip bind Sstep)^[2 * c + y₁ + 6] x) h8
_ = (flip bind Sstep)^[2 * c + y₁ + 5]
(some (⟨some Label.moveCnt, St.mv Label.not₆ Op.auxEmit, stk inp T c (List.replicate (y₁ + 1) true ++ V) F []
(CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))) U⟩ : (mach).Cfg)) := by
rw [show 2 * c + y₁ + 6 = (2 * c + y₁ + 5) + 1 by omega]
rw [Function.iterate_add]
rw [Function.iterate_one]
exact congrArg (fun x => (flip bind Sstep)^[2 * c + y₁ + 5] x) h9
_ = (flip bind Sstep)^[c + y₁ + 4]
(some (⟨some Label.not₆, St.rsDone Label.not₆ Op.auxEmit, stk inp T 0 (List.replicate (y₁ + 1) true ++ V) F
(List.replicate c ()) (List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark ::
(List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)))))) U⟩ : (mach).Cfg)) := by
rw [show 2 * c + y₁ + 5 = (c + y₁ + 4) + (c + 1) by omega]
rw [Function.iterate_add]
exact congrArg (fun x => (flip bind Sstep)^[c + y₁ + 4] x) h10
_ = (flip bind Sstep)^[c + y₁ + 3]
(some (⟨some Label.moveVal, St.mv Label.constMake Op.varPop, stk inp T 0 (List.replicate (y₁ + 1) true ++ V) F
(List.replicate c ()) (CNFSym.varMark :: CNFSym.posMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark :: (List.replicate (y₁ + 1) CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark :: (List.replicate c CNFSym.endMark ++
(CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O))))))) U⟩ : (mach).Cfg)) := by
rw [show c + y₁ + 4 = (c + y₁ + 3) + 1 by omega]
rw [Function.iterate_add]
rw [Function.iterate_one]
exact congrArg (fun x => (flip bind Sstep)^[c + y₁ + 3] x) h11
_ = (flip bind Sstep)^[c + 1]
(some (⟨some Label.constMake, St.rsDone Label.constMake Op.varPop, stk inp T 0 V F
(List.replicate c ()) (List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark ::
(List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)))))))) U⟩ : (mach).Cfg)) := by
rw [show c + y₁ + 3 = (c + 1) + (y₁ + 2) by omega]
rw [Function.iterate_add]
exact congrArg (fun x => (flip bind Sstep)^[c + 1] x) h12
_ = some (⟨some Label.reduce, St.done, stk inp T (c + 1)
(false :: List.replicate (c + 1) true ++ V) F []
(List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.posMark :: CNFSym.clauseMark ::
(List.replicate (y₁ + 1) CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.endMark ::
(List.replicate c CNFSym.endMark ++ (CNFSym.varMark :: CNFSym.negMark :: CNFSym.clauseMark :: O)))))))) U⟩ : (mach).Cfg) := by
rw [show c + 1 = 0 + (c + 1) by omega]
rw [Function.iterate_add]
simpa using h13
_ = some (⟨some Label.reduce, St.done, stk inp T (c + 1)
(false :: List.replicate (c + 1) true ++ V) F []
((encCNF (notClauses c y₁)).reverse ++ O) U⟩ : (mach).Cfg) := by
apply congrArg some
apply Turing.TM2Comp.Cfg_ext
· rfl
· rfl
· funext kk
cases kk <;> try simp [stk]
rw [encCNF_notClauses_reverse, encClause_pos_reverse, encClause_neg_reverse]
simp [List.append_assoc, List.cons_append, List.replicate_succ]end TM3CNFend Turingend Chapter34end CLRS