Imports
Transition equality slot projection
This module embeds public tableau slots into the widened workspace and records the local arithmetic facts needed to align runtime equality progressions.
noncomputable sectionnamespace CLRS.Chapter34.Turing.CookLevinopen PolyBuilderEmbed one public slot into the corresponding widened-workspace slot.
def transitionEqWorkspaceSlot (tm : _root_.Turing.FinTM2) (height : Nat) :
CfgSlot tm height → CfgSlot tm (workHeight tm height)
| .inl _ => CfgSlot.halted tm (workHeight tm height)
| .inr (.inl label) => CfgSlot.label label
| .inr (.inr (.inl state)) => CfgSlot.state state
| .inr (.inr (.inr ⟨k, .inl stackHeight⟩)) =>
CfgSlot.stackHeight k
⟨stackHeight.val, by simp only [workHeight]; omega⟩
| .inr (.inr (.inr ⟨k, .inr (cell, symbol)⟩)) =>
CfgSlot.stackCell k
⟨cell.val, by simp only [workHeight]; omega⟩ symbolNarrowing a workspace wire bundle is evaluation at the embedded slot.
theorem narrowCfgWireProjection_eq_workspaceSlot
{tm : _root_.Turing.FinTM2} {height : Nat}
(source : CfgWires tm (workHeight tm height))
(slot : CfgSlot tm height) :
narrowCfgWireProjection source slot =
source (transitionEqWorkspaceSlot tm height slot) := by
rcases slot with (_ | label | state | ⟨k, stackHeight | cell⟩)
· rfl
· rfl
· rfl
· rfl
· rcases cell with ⟨cell, symbol⟩
rflSemantic triple attached to one explicit public slot.
def transitionEqSlotRow (tm : _root_.Turing.FinTM2)
(seed : TransitionRowSeed) (slot : CfgSlot tm seed.height) :
Nat × Nat × Nat :=
(transitionEqStart tm seed.height seed.start +
6 * (cfgSlotEquivFin tm seed.height slot).val,
narrowCfgWireProjection (transitionDispatchOutputWires tm seed) slot,
seed.rowBase + cfgBitCount tm seed.height +
(cfgSlotEquivFin tm seed.height slot).val)Closed positional semantics of the progression compiled from one segment.
theorem transitionEqSegmentProgressionRows_eq_ofFn
(tm : _root_.Turing.FinTM2) (seed : TransitionRowSeed)
(segment : TransitionEqSegment)
(hwork : 0 < workHeight tm seed.height) :
affineUnaryTripleProgressionRows
(transitionEqSegmentProgression tm seed segment) =
List.ofFn fun index : Fin (segment.count.eval seed.height) =>
(transitionEqStart tm seed.height seed.start +
6 * (segment.publicBase.eval seed.height + index.val),
seed.start + 2 +
transitionDispatchListFinalMuxOffset tm seed.height
(programLabels tm) + 3 +
3 * (segment.workspaceBase.eval seed.height + index.val),
seed.rowBase + cfgBitCount tm seed.height +
segment.publicBase.eval seed.height + index.val) := by
rw [affineUnaryTripleProgressionRows_eq_ofFn]
change (List.ofFn fun index : Fin (segment.count.eval seed.height) =>
((transitionEqSegmentProgression tm seed segment).base₁ + index.val * 6,
(transitionEqSegmentProgression tm seed segment).base₂ + index.val * 3,
(transitionEqSegmentProgression tm seed segment).base₃ + index.val * 1)) = _
apply List.ofFn_inj.mpr
funext index
rw [transitionEqSegmentProgression_base₁ tm seed segment hwork,
transitionEqSegmentProgression_base₂ tm seed segment hwork,
transitionEqSegmentProgression_base₃]
apply Prod.ext
· ring
· apply Prod.ext <;> ringdef transitionEqStackHeightSlots
(tm : _root_.Turing.FinTM2) (height : Nat) (k : tm.K) :
List (CfgSlot tm height) :=
List.ofFn fun index : Fin (height + 1) => CfgSlot.stackHeight k indexdef transitionEqStackCellSlots
(tm : _root_.Turing.FinTM2) (height : Nat) (k : tm.K) :
List (CfgSlot tm height) :=
(List.ofFn fun cell : Fin height =>
List.ofFn fun symbol : Fin ((reachableAlphabet tm k).card + 1) =>
CfgSlot.stackCell k cell symbol).flattentheorem transitionEqStackSlots_eq_parts
(tm : _root_.Turing.FinTM2) (height : Nat) (k : tm.K) :
transitionEqStackSlots tm height k =
transitionEqStackHeightSlots tm height k ++
transitionEqStackCellSlots tm height k := by
rfl
theorem transitionEqStackHeightSlots_publicValues
(tm : _root_.Turing.FinTM2) (height : Nat) (k : tm.K) :
(transitionEqStackHeightSlots tm height k).map
(fun slot => (cfgSlotEquivFin tm height slot).val) =
List.range'
(transitionEqPrefixWidth tm + cfgStackBitOffset tm height k)
(height + 1) := by
unfold transitionEqStackHeightSlots
rw [List.map_ofFn]
change (List.ofFn fun index : Fin (height + 1) =>
(cfgSlotEquivFin tm height (CfgSlot.stackHeight k index)).val) = _
simp only [cfgSlotEquivFin_stackHeight_val]
apply List.ext_getElem
· simp
· intro index hleft hright
simp only [List.getElem_ofFn, List.getElem_range']
unfold transitionEqPrefixWidth
ring
theorem transitionEqStackHeightSlots_workspaceValues
(tm : _root_.Turing.FinTM2) (height : Nat) (k : tm.K) :
(transitionEqStackHeightSlots tm height k).map
(fun slot => (cfgSlotEquivFin tm (workHeight tm height)
(transitionEqWorkspaceSlot tm height slot)).val) =
List.range'
(transitionEqPrefixWidth tm +
cfgStackBitOffset tm (workHeight tm height) k)
(height + 1) := by
unfold transitionEqStackHeightSlots
rw [List.map_ofFn]
change (List.ofFn fun index : Fin (height + 1) =>
(cfgSlotEquivFin tm (workHeight tm height)
(CfgSlot.stackHeight k
⟨index.val, by simp only [workHeight]; omega⟩)).val) = _
simp only [cfgSlotEquivFin_stackHeight_val]
apply List.ext_getElem
· simp
· intro index hleft hright
simp only [List.getElem_ofFn, List.getElem_range']
unfold transitionEqPrefixWidth
ringPublic cell slots occupy the cell portion of one public stack block.
theorem transitionEqStackCellSlots_publicValues
(tm : _root_.Turing.FinTM2) (height : Nat) (k : tm.K) :
(transitionEqStackCellSlots tm height k).map
(fun slot => (cfgSlotEquivFin tm height slot).val) =
List.range'
(transitionEqPrefixWidth tm + cfgStackBitOffset tm height k +
(height + 1))
(height * ((reachableAlphabet tm k).card + 1)) := by
unfold transitionEqStackCellSlots
rw [List.map_flatten, List.map_ofFn]
change (List.ofFn fun cell : Fin height =>
List.map (fun slot => (cfgSlotEquivFin tm height slot).val)
(List.ofFn fun symbol :
Fin ((reachableAlphabet tm k).card + 1) =>
CfgSlot.stackCell k cell symbol)).flatten = _
simp_rw [List.map_ofFn]
change (List.ofFn fun cell : Fin height =>
List.ofFn fun symbol : Fin ((reachableAlphabet tm k).card + 1) =>
(cfgSlotEquivFin tm height
(CfgSlot.stackCell k cell symbol)).val).flatten = _
simp only [cfgSlotEquivFin_stackCell_val]
rw [show (List.ofFn fun cell : Fin height =>
List.ofFn fun symbol : Fin ((reachableAlphabet tm k).card + 1) =>
1 + (labelCount tm + 1) + stateCount tm +
cfgStackBitOffset tm height k + (height + 1) +
(symbol.val +
((reachableAlphabet tm k).card + 1) * cell.val)).flatten =
List.ofFn fun coordinate :
Fin (height * ((reachableAlphabet tm k).card + 1)) =>
1 + (labelCount tm + 1) + stateCount tm +
cfgStackBitOffset tm height k + (height + 1) + coordinate.val by
rw [List.ofFn_mul]
apply congrArg List.flatten
apply List.ofFn_inj.mpr
funext cell
apply List.ofFn_inj.mpr
funext symbol
congr 1
ring]
apply List.ext_getElem
· simp
· intro index hleft hright
simp only [List.getElem_ofFn, List.getElem_range']
unfold transitionEqPrefixWidth
ringPublic cell slots project to the corresponding prefix of the widened workspace cell block.
theorem transitionEqStackCellSlots_workspaceValues
(tm : _root_.Turing.FinTM2) (height : Nat) (k : tm.K) :
(transitionEqStackCellSlots tm height k).map
(fun slot => (cfgSlotEquivFin tm (workHeight tm height)
(transitionEqWorkspaceSlot tm height slot)).val) =
List.range'
(transitionEqPrefixWidth tm +
cfgStackBitOffset tm (workHeight tm height) k +
(workHeight tm height + 1))
(height * ((reachableAlphabet tm k).card + 1)) := by
unfold transitionEqStackCellSlots
rw [List.map_flatten, List.map_ofFn]
change (List.ofFn fun cell : Fin height =>
List.map (fun slot =>
(cfgSlotEquivFin tm (workHeight tm height)
(transitionEqWorkspaceSlot tm height slot)).val)
(List.ofFn fun symbol :
Fin ((reachableAlphabet tm k).card + 1) =>
CfgSlot.stackCell k cell symbol)).flatten = _
simp_rw [List.map_ofFn]
change (List.ofFn fun cell : Fin height =>
List.ofFn fun symbol : Fin ((reachableAlphabet tm k).card + 1) =>
(cfgSlotEquivFin tm (workHeight tm height)
(CfgSlot.stackCell k
⟨cell.val, by simp only [workHeight]; omega⟩ symbol)).val).flatten = _
simp only [cfgSlotEquivFin_stackCell_val]
rw [show (List.ofFn fun cell : Fin height =>
List.ofFn fun symbol : Fin ((reachableAlphabet tm k).card + 1) =>
1 + (labelCount tm + 1) + stateCount tm +
cfgStackBitOffset tm (workHeight tm height) k +
(workHeight tm height + 1) +
(symbol.val +
((reachableAlphabet tm k).card + 1) * cell.val)).flatten =
List.ofFn fun coordinate :
Fin (height * ((reachableAlphabet tm k).card + 1)) =>
1 + (labelCount tm + 1) + stateCount tm +
cfgStackBitOffset tm (workHeight tm height) k +
(workHeight tm height + 1) + coordinate.val by
rw [List.ofFn_mul]
apply congrArg List.flatten
apply List.ofFn_inj.mpr
funext cell
apply List.ofFn_inj.mpr
funext symbol
congr 1
ring]
apply List.ext_getElem
· simp
· intro index hleft hright
simp only [List.getElem_ofFn, List.getElem_range']
unfold transitionEqPrefixWidth
ringend CLRS.Chapter34.Turing.CookLevin