Imports
Whole-tableau external-input assignments
The functions below patch concrete row bits into all consecutive row intervals and connect those assignments to the serially allocated wire bundles.
namespace CLRS.Chapter34.Turing.CookLevinnoncomputable section
Patch n consecutive rows, beginning at base, into an arbitrary total
external-input assignment.
def writeTableauBitsAt (tm : _root_.Turing.FinTM2) (H base : Nat) :
(n : Nat) → (Nat → Bool) → (Fin n → CfgBits tm H) → Nat → Bool
| 0, assignment, _ => assignment
| n + 1, assignment, bits =>
(tableauRowLayoutAt tm H base n).writeCfgBits
(writeTableauBitsAt tm H base n assignment
(fun row => bits row.castSucc))
(bits (Fin.last n))
Every coordinate of every patched row reads back exactly its supplied
bit, including the initial-only n = 1 case.
theorem writeTableauBitsAt_at (tm : _root_.Turing.FinTM2) (H base : Nat)
(n : Nat) (assignment : Nat → Bool) (bits : Fin n → CfgBits tm H)
(row : Fin n) (slot : CfgSlot tm H) :
writeTableauBitsAt tm H base n assignment bits
((tableauRowLayoutAt tm H base row.val).index slot).val =
bits row slot := by
induction n with
| zero => exact Fin.elim0 row
| succ n ih =>
unfold writeTableauBitsAt
by_cases hrow : row.val < n
· rw [CfgInputLayout.writeCfgBits_outside]
exact ih (fun i : Fin n => bits i.castSucc) ⟨row.val, hrow⟩
rcases tableauRowLayout_disjoint tm H base hrow with hbefore | hbefore
· exact Or.inl (lt_of_lt_of_le
((tableauRowLayoutAt tm H base row.val).index_lt slot) hbefore)
· exact Or.inr (le_trans hbefore (by
simp [CfgInputLayout.index]))
· have hlast : row = Fin.last n := Fin.ext (by
rw [Fin.val_last]
omega)
subst row
simpa only [Fin.val_last] using
CfgInputLayout.writeCfgBits_at
(tableauRowLayoutAt tm H base n)
(writeTableauBitsAt tm H base n assignment
(fun row => bits row.castSucc))
(bits (Fin.last n)) slotPatching a tableau preserves every external input outside the complete half-open tableau interval.
theorem writeTableauBitsAt_outside (tm : _root_.Turing.FinTM2)
(H base n : Nat) (assignment : Nat → Bool)
(bits : Fin n → CfgBits tm H) {inputIndex : Nat}
(houtside : inputIndex < base ∨
base + n * cfgBitCount tm H ≤ inputIndex) :
writeTableauBitsAt tm H base n assignment bits inputIndex =
assignment inputIndex := by
induction n with
| zero => rfl
| succ n ih =>
unfold writeTableauBitsAt
rw [CfgInputLayout.writeCfgBits_outside]
· apply ih (fun i => bits i.castSucc)
rcases houtside with hbefore | hafter
· exact Or.inl hbefore
· exact Or.inr (le_trans (by
exact Nat.add_le_add_left
(Nat.mul_le_mul_right _ (Nat.le_succ n)) base) hafter)
· rcases houtside with hbefore | hafter
· exact Or.inl (lt_of_lt_of_le hbefore (Nat.le_add_right _ _))
· exact Or.inr (by
rw [tableauRowLayoutAt_finish]
exact hafter)
Patch all rows of the canonical zero-offset T-transition tableau.
def writeTableauBits (tm : _root_.Turing.FinTM2) (H T : Nat)
(assignment : Nat → Bool)
(bits : Fin (tableauRowCount T) → CfgBits tm H) : Nat → Bool :=
writeTableauBitsAt tm H 0 (tableauRowCount T) assignment bitsUnder the all-row assignment, every allocated row evaluates exactly to the corresponding supplied row bits.
theorem TableauRowsAllocation.evalCfgBits_writeTableau
{tm : _root_.Turing.FinTM2} {H : Nat}
{start : CircuitBuilder} {base n : Nat}
(allocation : TableauRowsAllocation tm H start base n)
(assignment : Nat → Bool) (bits : Fin n → CfgBits tm H)
(row : Fin n) :
evalCfgBits allocation.builder
(writeTableauBitsAt tm H base n assignment bits)
(allocation.rows row) = bits row := by
funext slot
rw [evalCfgBits, allocation.eval_slot,
writeTableauBitsAt_at tm H base n assignment bits row slot]endend CLRS.Chapter34.Turing.CookLevin