Imports
Affine front views of compact statement-stack spans
The compact stack route retains a verifier-fixed inserted prefix followed by
one interval of the original widened stack. A subsequent peek or pop
only reads the first cell row and first two height coordinates. This module
materializes any such fixed front coordinate as one affine form and proves
the pointwise connection to TransitionRouteSpan.eval.
noncomputable sectionnamespace CLRS.Chapter34.Turing.CookLevinopen PolyBuilderSymbolic value at a fixed front position. If the inserted prefix has already supplied the position, use it; otherwise address the surviving original-source interval.
def TransitionRouteSpan.frontForm (span : TransitionRouteSpan α)
(sourceForm : Nat → α) (position : Nat) : α :=
if h : position < span.headValues.length then
span.headValues[position]
else
sourceForm (span.sourceDrop + (position - span.headValues.length))Evaluating a front form agrees with pointwise evaluation of the compact span whenever the requested position lies before the inserted suffix.
theorem TransitionRouteSpan.frontForm_value
(span : TransitionRouteSpan α) (sourceForm : Nat → α)
(value : α → β) (source : List β) (fallback : β) (position : Nat)
(hposition : position < span.headValues.length +
((span.map value).middle source).length)
(hsourceIndex :
span.sourceDrop + (position - span.headValues.length) < source.length)
(hsource :
value (sourceForm
(span.sourceDrop + (position - span.headValues.length))) =
source[span.sourceDrop + (position - span.headValues.length)]) :
value (span.frontForm sourceForm position) =
((span.map value).eval source).getD position fallback := by
unfold TransitionRouteSpan.frontForm
split_ifs with hhead
· have hhead' : position < (span.map value).headValues.length := by
simpa [TransitionRouteSpan.map] using hhead
rw [TransitionRouteSpan.eval, List.append_assoc]
rw [List.getD_append _ _ _ _ hhead']
rw [List.getD_eq_getElem _ _ hhead']
simp [TransitionRouteSpan.map]
· rw [TransitionRouteSpan.eval, List.append_assoc]
rw [List.getD_append_right _ _ _ _ (by
simpa [TransitionRouteSpan.map] using Nat.le_of_not_gt hhead)]
have hmiddle : position - span.headValues.length <
((span.map value).middle source).length := by omega
rw [show (span.map value).headValues.length =
span.headValues.length by simp [TransitionRouteSpan.map]]
rw [List.getD_append _ _ _ _ hmiddle]
rw [List.getD_eq_getElem _ _ hmiddle]
unfold TransitionRouteSpan.middle List.rdrop
rw [List.getElem_take, List.getElem_drop]
exact hsourceWidened-source front forms
Affine row of all symbol coordinates in one fixed public stack cell.
noncomputable def transitionWidenedStackCellFormRow
(tm : _root_.Turing.FinTM2) (k : tm.K) (cell : Nat) :
List AffineUnaryTripleForm :=
List.ofFn (transitionWidenedStackCellForm tm k cell)Affine form selected at one front height position of a compact route.
noncomputable def TransitionStackAffineRouteSpanBlock.heightFrontForm
(tm : _root_.Turing.FinTM2) (k : tm.K)
(route : TransitionStackAffineRouteSpanBlock) (position : Nat) :
AffineUnaryTripleForm :=
route.heightSpan.frontForm
(transitionWidenedStackHeightForm tm k) positionAffine symbol row selected at one front cell position of a compact route.
noncomputable def TransitionStackAffineRouteSpanBlock.cellFrontFormRow
(tm : _root_.Turing.FinTM2) (k : tm.K)
(route : TransitionStackAffineRouteSpanBlock) (position : Nat) :
List AffineUnaryTripleForm :=
route.cellSpan.frontForm
(transitionWidenedStackCellFormRow tm k) positionEvaluation of a routed height-front form is the corresponding wire in the compact route's list semantics.
theorem TransitionStackAffineRouteSpanBlock.heightFrontForm_value
(tm : _root_.Turing.FinTM2) (seed : TransitionRowSeed) (k : tm.K)
(route : TransitionStackAffineRouteSpanBlock) (position : Nat)
(hposition : position < route.heightSpan.headValues.length +
((route.heightSpan.map fun form =>
affineUnaryTripleFormValue form
(transitionTailAffineSeed seed)).middle
(TransitionStackValueBlock.ofWires
((arithmeticWidenedCfgWires tm seed.height seed.start
seed.rowBase).stack k)).heightValues).length)
(hpublic : route.heightSpan.sourceDrop +
(position - route.heightSpan.headValues.length) < seed.height + 1) :
affineUnaryTripleFormValue
(route.heightFrontForm tm k position)
(transitionTailAffineSeed seed) =
(route.eval seed
(TransitionStackValueBlock.ofWires
((arithmeticWidenedCfgWires tm seed.height seed.start
seed.rowBase).stack k))).heightValues.getD position 0 := by
apply route.heightSpan.frontForm_value
(transitionWidenedStackHeightForm tm k)
(fun form => affineUnaryTripleFormValue form
(transitionTailAffineSeed seed)) _ 0 position hposition
case hsourceIndex =>
have hindex : route.heightSpan.sourceDrop +
(position - route.heightSpan.headValues.length) <
workHeight tm seed.height + 1 := by
unfold workHeight
omega
simpa [TransitionStackValueBlock.ofWires,
transitionStackHeightWireValues] using hindex
case hsource =>
let index := route.heightSpan.sourceDrop +
(position - route.heightSpan.headValues.length)
have hindex : index < workHeight tm seed.height + 1 := by
unfold index workHeight
omega
rw [transitionWidenedStackHeightForm_value tm seed k
⟨index, hindex⟩ hpublic]
change
((arithmeticWidenedCfgWires tm seed.height seed.start
seed.rowBase).stack k).height ⟨index, hindex⟩ =
(List.ofFn ((arithmeticWidenedCfgWires tm seed.height seed.start
seed.rowBase).stack k).height)[index]'(by simpa using hindex)
rw [List.getElem_ofFn]Evaluation of a routed cell-front row is the exact one-hot wire row in the compact route's list semantics.
theorem TransitionStackAffineRouteSpanBlock.cellFrontFormRow_value
(tm : _root_.Turing.FinTM2) (seed : TransitionRowSeed) (k : tm.K)
(route : TransitionStackAffineRouteSpanBlock) (position : Nat)
(hposition : position < route.cellSpan.headValues.length +
((route.cellSpan.map fun forms =>
affineUnaryTripleMap forms
(transitionTailAffineSeed seed)).middle
(TransitionStackValueBlock.ofWires
((arithmeticWidenedCfgWires tm seed.height seed.start
seed.rowBase).stack k)).cellRows).length)
(hpublic : route.cellSpan.sourceDrop +
(position - route.cellSpan.headValues.length) < seed.height) :
affineUnaryTripleMap (route.cellFrontFormRow tm k position)
(transitionTailAffineSeed seed) =
(route.eval seed
(TransitionStackValueBlock.ofWires
((arithmeticWidenedCfgWires tm seed.height seed.start
seed.rowBase).stack k))).cellRows.getD position [] := by
apply route.cellSpan.frontForm_value
(transitionWidenedStackCellFormRow tm k)
(fun forms => affineUnaryTripleMap forms
(transitionTailAffineSeed seed)) _ [] position hposition
case hsourceIndex =>
have hindex : route.cellSpan.sourceDrop +
(position - route.cellSpan.headValues.length) <
workHeight tm seed.height := by
unfold workHeight
omega
simpa [TransitionStackValueBlock.ofWires,
transitionStackCellWireRows] using hindex
case hsource =>
let index := route.cellSpan.sourceDrop +
(position - route.cellSpan.headValues.length)
have hindex : index < workHeight tm seed.height := by
unfold index workHeight
omega
unfold transitionWidenedStackCellFormRow affineUnaryTripleMap
rw [List.map_ofFn]
change List.ofFn _ =
(List.ofFn fun cell : Fin (workHeight tm seed.height) =>
List.ofFn
(((arithmeticWidenedCfgWires tm seed.height seed.start
seed.rowBase).stack k).cell cell))[index]'(by simpa using hindex)
rw [List.getElem_ofFn]
apply List.ofFn_inj.mpr
funext code
simp only [Function.comp_apply]
rw [transitionWidenedStackCellForm_value tm seed k
index code hpublic]
rflend CLRS.Chapter34.Turing.CookLevin