Definitions bundle OAIQ069A010 of the split of OpenAI, Hardness of finding large independent sets in three-colorable graphs (result family 106)
DefinitionOAIQ069A010A definitions bundle of the split of OpenAI's proof of OAI.LargeIndependentSets.mainTheoremReal, carved from OpenAI's openai/math development (OpenAI, Hardness of finding large independent sets in three-colorable graphs (result family 106), OpenAI Math Release, September 24, 2026, result family 106, github.com/openai/math at commit 1581d4c, Apache License 2.0) and ported to Lean 4.33.1 and Mathlib 0df444a. The declarations and their proofs are OpenAI's.
Contents. It holds 101 declarations of OpenAI's Lean: 40 definitions and 61 theorems. The definitions and types are OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineOuterLoop.loopInTime, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineOuterLoop.steps, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineRowBody.budget, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineRowBody.steps, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineRuntime.beforeFinishBudget, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineRuntime.beforeFinishExecution, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineRuntime.computableInPolyTime, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineRuntime.execution, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineRuntime.finishExecution, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineVertex.budget, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineVertex.costSum, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineVertex.sequenceSteps, OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineVertex.steps, OAI.IndependentSetsGames.Foundations.Complexity.PoweringPlanBudget.rowBudget, OAI.IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget.preBudget, OAI.IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget.preTime, OAI.IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget.rowTime, OAI.IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget.time, OAI.IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget.totalBudget, OAI.IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget.vertexTime, OAI.IndependentSetsGames.Foundations.PCP.AlphabetTable.Body.rowStep, OAI.IndependentSetsGames.Foundations.PCP.AlphabetTable.Loop.runPrefix, OAI.IndependentSetsGames.Foundations.PCP.AlphabetTable.Loop.runRemaining, OAI.IndependentSetsGames.Foundations.PCP.AlphabetTable.Runtime.tableOutputsInTime, OAI.IndependentSetsGames.Foundations.PCP.AlphabetTable.Runtime.tablePolynomialTime, OAI.IndependentSetsGames.Foundations.PCP.PoweringFieldPlan.rowPlan, OAI.IndependentSetsGames.Foundations.PCP.PoweringRowData.emittedRelation, OAI.IndependentSetsGames.Foundations.PCP.PreprocessingFinishRuntime.computableInPolyTime, OAI.IndependentSetsGames.Foundations.PCP.PreprocessingFinishRuntime.finish, OAI.IndependentSetsGames.Foundations.PCP.PreprocessingRuntime.tablePolynomialTime, OAI.IndependentSetsGames.Foundations.PCP.RoundComputation.tablePolynomialTime, OAI.IndependentSetsGames.Foundations.PCP.RoundComputation.tablePolynomialTimeOfCertificates, OAI.LargeIndependentSets.BinaryNormalize.certificate, OAI.LargeIndependentSets.BinaryNormalize.gapCertificate, OAI.LargeIndependentSets.BinaryNormalize.serializer, OAI.LargeIndependentSets.CompleteReduction.certificate, OAI.LargeIndependentSets.CompleteReduction.gapView, OAI.LargeIndependentSets.CompleteReduction.lcComputer, OAI.LargeIndependentSets.PCPGapMachine.certificate, OAI.LargeIndependentSets.PCPGapMachine.round.
Sources. They come from these modules of lean/OAI/Combinatorics, in whole or in part: IndependentSets_Expansion_PoweringFieldPlan, IndependentSets_Expansion_PoweringPlanBudget, IndependentSets_Expansion_PoweringPolynomialBudget, IndependentSets_Expansion_PoweringRowData, IndependentSets_Expansion_RoundComputation, IndependentSets_Expansion_Row, IndependentSets_Machines_MachineFiniteSequence, IndependentSets_Machines_MachineLazyTableRuntime, IndependentSets_Machines_PCPGapMachine, IndependentSets_Machines_PoweringGlobalEnumeration, IndependentSets_Machines_PoweringMachineOuterLoop, IndependentSets_Machines_PoweringMachineRelationField, IndependentSets_Machines_PoweringMachineRowBody, IndependentSets_Machines_PoweringMachineRowHeaders, IndependentSets_Machines_PoweringMachineRuntime, IndependentSets_Machines_PoweringMachineVertex, IndependentSets_Machines_PoweringRuntimeBudget, IndependentSets_Machines_Runtime, IndependentSets_Main, IndependentSets_PCP_Body, IndependentSets_PCP_LoopInitialization.
Imports. It imports the published bundle Def_IndependentSets; the bundles OAIQ069A008 and OAIQ069A009 of this split.
Imported by (directly, in this split): the proof of OAI.LargeIndependentSets.mainTheoremReal.
import Mathlib
import Definitions.Def_IndependentSets
import Definitions.Def_OAIQ069A008
import Definitions.Def_OAIQ069A009
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Expansion_PoweringRowData
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.PCP.PoweringRowData
open IndependentSetsGames.Foundations.Complexity
open Turing
open PoweringMachineRow MachineFixedBlockMap
open PoweringWalks PoweringLabels PoweringAddresses PoweringReach
open PoweringOpinionTables PoweringEnumeration
variable {vertices d : Nat}
theorem fixedLabelAt_addressIndex (G : PortGraph (Fin vertices) (Fin d)) (n : Nat)
(center : Fin vertices) (u : Ball G (n + 1) center)
(a : Fin (PoweringTables.labelCount d n)) :
fixedLabelAt d n a (addressIndex G (n + 1) center u) =
decode (finitePortSelector G (n + 1) center) (decodeLabel d (n + 1) 64 a) u := by
simpa only [fixedLabelAt, labelTable_get] using
labelTable_addressIndex G (n + 1) center u (decodeLabel d (n + 1) 64 a)
theorem edgeAccept_walkBits (input : PortTables.Table vertices d) (n : Nat)
(w : Walk (Fin vertices) (Fin d) (n + 1)) (k : Fin (n + 1))
(a b : Fin (PoweringTables.labelCount d n)) :
edgeAccept (fixedLabelAt d n) (walkBits input n w) k a b =
PortTables.accepts input (edgeAt (PortTables.portGraph input) n w k)
(decode (finitePortSelector (PortTables.portGraph input) (n + 1) w.1)
(decodeLabel d (n + 1) 64 a) (tailFromStart (PortTables.portGraph input) n w k))
(decode (finitePortSelector (PortTables.portGraph input) (n + 1)
(endpoint (PortTables.portGraph input) w))
(decodeLabel d (n + 1) 64 b) (headFromEnd (PortTables.portGraph input) n w k)) := by
simp only [edgeAccept, firstMatch_walkBits_left, firstMatch_walkBits_right,
basePredicate_walkBits, fixedLabelAt_addressIndex]
theorem rowAccept_walkBits (input : PortTables.Table vertices d) (n : Nat)
(w : Walk (Fin vertices) (Fin d) (n + 1))
(a b : Fin (PoweringTables.labelCount d n)) :
rowAccept (fixedLabelAt d n) (walkBits input n w) a b =
rowsAccepts (PortTables.accepts input) (walkRows (PortTables.portGraph input) n w)
(labelTable (decodeLabel d (n + 1) 64 a))
(labelTable (decodeLabel d (n + 1) 64 b)) := by
rw [rowsAccepts_walkRows]
apply Bool.eq_iff_iff.mpr
simp only [rowAccept_eq_true, PoweringTest.pathAccepts_eq_true_iff, edgeAccept_walkBits]
theorem rowAccept_rowBits (input : PortTables.Table vertices d) (n : Nat)
(e : PoweringTest.Dart (Fin vertices) (Fin d) n)
(a b : Fin (PoweringTables.labelCount d n)) :
rowAccept (fixedLabelAt d n) (rowBits input n e) a b =
PoweringTables.rowAccepts input n e a b := by
rcases e with ⟨direction, w⟩
cases direction <;>
simp only [rowBits, Bool.false_eq_true, ite_false, ite_true,
rowAccept_transposeBits, rowAccept_walkBits, PoweringTables.rowAccepts]
def emittedRelation (input : PortTables.Table vertices d) (n : Nat)
(e : PoweringTest.Dart (Fin vertices) (Fin d) n) :
GenericGraphTables.RelationTable (PoweringTables.labelCount d n) :=
Vector.ofFn (rowBlock (fixedLabelAt d n) (rowBits input n e))
theorem rowBlock_unary (input : PortTables.Table vertices d) (n : Nat)
(e : PoweringTest.Dart (Fin vertices) (Fin d) n) :
encodeBits (List.ofFn (rowBlock (fixedLabelAt d n) (rowBits input n e))) =
encodeWords (GenericGraphTables.relationWords (emittedRelation input n e)) := by
have hbit : GraphTables.bitWord = GenericGraphTables.bitWord := by
funext b
cases b <;> rfl
have h := encodeBits_graphWords
(List.ofFn (rowBlock (fixedLabelAt d n) (rowBits input n e)))
rw [hbit] at h
simpa only [emittedRelation, GenericGraphTables.relationWords, Vector.toList_ofFn] using h
theorem emittedRelation_table (input : PortTables.Table vertices d) (n : Nat)
(i : Fin (PoweringTables.dartCount vertices d n)) :
emittedRelation input n (decodeDart vertices d n i) =
(PoweringTables.table input n).rows[i].relation := by
apply Vector.ext
intro j hj
have h := PoweringTables.table_accepts input n i
((GenericGraphTables.relationIndex (PoweringTables.labelCount d n)).symm ⟨j, hj⟩).1
((GenericGraphTables.relationIndex (PoweringTables.labelCount d n)).symm ⟨j, hj⟩).2
have hindex : GenericGraphTables.relationIndex (PoweringTables.labelCount d n)
(((GenericGraphTables.relationIndex (PoweringTables.labelCount d n)).symm ⟨j, hj⟩).1,
((GenericGraphTables.relationIndex (PoweringTables.labelCount d n)).symm ⟨j, hj⟩).2) =
⟨j, hj⟩ := by
change GenericGraphTables.relationIndex (PoweringTables.labelCount d n)
((GenericGraphTables.relationIndex (PoweringTables.labelCount d n)).symm ⟨j, hj⟩) = _
exact Equiv.apply_symm_apply _ _
simp only [GenericGraphTables.acceptsAt, GenericGraphTables.relationAt, hindex,
Fin.getElem_fin] at h
simp only [emittedRelation, Vector.getElem_ofFn]
change rowBlock (fixedLabelAt d n) (rowBits input n (decodeDart vertices d n i)) ⟨j, hj⟩ =
(PoweringTables.table input n).rows[i].relation[j]
change rowAccept (fixedLabelAt d n) (rowBits input n (decodeDart vertices d n i))
((GenericGraphTables.relationIndex (PoweringTables.labelCount d n)).symm ⟨j, hj⟩).1
((GenericGraphTables.relationIndex (PoweringTables.labelCount d n)).symm ⟨j, hj⟩).2 = _
rw [rowAccept_rowBits]
exact h.symm
end IndependentSetsGames.Foundations.PCP.PoweringRowData
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Expansion_PoweringFieldPlan
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace _root_.OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineField.labelDecidableEq _root_.OAI.IndependentSetsGames.Foundations.Complexity.PoweringMachineField.labelFintype
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.PCP.PoweringFieldPlan
open PoweringWalks PoweringLabels PoweringAddresses PoweringReach PoweringRowData
open IndependentSetsGames.Foundations.Complexity PoweringMachineRow
variable {V D : Type*}
theorem evaluate_fieldPlan {vertices d : Nat} (input : PortTables.Table vertices d)
(n : Nat) (start : Fin vertices) (ports : Fin (n + 1) → Fin d)
(k : Fin (n + 1)) (field : Field (slotCount d n)) :
evaluate input start (fieldPlan n ports k field) = walkData input n (start, ports) k field := by
rcases field with ⟨a,b⟩ | i | i
· simp only [evaluate, fieldPlan, walkData, walkEnd_tailPorts]
have hp : (edgeAt (PortTables.portGraph input) n (start, ports) k).2 = ports k :=
edgeAt_port (PortTables.portGraph input) n (start, ports) k
rw [← hp]
· simp only [evaluate, fieldPlan, walkData, endpointMask, walkEnd_tailPorts]
have ha := walkEnd_addressPorts (t := n + 1) (PortTables.portGraph input) start i
rw [ha]
· simp only [evaluate, fieldPlan, walkData, endpointMask, walkEnd_append,
walkEnd_headPorts]
rw [← wordEnd_eq_walkEnd_ofFn]
have ha := walkEnd_addressPorts (t := n + 1) (PortTables.portGraph input)
(wordEnd (PortTables.portGraph input) (n + 1) start ports) i
rw [ha]
rfl
theorem evaluate_directedFieldPlan {vertices d : Nat} (input : PortTables.Table vertices d)
(n : Nat) (start : Fin vertices) (ports : Fin (n + 1) → Fin d)
(direction : Bool) (k : Fin (n + 1)) (field : Field (slotCount d n)) :
evaluate input start (directedFieldPlan n ports direction k field) =
rowData input n (direction, start, ports) k field :=
evaluate_fieldPlan input n start ports k _
def rowPlan {d : Nat} (n : Nat) (ports : Fin (n + 1) → Fin d) (direction : Bool) :
List (Instruction d) :=
List.ofFn fun i : Fin (inputSize (n + 1) (slotCount d n)) =>
let pair := (inputEquiv (n + 1) (slotCount d n)).symm i
directedFieldPlan n ports direction pair.1 pair.2
theorem evaluate_rowPlan {vertices d : Nat} (input : PortTables.Table vertices d)
(n : Nat) (start : Fin vertices) (ports : Fin (n + 1) → Fin d) (direction : Bool) :
(rowPlan n ports direction).map (evaluate input start) =
List.ofFn (rowBits input n (direction, start, ports)) := by
rw [rowPlan, List.map_ofFn]
apply congrArg List.ofFn
funext i
dsimp only [Function.comp_apply]
rw [evaluate_directedFieldPlan, rowBits_packData]
rfl
theorem dataTape_eq_plan {vertices d : Nat} (input : PortTables.Table vertices d)
(n : Nat) (start : Fin vertices) (ports : Fin (n + 1) → Fin d) (direction : Bool) :
dataTape input n (direction, start, ports) =
encodeBits ((rowPlan n ports direction).map (evaluate input start)) := by
rw [evaluate_rowPlan, dataTape_eq]
end IndependentSetsGames.Foundations.PCP.PoweringFieldPlan
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringGlobalEnumeration
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachineRelation
open Turing
open MachineComposition
open PCP
variable {K Λ σ : Type} [DecidableEq K]
variable {n d : Nat}
theorem steps_le (table : PortTables.Table n d) (vertex : Fin n) (port : Fin d)
(position : Fin 4096) :
MachineAffineLookup.steps (PortTables.tableWords table) vertex.val
(4098 * d) (4098 * port.val + 4 + position.val) ≤
7 * (PortTables.tableBits table).length + 6 :=
MachineAffineLookup.steps_le_table (PortTables.tableWords table) vertex.val
(4098 * d) (4098 * port.val + 4 + position.val) (value table vertex port position)
(selected table vertex port position)
(Nat.le_trans (Nat.le_of_lt vertex.isLt) (PortTables.vertices_le_tableBits_length table))
end IndependentSetsGames.Foundations.Complexity.PoweringMachineRelation
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringMachineRelationField
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachineRelationField
open Turing
open MachineComposition
open PCP
variable {K Λ A : Type} [DecidableEq K]
variable {n d max : Nat}
theorem steps_le (path : List (Fin d)) (port : Fin d) (left right : PortTables.Label)
(table : PortTables.Table n d) (vertex : Fin n) :
steps path port left right table vertex ≤
(14 * path.length + 9) * (PortTables.tableBits table).length + 12 * path.length + 9 := by
have hw := PoweringMachineWord.steps_le table path.length vertex path.get
have hr := PoweringMachineRelation.steps_le table (endpoint table vertex path) port
(GraphTables.relationIndex (left, right))
simp only [steps, Nat.add_mul, Nat.mul_assoc] at hw ⊢
omega
end IndependentSetsGames.Foundations.Complexity.PoweringMachineRelationField
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_MachineFiniteSequence
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachinePlan
open Turing MachineComposition PCP PoweringFieldPlan
variable {K Λ A : Type} [DecidableEq K] {vertices d max : Nat}
theorem planTrace (graph : PortTables.Table vertices d)
(placement : PoweringMachineTapes.Tape max → K) (distinct : Function.Injective placement)
(vertex : Fin vertices) (commands : List (Command d max))
(labels : Label commands → Λ) (exit : Option Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ (MachineUnaryEqualityBit.State A))
(atLabels : ∀ l, program (labels l) = instruction placement commands labels exit l)
(base : K → List Bool) (suffix : List Bool)
(ready : PoweringMachineField.Ready graph placement vertex suffix base) (ambient : A) :
(advance (TM2.step program))^[steps graph placement vertex commands base]
(some ⟨entry commands labels exit, MachineUnaryEqualityBit.clean ambient, base⟩) =
some ⟨exit, MachineUnaryEqualityBit.clean ambient,
finalTapes graph placement vertex commands base⟩ := by
apply MachineFiniteSequence.trace LocalLabel (fun op => PoweringMachineField.entry op.val)
(fun op => PoweringMachineField.instruction placement op.val op.property)
(result graph placement vertex) (fun op _ => PoweringMachineField.steps graph vertex op.val)
program (PoweringMachineField.Ready graph placement vertex suffix)
(fun _ => MachineUnaryEqualityBit.clean ambient) id commands
· intro op _ tapes good
exact PoweringMachineField.ready_finalTapes graph placement distinct vertex op.val
op.property tapes suffix good
· intro op _ localLabels localExit atLocal tapes good
exact PoweringMachineField.fieldTrace graph placement distinct vertex op.val op.property
localLabels localExit program atLocal tapes suffix good ambient
· exact atLabels
· exact ready
theorem finalTapes_output (graph : PortTables.Table vertices d)
(placement : PoweringMachineTapes.Tape max → K) (distinct : Function.Injective placement)
(vertex : Fin vertices) (commands : List (Command d max)) (base : K → List Bool)
(suffix : List Bool) (ready : PoweringMachineField.Ready graph placement vertex suffix base) :
finalTapes graph placement vertex commands base (placement (.inl 10)) =
PoweringMachineRow.encodeBits ((commands.map (fun op => evaluate graph vertex op.val)).reverse) ++
base (placement (.inl 10)) := by
induction commands generalizing base with
| nil => rfl
| cons op commands ih =>
have nextReady := PoweringMachineField.ready_finalTapes graph placement distinct vertex
op.val op.property base suffix ready
change finalTapes graph placement vertex commands
(result graph placement vertex op base) (placement (.inl 10)) = _
dsimp only [result]
rw [ih _ nextReady, PoweringMachineField.finalTapes_output graph placement distinct vertex
op.val op.property base suffix ready]
simp only [List.map_cons, List.reverse_cons, PoweringMachineRow.encodeBits_append,
PoweringMachineRow.encodeBits, List.append_nil,
List.append_assoc]
theorem boundedRowPlan_values (n : Nat) (ports : Fin (n + 1) → Fin d) (direction : Bool) :
(boundedRowPlan n ports direction).map Subtype.val = rowPlan n ports direction := by
rw [boundedRowPlan, rowPlan, List.map_ofFn]
rfl
theorem rowPlan_output (graph : PortTables.Table vertices d)
(n : Nat) (ports : Fin (n + 1) → Fin d) (direction : Bool)
(placement : PoweringMachineTapes.Tape (2 * (n + 1)) → K)
(distinct : Function.Injective placement) (vertex : Fin vertices) (base : K → List Bool)
(suffix : List Bool) (ready : PoweringMachineField.Ready graph placement vertex suffix base) :
finalTapes graph placement vertex (boundedRowPlan n ports direction).reverse base
(placement (.inl 10)) =
PoweringRowData.dataTape graph n (direction, vertex, ports) ++ base (placement (.inl 10)) := by
rw [finalTapes_output graph placement distinct vertex _ base suffix ready]
rw [List.map_reverse, List.reverse_reverse, PoweringFieldPlan.dataTape_eq_plan]
have h := congrArg (List.map (evaluate graph vertex)) (boundedRowPlan_values n ports direction)
simpa only [List.map_map, Function.comp_def] using
congrArg (fun bits => PoweringMachineRow.encodeBits bits ++ base (placement (.inl 10))) h
end IndependentSetsGames.Foundations.Complexity.PoweringMachinePlan
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Expansion_PoweringPlanBudget
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringPlanBudget
open Turing MachineComposition PCP PoweringFieldPlan
variable {K Λ A : Type} [DecidableEq K] {vertices d max : Nat}
theorem field_steps_le (graph : PortTables.Table vertices d) (vertex : Fin vertices)
(op : Instruction d) (bounded : op.radius ≤ max) :
PoweringMachineField.steps graph vertex op ≤
fieldBudget max (PortTables.tableBits graph).length := by
cases op with
| relation path port left right =>
change path.length ≤ max at bounded
have h := PoweringMachineRelationField.steps_le path port left right graph vertex
have coefficient : 14 * path.length + 9 ≤ 28 * max + 10 := by omega
have product := Nat.mul_le_mul_right (PortTables.tableBits graph).length coefficient
change PoweringMachineRelationField.steps path port left right graph vertex ≤ _
unfold fieldBudget
omega
| equal left right =>
change Nat.max left.length right.length ≤ max at bounded
have hl : left.length ≤ max := (le_max_left _ _).trans bounded
have hr : right.length ≤ max := (le_max_right _ _).trans bounded
have h := PoweringMachineEqualityField.steps_le graph vertex left.get right.get
have coefficient : 14 * (left.length + right.length) + 10 ≤ 28 * max + 10 := by
omega
have product := Nat.mul_le_mul_right (PortTables.tableBits graph).length coefficient
change PoweringMachineEqualityField.steps graph vertex left.get right.get ≤ _
unfold fieldBudget
omega
theorem plan_steps_le (graph : PortTables.Table vertices d)
(placement : PoweringMachineTapes.Tape max → K) (vertex : Fin vertices)
(commands : List (PoweringMachinePlan.Command d max)) (base : K → List Bool) :
PoweringMachinePlan.steps graph placement vertex commands base ≤
commands.length * fieldBudget max (PortTables.tableBits graph).length := by
induction commands generalizing base with
| nil => simp only [PoweringMachinePlan.steps, MachineFiniteSequence.steps,
List.length_nil, Nat.zero_mul, Nat.le_refl]
| cons op commands ih =>
have first := field_steps_le graph vertex op.val op.property
have rest := ih (PoweringMachinePlan.result graph placement vertex op base)
change PoweringMachineField.steps graph vertex op.val +
PoweringMachinePlan.steps graph placement vertex commands
(PoweringMachinePlan.result graph placement vertex op base) ≤ _
simpa only [List.length_cons, Nat.add_mul, Nat.one_mul, Nat.add_comm] using
Nat.add_le_add first rest
def rowBudget (d n inputLength : Nat) : Nat :=
PoweringMachineRow.inputSize (n + 1) (PoweringRowData.slotCount d n) *
fieldBudget (2 * (n + 1)) inputLength
theorem rowPlan_steps_le (graph : PortTables.Table vertices d) (n : Nat)
(ports : Fin (n + 1) → Fin d) (direction : Bool)
(placement : PoweringMachineTapes.Tape (2 * (n + 1)) → K)
(vertex : Fin vertices) (base : K → List Bool) :
PoweringMachinePlan.steps graph placement vertex
(PoweringMachinePlan.boundedRowPlan n ports direction).reverse base ≤
PoweringMachineRow.inputSize (n + 1) (PoweringRowData.slotCount d n) *
((28 * (2 * (n + 1)) + 10) * (PortTables.tableBits graph).length +
24 * (2 * (n + 1)) + 15) := by
have h := plan_steps_le graph placement vertex
(PoweringMachinePlan.boundedRowPlan n ports direction).reverse base
simpa only [List.length_reverse, boundedRowPlan_length, fieldBudget] using h
end IndependentSetsGames.Foundations.Complexity.PoweringPlanBudget
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Expansion_Row
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMasterState
open Turing
open MachineFixedBlockMap
section Row
variable {K Λ : Type} [DecidableEq K] {N M : Nat}
theorem stepAux_encodedBlockAt (src dst : K) (F : Buffer N → Buffer M)
(exit : Option Λ) (hne : src ≠ dst) (bits : Buffer N) (suffix : List Bool)
(state : Master N) (tapes : K → List Bool)
(hinput : tapes src = PoweringMachineRow.encodeBits (List.ofFn bits) ++ suffix) :
TM2.stepAux (encodedBlockAt src dst F exit) state tapes =
{ l := exit, var := clearBuffer state,
stk := Function.update (Function.update tapes src suffix) dst
(PoweringMachineRow.encodeBits (List.ofFn (F bits)) ++ tapes dst) } := by
rw [encodedBlockAt, MachineStateEquiv.stepAux_transport_symm, Equiv.symm_symm]
rw [PoweringMachineRow.stepAux_encodedBlockAt src dst F exit hne bits suffix
(rowEquiv N state) tapes hinput]
rfl
theorem step_encodedBlockAt (src dst : K) (F : Buffer N → Buffer M) (exit : Option Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ (Master N))
(label : Λ) (atLabel : program label = encodedBlockAt src dst F exit)
(hne : src ≠ dst) (bits : Buffer N) (suffix : List Bool)
(state : Master N) (tapes : K → List Bool)
(hinput : tapes src = PoweringMachineRow.encodeBits (List.ofFn bits) ++ suffix) :
TM2.step program ⟨some label, state, tapes⟩ =
some ⟨exit, clearBuffer state,
Function.update (Function.update tapes src suffix) dst
(PoweringMachineRow.encodeBits (List.ofFn (F bits)) ++ tapes dst)⟩ := by
simp only [TM2.step, atLabel, stepAux_encodedBlockAt src dst F exit hne bits suffix state tapes hinput]
theorem step_rowAt_clean {t S q : Nat} (src dst : K)
(labelAt : Fin q → Fin S → PCP.GraphTables.Label) (exit : Option Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ
(Master (PoweringMachineRow.inputSize t S)))
(label : Λ) (atLabel : program label = rowAt (t := t) src dst labelAt exit)
(hne : src ≠ dst) (bits register : Buffer (PoweringMachineRow.inputSize t S))
(suffix : List Bool) (tapes : K → List Bool)
(hinput : tapes src = PoweringMachineRow.encodeBits (List.ofFn bits) ++ suffix) :
TM2.step program ⟨some label, withBuffer register, tapes⟩ =
some ⟨exit, clean (PoweringMachineRow.inputSize t S),
Function.update (Function.update tapes src suffix) dst
(PoweringMachineRow.encodeBits (List.ofFn (PoweringMachineRow.rowBlock labelAt bits)) ++
tapes dst)⟩ := by
simpa only [rowAt, clearBuffer_withBuffer] using
step_encodedBlockAt src dst (PoweringMachineRow.rowBlock labelAt) exit
program label atLabel hne bits suffix (withBuffer register) tapes hinput
end Row
end IndependentSetsGames.Foundations.Complexity.PoweringMasterState
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringMachineRowHeaders
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachineRowHeaders
open Turing MachineComposition
open PCP PoweringRowHeaderSemantics
open PoweringMachineTapes
variable {K Λ σ : Type} [DecidableEq K]
variable {vertices d max : Nat}
theorem steps_le (input : PortTables.Table vertices d) (n : Nat) (vertex : Fin vertices)
(ports : Fin (n + 1) → Fin d) (direction : Bool) :
steps input n vertex ports direction ≤
(14 * (n + 1) + 4) * (PortTables.tableBits input).length + 12 * (n + 1) + 6 := by
have hv : vertex.val ≤ (PortTables.tableBits input).length :=
Nat.le_trans (Nat.le_of_lt vertex.isLt) (PortTables.vertices_le_tableBits_length input)
have hw := PoweringMachineWord.steps_le input (n + 1) vertex ports
cases direction <;> simp only [steps, Bool.false_eq_true, ite_false, ite_true]
· simp only [Nat.add_mul]
omega
· calc
_ ≤ (2 * (PortTables.tableBits input).length + 3) +
((14 * (n + 1) + 2) * (PortTables.tableBits input).length + 12 * (n + 1) + 3) :=
Nat.add_le_add (by omega) hw
_ = _ := by simp only [Nat.add_mul]; omega
end IndependentSetsGames.Foundations.Complexity.PoweringMachineRowHeaders
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringMachineRowBody
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachineRowBody
open Turing MachineComposition PCP
open MachineFixedBlockMap
variable {K Λ : Type} {vertices d : Nat}
theorem plan_entry_eq {max : Nat} {E : Type}
(ops : List (PoweringMachinePlan.Command d max)) (fallback : E)
(labels : PoweringMachinePlan.Label ops ⊕ E → Λ) :
PoweringMachinePlan.entry ops (fun l => labels (.inl l))
(some (labels (.inr fallback))) = some (labels (planMain ops fallback)) := by
cases ops <;> rfl
variable [DecidableEq K]
theorem planSteps_eq {max : Nat} (graph : PortTables.Table vertices d)
(placement : PoweringMachineTapes.Tape max → K) (vertex : Fin vertices)
(ops : List (PoweringMachinePlan.Command d max)) (base : K → List Bool) :
PoweringMachinePlan.steps graph placement vertex ops base = planSteps graph vertex ops := by
induction ops generalizing base with
| nil => rfl
| cons op ops ih =>
change PoweringMachineField.steps graph vertex op.val +
PoweringMachinePlan.steps graph placement vertex ops
(PoweringMachinePlan.result graph placement vertex op base) = _
rw [ih]
rfl
def steps (graph : PortTables.Table vertices d) (vertex : Fin vertices)
(n : Nat) (ports : Fin (n + 1) → Fin d) (direction : Bool) : Nat :=
planSteps graph vertex (commands n ports direction) + 1 +
PoweringMachineRowHeaders.steps graph n vertex ports direction
theorem rowBlock_eq_rowRelation (graph : PortTables.Table vertices d) (n : Nat)
(vertex : Fin vertices) (ports : Fin (n + 1) → Fin d) (direction : Bool) :
PoweringMachineRow.encodeBits (List.ofFn (PoweringMachineRow.rowBlock
(PoweringRowData.fixedLabelAt d n) (PoweringRowData.rowBits graph n (direction, vertex, ports)))) =
rowRelation graph n vertex ports direction := by
calc
_ = encodeWords (GenericGraphTables.relationWords
(PoweringRowData.emittedRelation graph n (direction, vertex, ports))) :=
PoweringRowData.rowBlock_unary graph n (direction, vertex, ports)
_ = _ := by
have h := PoweringRowData.emittedRelation_table graph n
(PoweringEnumeration.encodeDart vertices d n (direction, vertex, ports))
rw [PoweringEnumeration.decodeDart_encodeDart] at h
exact congrArg (fun relation : GenericGraphTables.RelationTable (PoweringTables.labelCount d n) =>
encodeWords (GenericGraphTables.relationWords relation)) h
theorem rowTrace (graph : PortTables.Table vertices d) (n : Nat)
(placement : PoweringMachineTapes.Tape (capacity n) → K) (distinct : Function.Injective placement)
(output : K) (outside : ∀ i, output ≠ placement i) (vertex : Fin vertices)
(ports : Fin (n + 1) → Fin d) (direction : Bool)
(labels : Label n ports direction → Λ) (exit : Option Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ (State d n))
(atLabels : ∀ l, program (labels l) = instruction n placement output ports direction labels exit l)
(base : K → List Bool) (suffix : List Bool) (ready : Ready graph n placement vertex suffix base) :
(advance (TM2.step program))^[steps graph vertex n ports direction]
(some ⟨some (labels (entry n ports direction)), PoweringMasterState.clean (bufferSize d n), base⟩) =
some ⟨exit, PoweringMasterState.clean (bufferSize d n),
finalTapes graph n placement output vertex ports direction base⟩ := by
have hp := PoweringMachinePlan.planTrace graph placement distinct vertex (commands n ports direction)
(fun q => labels (.inl q)) (some (labels (.inr (.inl ())))) program
(fun q => atLabels (.inl q)) base suffix ready.1 (emptyBuffer (bufferSize d n))
rw [planSteps_eq, plan_entry_eq] at hp
let mid := afterPlan graph n placement vertex ports direction base
have hinput : mid (placement (.inl 10)) = PoweringMachineRow.encodeBits
(List.ofFn (PoweringRowData.rowBits graph n (direction, vertex, ports))) ++ [] := by
dsimp only [mid, afterPlan, commands]
have h := PoweringMachinePlan.rowPlan_output graph n ports direction placement distinct vertex base suffix ready.1
simpa only [ready.2, List.append_nil, PoweringRowData.dataTape_eq] using h
have hr := PoweringMasterState.step_rowAt_clean (t := n + 1) (placement (.inl 10)) output
(PoweringRowData.fixedLabelAt d n)
(some (labels (.inr (.inr (PoweringMachineRowHeaders.entry n))))) program (labels (.inr (.inl ())))
(atLabels (.inr (.inl ()))) (Ne.symm (outside _))
(PoweringRowData.rowBits graph n (direction, vertex, ports))
(emptyBuffer (bufferSize d n)) [] mid hinput
rw [rowBlock_eq_rowRelation] at hr
have hm := afterEmit_ready graph n placement distinct output outside vertex ports direction base suffix ready
have hh := (PoweringMachineRowHeaders.headerTrace graph n (by unfold capacity; omega)
(headerPlacement placement output) (headerPlacement_injective placement distinct output outside)
vertex ports direction (fun q => labels (.inr (.inr q))) exit program
(fun q => atLabels (.inr (.inr q)))
(afterEmit graph n placement output vertex ports direction base)
(by simpa [headerPlacement, PoweringMachineTapes.table] using hm.1.table)
(by simpa [headerPlacement, PoweringMachineTapes.scratch] using hm.1.scratch) suffix
(by simpa [headerPlacement, PoweringMachineTapes.start] using hm.1.source)
(emptyBuffer (bufferSize d n), false, none) none).1
rw [steps, Nat.add_comm, Function.iterate_add_apply, Function.iterate_succ_apply']
change (advance (TM2.step program))^[PoweringMachineRowHeaders.steps graph n vertex ports direction]
(advance (TM2.step program) ((advance (TM2.step program))^[planSteps graph vertex (commands n ports direction)]
(some ⟨some (labels (planMain (commands n ports direction) (.inl ()))),
MachineUnaryEqualityBit.clean (emptyBuffer (bufferSize d n)), base⟩))) = _
rw [hp]
simp only [advance_some]
change (advance (TM2.step program))^[PoweringMachineRowHeaders.steps graph n vertex ports direction]
(TM2.step program ⟨some (labels (.inr (.inl ()))),
PoweringMasterState.withBuffer (emptyBuffer (bufferSize d n)), mid⟩) = _
rw [hr]
exact hh
def budget (d n inputLength : Nat) : Nat :=
PoweringPlanBudget.rowBudget d n inputLength + 1 +
((14 * (n + 1) + 4) * inputLength + 12 * (n + 1) + 6)
theorem steps_le (graph : PortTables.Table vertices d) (vertex : Fin vertices)
(n : Nat) (ports : Fin (n + 1) → Fin d) (direction : Bool) :
steps graph vertex n ports direction ≤ budget d n (PortTables.tableBits graph).length := by
have hp := PoweringPlanBudget.rowPlan_steps_le graph n ports direction id vertex (fun _ => [])
rw [planSteps_eq] at hp
have hh := PoweringMachineRowHeaders.steps_le graph n vertex ports direction
change planSteps graph vertex (commands n ports direction) ≤
PoweringPlanBudget.rowBudget d n (PortTables.tableBits graph).length at hp
unfold steps budget
omega
end IndependentSetsGames.Foundations.Complexity.PoweringMachineRowBody
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringMachineVertex
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachineVertex
open Turing MachineComposition PCP
variable {K Λ : Type} [DecidableEq K] {vertices d n : Nat}
def sequenceSteps (graph : PortTables.Table vertices d) (n : Nat)
(placement : PoweringMachineTapes.Tape (PoweringMachineRowBody.capacity n) → K)
(output : K) (vertex : Fin vertices) (ops : List (Command d n)) (base : K → List Bool) : Nat :=
MachineFiniteSequence.steps (result graph n placement output vertex)
(fun j _ => PoweringMachineRowBody.steps graph vertex n (ports j) (direction j)) ops base
def costSum (graph : PortTables.Table vertices d) (vertex : Fin vertices) (n : Nat) :
List (Command d n) → Nat
| [] => 0
| j :: ops => PoweringMachineRowBody.steps graph vertex n (ports j) (direction j) +
costSum graph vertex n ops
theorem sequenceSteps_eq (graph : PortTables.Table vertices d) (n : Nat)
(placement : PoweringMachineTapes.Tape (PoweringMachineRowBody.capacity n) → K)
(output : K) (vertex : Fin vertices) (ops : List (Command d n)) (base : K → List Bool) :
sequenceSteps graph n placement output vertex ops base = costSum graph vertex n ops := by
induction ops generalizing base with
| nil => rfl
| cons j ops ih =>
change PoweringMachineRowBody.steps graph vertex n (ports j) (direction j) +
sequenceSteps graph n placement output vertex ops
(result graph n placement output vertex j base) = _
rw [ih]
rfl
def steps (graph : PortTables.Table vertices d) (vertex : Fin vertices) (n : Nat) : Nat :=
costSum graph vertex n (commands d n)
def budget (d n inputLength : Nat) : Nat :=
PoweringTableLayout.blockSize d n * PoweringMachineRowBody.budget d n inputLength
theorem costSum_le (graph : PortTables.Table vertices d) (vertex : Fin vertices)
(n : Nat) (ops : List (Command d n)) :
costSum graph vertex n ops ≤
ops.length * PoweringMachineRowBody.budget d n (PortTables.tableBits graph).length := by
induction ops with
| nil => simp only [costSum, List.length_nil, Nat.zero_mul, Nat.le_refl]
| cons j ops ih =>
have hfirst := PoweringMachineRowBody.steps_le graph vertex n (ports j) (direction j)
change PoweringMachineRowBody.steps graph vertex n (ports j) (direction j) +
costSum graph vertex n ops ≤ _
simpa only [List.length_cons, Nat.add_mul, Nat.one_mul, Nat.add_comm] using
Nat.add_le_add hfirst ih
theorem steps_le (graph : PortTables.Table vertices d) (vertex : Fin vertices) (n : Nat) :
steps graph vertex n ≤ budget d n (PortTables.tableBits graph).length := by
simpa only [steps, budget, commands_length] using costSum_le graph vertex n (commands d n)
theorem sequenceTrace (graph : PortTables.Table vertices d) (n : Nat)
(placement : PoweringMachineTapes.Tape (PoweringMachineRowBody.capacity n) → K)
(distinct : Function.Injective placement) (output : K) (outside : ∀ i, output ≠ placement i)
(vertex : Fin vertices) (ops : List (Command d n))
(labels : SequenceLabel ops → Λ) (exit : Option Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ (State d n))
(atLabels : ∀ l, program (labels l) = sequenceInstruction n placement output ops labels exit l)
(base : K → List Bool) (suffix : List Bool)
(ready : PoweringMachineRowBody.Ready graph n placement vertex suffix base) :
(advance (TM2.step program))^[sequenceSteps graph n placement output vertex ops base]
(some ⟨sequenceEntry ops labels exit,
PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n), base⟩) =
some ⟨exit, PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n),
sequenceTapes graph n placement output vertex ops base⟩ := by
apply MachineFiniteSequence.trace LocalLabel
(fun j => PoweringMachineRowBody.entry n (ports j) (direction j))
(fun j => PoweringMachineRowBody.instruction n placement output (ports j) (direction j))
(result graph n placement output vertex)
(fun j _ => PoweringMachineRowBody.steps graph vertex n (ports j) (direction j))
program (PoweringMachineRowBody.Ready graph n placement vertex suffix)
(fun _ => PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n)) id ops
· intro j _ tapes good
exact PoweringMachineRowBody.finalTapes_ready graph n placement distinct output outside
vertex (ports j) (direction j) tapes suffix good
· intro j _ localLabels localExit atLocal tapes good
exact PoweringMachineRowBody.rowTrace graph n placement distinct output outside vertex
(ports j) (direction j) localLabels localExit program atLocal tapes suffix good
· exact atLabels
· exact ready
theorem vertexTrace (graph : PortTables.Table vertices d) (n : Nat)
(placement : PoweringMachineTapes.Tape (PoweringMachineRowBody.capacity n) → K)
(distinct : Function.Injective placement) (output : K) (outside : ∀ i, output ≠ placement i)
(vertex : Fin vertices) (labels : Label d n → Λ) (exit : Option Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ (State d n))
(atLabels : ∀ l, program (labels l) = instruction n placement output labels exit l)
(base : K → List Bool) (suffix : List Bool)
(ready : PoweringMachineRowBody.Ready graph n placement vertex suffix base) :
(advance (TM2.step program))^[steps graph vertex n]
(some ⟨entry d n labels exit,
PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n), base⟩) =
some ⟨exit, PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n),
finalTapes graph n placement output vertex base⟩ := by
have h := sequenceTrace graph n placement distinct output outside vertex (commands d n)
labels exit program atLabels base suffix ready
rw [sequenceSteps_eq] at h
exact h
theorem sequenceTapes_ready (graph : PortTables.Table vertices d) (n : Nat)
(placement : PoweringMachineTapes.Tape (PoweringMachineRowBody.capacity n) → K)
(distinct : Function.Injective placement) (output : K) (outside : ∀ i, output ≠ placement i)
(vertex : Fin vertices) (ops : List (Command d n)) (base : K → List Bool)
(suffix : List Bool) (ready : PoweringMachineRowBody.Ready graph n placement vertex suffix base) :
PoweringMachineRowBody.Ready graph n placement vertex suffix
(sequenceTapes graph n placement output vertex ops base) := by
induction ops generalizing base with
| nil => exact ready
| cons j ops ih =>
apply ih
exact PoweringMachineRowBody.finalTapes_ready graph n placement distinct output outside
vertex (ports j) (direction j) base suffix ready
theorem finalTapes_ready (graph : PortTables.Table vertices d) (n : Nat)
(placement : PoweringMachineTapes.Tape (PoweringMachineRowBody.capacity n) → K)
(distinct : Function.Injective placement) (output : K) (outside : ∀ i, output ≠ placement i)
(vertex : Fin vertices) (base : K → List Bool) (suffix : List Bool)
(ready : PoweringMachineRowBody.Ready graph n placement vertex suffix base) :
PoweringMachineRowBody.Ready graph n placement vertex suffix
(finalTapes graph n placement output vertex base) :=
sequenceTapes_ready graph n placement distinct output outside vertex (commands d n) base suffix ready
end IndependentSetsGames.Foundations.Complexity.PoweringMachineVertex
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Expansion_PoweringPolynomialBudget
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget
open PCP
def preBudget (d n vertices inputLength : Nat) : Nat :=
(3 * vertices + 5) +
(vertices * (PoweringMachineVertex.budget d n inputLength + 2) + 1)
def totalBudget (d n pushBound tapeCount vertices inputLength : Nat) : Nat :=
preBudget d n vertices inputLength +
finishBudget d n pushBound tapeCount vertices inputLength
(preBudget d n vertices inputLength)
theorem preBudget_mono_vertices (d n inputLength : Nat) {v w : Nat} (h : v ≤ w) :
preBudget d n v inputLength ≤ preBudget d n w inputLength := by
have hthree := Nat.mul_le_mul_left 3 h
have hloop := Nat.mul_le_mul_right (PoweringMachineVertex.budget d n inputLength + 2) h
unfold preBudget
omega
theorem totalBudget_mono_vertices (d n pushBound tapeCount inputLength : Nat)
{v w : Nat} (hvertices : v ≤ w) :
totalBudget d n pushBound tapeCount v inputLength ≤
totalBudget d n pushBound tapeCount w inputLength := by
have hpre := preBudget_mono_vertices d n inputLength hvertices
unfold totalBudget
exact Nat.add_le_add hpre
(finishBudget_mono d n pushBound tapeCount inputLength hvertices hpre)
noncomputable def rowTime (d n : Nat) : Polynomial Nat :=
Polynomial.C (PoweringMachineRowBody.bufferSize d n) *
(Polynomial.C (28 * (2 * (n + 1)) + 10) * Polynomial.X +
Polynomial.C (24 * (2 * (n + 1)) + 15)) + Polynomial.C 1 +
(Polynomial.C (14 * (n + 1) + 4) * Polynomial.X +
Polynomial.C (12 * (n + 1)) + Polynomial.C 6)
@[simp] theorem rowTime_eval (d n inputLength : Nat) :
(rowTime d n).eval inputLength = PoweringMachineRowBody.budget d n inputLength := by
simp only [rowTime, Polynomial.eval_add, Polynomial.eval_mul, Polynomial.eval_C,
Polynomial.eval_X, PoweringMachineRowBody.budget, PoweringPlanBudget.rowBudget,
PoweringPlanBudget.fieldBudget, PoweringMachineRowBody.bufferSize, Nat.add_assoc]
noncomputable def vertexTime (d n : Nat) : Polynomial Nat :=
Polynomial.C (PoweringTableLayout.blockSize d n) * rowTime d n
@[simp] theorem vertexTime_eval (d n inputLength : Nat) :
(vertexTime d n).eval inputLength = PoweringMachineVertex.budget d n inputLength := by
simp only [vertexTime, Polynomial.eval_mul, Polynomial.eval_C, rowTime_eval,
PoweringMachineVertex.budget]
noncomputable def preTime (d n : Nat) : Polynomial Nat :=
(Polynomial.C 3 * Polynomial.X + Polynomial.C 5) +
(Polynomial.X * (vertexTime d n + Polynomial.C 2) + Polynomial.C 1)
@[simp] theorem preTime_eval (d n inputLength : Nat) :
(preTime d n).eval inputLength = preBudget d n inputLength inputLength := by
simp only [preTime, Polynomial.eval_add, Polynomial.eval_mul, Polynomial.eval_C,
Polynomial.eval_X, vertexTime_eval, preBudget]
noncomputable def time (d n pushBound tapeCount : Nat) : Polynomial Nat :=
preTime d n +
(Polynomial.C 2 *
(Polynomial.X + Polynomial.C (PoweringTableLayout.blockSize d n) * Polynomial.X) +
Polynomial.C 6 + Polynomial.C tapeCount *
(Polynomial.X + preTime d n * Polynomial.C pushBound + Polynomial.X +
Polynomial.C (PoweringTableLayout.blockSize d n) * Polynomial.X + Polynomial.C 3))
@[simp] theorem time_eval (d n pushBound tapeCount inputLength : Nat) :
(time d n pushBound tapeCount).eval inputLength =
totalBudget d n pushBound tapeCount inputLength inputLength := by
simp only [time, Polynomial.eval_add, Polynomial.eval_mul, Polynomial.eval_C,
Polynomial.eval_X, preTime_eval, totalBudget, finishBudget]
theorem totalBudget_le_time (d n pushBound tapeCount vertices inputLength : Nat)
(hvertices : vertices ≤ inputLength) :
totalBudget d n pushBound tapeCount vertices inputLength ≤
(time d n pushBound tapeCount).eval inputLength := by
rw [time_eval]
exact totalBudget_mono_vertices d n pushBound tapeCount inputLength hvertices
theorem execution_budget_le_time (d n pushBound tapeCount vertices inputLength : Nat)
(hvertices : vertices ≤ inputLength) {preSteps finishSteps : Nat}
(hpre : preSteps ≤ preBudget d n vertices inputLength)
(hfinish : finishSteps ≤ finishBudget d n pushBound tapeCount vertices inputLength
(preBudget d n vertices inputLength)) :
preSteps + finishSteps ≤ (time d n pushBound tapeCount).eval inputLength := by
calc
preSteps + finishSteps ≤ totalBudget d n pushBound tapeCount vertices inputLength := by
unfold totalBudget
exact Nat.add_le_add hpre hfinish
_ ≤ (time d n pushBound tapeCount).eval inputLength :=
totalBudget_le_time d n pushBound tapeCount vertices inputLength hvertices
end IndependentSetsGames.Foundations.Complexity.PoweringPolynomialBudget
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_PCP_Body
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.PCP.AlphabetTable.Body
open Turing
open IndependentSetsGames.Foundations.Complexity
open RuntimeModel
variable {q : Nat}
def rowStep (input : GenericGraphTables.Table q) (e : Fin input.darts)
(base : Tape → List Bool) (ready : LoopState.Ready input e.val base)
(oldRelation : GenericGraphTables.RelationTable q) (oldFlag : Bool) :
RowStepResult input e base oldRelation oldFlag := by
let N := (LoopState.inputBits input).length
have guarded : StateTransition.EvalsToInTime (TM2.step (Driver.program q))
⟨some .guard, normal oldRelation oldFlag, base⟩
(some ⟨some .tailStart, normal oldRelation oldFlag, guardTapes input e base⟩) 1 := by
have hbase : MachineUnaryCounter.counterTapes .counter base
(input.darts - (e.val + 1) + 1) [] = base := by
simp only [MachineUnaryCounter.counterTapes, List.append_nil,
← ready.counter_succ e.isLt, Function.update_eq_self]
have run := MachineUnaryCounter.guardInTime_succ Tape.counter Driver.Label.guard
.tailStart .reverseOutput (Driver.program q) (by rfl) base
(input.darts - (e.val + 1)) [] (normal oldRelation oldFlag).1 none
rw [hbase] at run
simpa only [MachineUnaryCounter.counterTapes, List.append_nil, guardTapes,
normal] using run
have parsed : StateTransition.EvalsToInTime (TM2.step (Driver.program q))
⟨some .tailStart, normal oldRelation oldFlag, guardTapes input e base⟩
(some ⟨some .headCopyFirst, normal input.rows[e].relation oldFlag,
parsedTapes input e base⟩) (Lookup.readRowCost input.rows[e]) := by
have hcursor : guardTapes input e base .cursor = Lookup.rowBits input.rows[e] ++
LoopState.cursorBits input (e.val + 1) := by
simpa only [guardTapes, Function.update_of_ne (by decide : Tape.cursor ≠ .counter),
Lookup.rowBits] using ready.cursor.trans (LoopState.cursorBits_succ input e.val e.isLt)
have htail : guardTapes input e base .tail = [] := by simp [guardTapes, ready.tail]
have hreverse : guardTapes input e base .reverseIndex = [] := by
simp [guardTapes, ready.reverseIndex]
simpa only [normal, parsedTapes] using
Lookup.readRowInTime Tape.cursor Tape.tail Tape.reverseIndex
(by decide) (by decide) (by decide) Driver.Label.tailStart .tailLoop
.reverseStart .reverseLoop .readPredicate .headCopyFirst (Driver.program q)
(by rfl) (by rfl) (by rfl) (by rfl) (by rfl)
(guardTapes input e base) input.rows[e] (LoopState.cursorBits input (e.val + 1))
hcursor htail hreverse (oldFlag, false, none) oldRelation none
have looked : StateTransition.EvalsToInTime (TM2.step (Driver.program q))
⟨some .headCopyFirst, normal input.rows[e].relation oldFlag, parsedTapes input e base⟩
(some ⟨some (.compare .leftFirst), normal input.rows[e].relation oldFlag,
workingTapes input e base⟩) (7 * N + 5) := by
have htable : parsedTapes input e base (headPorts 0) = GenericGraphTables.tableBits input := by
simpa [headPorts, parsedTapes, Lookup.readRowTapes, guardTapes,
LoopState.inputBits] using ready.original
have hreverse : parsedTapes input e base (headPorts 1) =
encodeWord (Lookup.headIndex input e).val := by
simp [headPorts, parsedTapes, Lookup.readRowTapes, Lookup.headIndex]
have hhead : parsedTapes input e base (headPorts 4) = [] := by
simp [headPorts, parsedTapes, Lookup.readRowTapes, guardTapes, ready.head]
have hscratch : parsedTapes input e base (headPorts 5) = [] := by
simp [headPorts, parsedTapes, Lookup.readRowTapes, guardTapes, ready.scratch]
have run := Lookup.headLookupInTime headPorts headPorts_injective
Driver.Label.headCopyFirst .headCopySecond .indexCopyFirst .indexCopySecond
.headVertices .headDarts Driver.Label.headLookup (some (.compare .leftFirst))
(Driver.program q) (by rfl) (by rfl) (by rfl) (by rfl) (by rfl) (by rfl)
(fun _ => rfl) (parsedTapes input e base) input e htable hreverse hhead hscratch
(normal input.rows[e].relation oldFlag).1 none
simpa only [workingTapes, normal, N, LoopState.inputBits, Lookup.headTimePolynomial,
Polynomial.eval_add, Polynomial.eval_mul, Polynomial.eval_C, Polynomial.eval_X] using run
have hleft : workingTapes input e base .compareLeft = [] :=
(workingTapes_other input e base .compareLeft (by decide) (by decide) (by decide)
(by decide) (by decide) (by decide) (by decide)).trans ready.compareLeft
have hright : workingTapes input e base .compareRight = [] :=
(workingTapes_other input e base .compareRight (by decide) (by decide) (by decide)
(by decide) (by decide) (by decide) (by decide)).trans ready.compareRight
have hscratch : workingTapes input e base .scratch = [] :=
(workingTapes_other input e base .scratch (by decide) (by decide) (by decide)
(by decide) (by decide) (by decide) (by decide)).trans ready.scratch
let compared := CompareLoop.compareRowInTime Driver.Label.compare (Driver.rowEntry q)
(Driver.program q) (fun _ => rfl) input e (workingTapes input e base)
(workingTapes_tail input e base) (workingTapes_head input e base)
hleft hright hscratch oldFlag
let emitted := emitInTime input e (workingTapes input e base)
(workingOperands input e base ready) hscratch
let cleared := clearFieldsInTime (emittedTapes input e base) (CompareLoop.rowState input e).1
have hedge : clearFieldsTapes (emittedTapes input e base) .edge = encodeWord e.val := by
simp [clearFieldsTapes, emittedTapes, Emitter.resultTapes, workingTapes,
Lookup.headLookupTapes, MachineLookup.tapes, headPorts, parsedTapes,
Lookup.readRowTapes, guardTapes, ready.edge]
let incremented := incrementInTime (clearFieldsTapes (emittedTapes input e base))
(CompareLoop.rowState input e).1 e.val hedge
let run₁ := StateTransition.EvalsToInTime.trans _ _ _ _ _ _ guarded parsed
let run₂ := StateTransition.EvalsToInTime.trans _ _ _ _ _ _ run₁ looked
let run₃ := StateTransition.EvalsToInTime.trans _ _ _ _ _ _ run₂ compared
let run₄ := StateTransition.EvalsToInTime.trans _ _ _ _ _ _ run₃ emitted
let run₅ := StateTransition.EvalsToInTime.trans _ _ _ _ _ _ run₄ cleared
let run := StateTransition.EvalsToInTime.trans _ _ _ _ _ _ run₅ incremented
refine {
tapes := resultTapes input e base
ready := result_ready input e base ready
run := { toEvalsTo := run.toEvalsTo, steps_le_m := ?_ }
}
have hn : input.vertices ≤ N := GenericGraphTables.vertices_le_tableBits_length input
have hm : input.darts ≤ N := GenericGraphTables.darts_le_tableBits_length input
have hr : Lookup.readRowCost input.rows[e] ≤ 2 * N + 5 :=
Lookup.readRowCost_table_le input e
have ht : (emittedTapes input e base .tail).length ≤ N := by
simp only [emittedTapes, Emitter.resultTapes,
Function.update_of_ne (by decide : Tape.tail ≠ .reversed), workingTapes_tail,
encodeWord_length]
exact (Nat.succ_le_of_lt input.rows[e].tail.isLt).trans hn
have hv : (emittedTapes input e base .reverseIndex).length ≤ N := by
simp only [emittedTapes, Emitter.resultTapes,
Function.update_of_ne (by decide : Tape.reverseIndex ≠ .reversed), workingTapes_reverse,
encodeWord_length]
exact (Nat.succ_le_of_lt input.rows[e].reverseIndex.isLt).trans hm
have hh : (emittedTapes input e base .head).length ≤ N := by
simp only [emittedTapes, Emitter.resultTapes,
Function.update_of_ne (by decide : Tape.head ≠ .reversed), workingTapes_head,
encodeWord_length]
exact (Nat.succ_le_of_lt input.rows[input.rows[e].reverseIndex].tail.isLt).trans hn
have budget := run.steps_le_m
change run.steps ≤ (32 + 8 * (Enumeration.localCount q * (6 * (2 * 4104)))) * (N + 1)
nlinarith
end IndependentSetsGames.Foundations.PCP.AlphabetTable.Body
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_PCP_LoopInitialization
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.PCP.AlphabetTable.Loop
open Turing
open IndependentSetsGames.Foundations.Complexity
open RuntimeModel
variable {q : Nat}
def runRemaining (input : GenericGraphTables.Table q) :
(remaining e : Nat) → e + remaining = input.darts →
(base : Tape → List Bool) → LoopState.Ready input e base →
(oldRelation : GenericGraphTables.RelationTable q) → (oldFlag : Bool) →
LoopResult input e remaining base oldRelation oldFlag
| 0, e, finished, base, ready, oldRelation, oldFlag => by
have atEnd : e = input.darts := by omega
subst e
exact {
tapes := base
relation := oldRelation
flag := oldFlag
ready := ready
run := by
simpa only [Nat.zero_mul, Nat.zero_add] using
zeroGuardInTime input base ready oldRelation oldFlag }
| remaining + 1, e, finished, base, ready, oldRelation, oldFlag => by
have beforeEnd : e < input.darts := by omega
let edge : Fin input.darts := ⟨e, beforeEnd⟩
let one := Body.rowStep input edge base ready oldRelation oldFlag
let rest := runRemaining input remaining (e + 1) (by omega) one.tapes one.ready
input.rows[edge].relation (CompareLoop.rowLoop input edge)
let composed := StateTransition.EvalsToInTime.trans _ _ _ _ _ _ one.run rest.run
refine {
tapes := rest.tapes
relation := rest.relation
flag := rest.flag
ready := rest.ready
run := { toEvalsTo := composed.toEvalsTo, steps_le_m := ?_ } }
have budget := composed.steps_le_m
simpa only [Nat.succ_mul, Nat.add_assoc, Nat.add_comm, Nat.add_left_comm] using budget
def runPrefix (input : GenericGraphTables.Table q) : PrefixResult input := by
let rows := runRemaining input input.darts 0 (by simp)
(Initialization.loopTapes input) (LoopInitialization.initialization_ready input)
(Vector.replicate (q * q) false) false
let composed := StateTransition.EvalsToInTime.trans _ _ _ _ _ _
(Initialization.initializeInTime input) rows.run
refine {
tapes := rows.tapes
relation := rows.relation
flag := rows.flag
ready := rows.ready
run := { toEvalsTo := composed.toEvalsTo, steps_le_m := ?_ } }
have budget := composed.steps_le_m
change composed.steps ≤
input.darts * Body.bodyTime q (LoopState.inputBits input).length + 1 +
Initialization.time (LoopState.inputBits input).length at budget
have rowCount : input.darts ≤ (LoopState.inputBits input).length :=
GenericGraphTables.darts_le_tableBits_length input
have rowBudget := Nat.mul_le_mul_right (Body.bodyTime q (LoopState.inputBits input).length)
rowCount
unfold prefixTime
omega
end IndependentSetsGames.Foundations.PCP.AlphabetTable.Loop
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_Runtime
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace _root_.OAI.IndependentSetsGames.Foundations.PCP.RoundTables.instNonemptyFinDartsValTableLtNatOfNat
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.PCP.AlphabetTable.Runtime
open Turing
open IndependentSetsGames.Foundations.Complexity
open RuntimeModel
noncomputable def tableOutputsInTime {q : Nat} (input : GenericGraphTables.Table q) :
TM2OutputsInTime (Driver.machine q) (GenericGraphTables.tableBits input)
(some (GraphTables.tableBits (Table.build input)))
((time q).eval (GenericGraphTables.tableBits input).length) := by
let prefixRun := Loop.runPrefix input
have hrun : StateTransition.EvalsToInTime (Driver.machine q).step
(initList (Driver.machine q) (GenericGraphTables.tableBits input))
(some ⟨some .reverseOutput, normal prefixRun.relation prefixRun.flag, prefixRun.tapes⟩)
((prefixPolynomial q).eval (GenericGraphTables.tableBits input).length) := by
rw [prefixPolynomial_eval]
exact prefixRun.run
exact Finish.finishAfterPolynomialPrefix q (GenericGraphTables.tableBits input)
prefixRun.tapes (GraphTables.tableBits (Table.build input))
(normal prefixRun.relation prefixRun.flag) (prefixPolynomial q) hrun
prefixRun.ready.reversed_at_end prefixRun.ready.output
noncomputable def tablePolynomialTime (q : Nat) :
TM2ComputableInPolyTime (GenericGraphTables.tableBits (q := q))
GraphTables.tableBits (Table.build (q := q)) where
tm := Driver.machine q
inputAlphabet := Equiv.refl Bool
outputAlphabet := Equiv.refl Bool
time := time q
outputsFun input := by
change TM2OutputsInTime (Driver.machine q)
((GenericGraphTables.tableBits input).map id)
(some ((GraphTables.tableBits (Table.build input)).map id))
((time q).eval (GenericGraphTables.tableBits input).length)
convert! tableOutputsInTime input using 1
· exact congrArg (TM2OutputsInTime (Driver.machine q)) (List.map_id _)
· exact congrArg some (List.map_id _)
end IndependentSetsGames.Foundations.PCP.AlphabetTable.Runtime
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringMachineOuterLoop
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachineOuterLoop
open Turing MachineComposition PCP
variable {K Λ : Type} [DecidableEq K] {vertices d n : Nat}
theorem vertexEntry (d n : Nat) (labels : PoweringMachineVertex.Label d n → Λ) (guardLabel : Λ) :
PoweringMachineVertex.entry d n labels (some guardLabel) =
some (vertexStart d n labels guardLabel) := by
unfold vertexStart PoweringMachineVertex.entry PoweringMachineVertex.sequenceEntry
have h : ∀ (commands : List (PoweringMachineVertex.Command d n))
(labels : MachineFiniteSequence.Label PoweringMachineVertex.LocalLabel commands → Λ),
MachineFiniteSequence.entry PoweringMachineVertex.LocalLabel
(fun j => PoweringMachineRowBody.entry n
(PoweringMachineVertex.ports j) (PoweringMachineVertex.direction j))
commands labels (some guardLabel) =
some ((MachineFiniteSequence.entry PoweringMachineVertex.LocalLabel
(fun j => PoweringMachineRowBody.entry n
(PoweringMachineVertex.ports j) (PoweringMachineVertex.direction j))
commands labels (some guardLabel)).getD guardLabel) := by
intro commands labels
cases commands <;> rfl
exact h _ labels
def steps (graph : PortTables.Table vertices d) (n : Nat) :
(remaining : Nat) → remaining ≤ vertices → Nat
| 0, _ => 1
| r + 1, bounded =>
2 + PoweringMachineVertex.steps graph ⟨r, by omega⟩ n + steps graph n r (by omega)
theorem steps_le (graph : PortTables.Table vertices d) (n remaining : Nat)
(bounded : remaining ≤ vertices) :
steps graph n remaining bounded ≤
remaining * (PoweringMachineVertex.budget d n (PortTables.tableBits graph).length + 2) + 1 := by
induction remaining with
| zero => simp [steps]
| succ r ih =>
have hv := PoweringMachineVertex.steps_le graph (⟨r, by omega⟩ : Fin vertices) n
have hi := ih (by omega)
simp only [steps, Nat.add_mul, Nat.one_mul]
omega
theorem finalTapes_ready (graph : PortTables.Table vertices d) (n : Nat)
(placement : Placement K n) (distinct : Function.Injective placement)
(output : K) (outside : ∀ i, output ≠ placement i)
(remaining : Nat) (bounded : remaining ≤ vertices) (base : K → List Bool)
(ready : Ready graph n placement base) :
Ready graph n placement (finalTapes graph n placement output remaining bounded base) := by
induction remaining generalizing base with
| zero =>
constructor
· rw [finalTapes, counter_other placement distinct base 0 0 (by decide)]
exact ready.table
· rw [finalTapes, counter_other placement distinct base 0 5 (by decide)]
exact ready.scratch
· rw [finalTapes, counter_other placement distinct base 0 8 (by decide)]
exact ready.leftCopy
· rw [finalTapes, counter_other placement distinct base 0 9 (by decide)]
exact ready.rightCopy
· rw [finalTapes, counter_other placement distinct base 0 10 (by decide)]
exact ready.data
| succ r ih =>
apply ih
apply ready_of_vertex graph n placement _ (⟨r, by omega⟩ : Fin vertices)
exact PoweringMachineVertex.finalTapes_ready graph n placement distinct output outside
⟨r, by omega⟩ _ [] (ready_vertex graph n placement distinct base ready _)
theorem prefixRows_ofFn (graph : PortTables.Table vertices d) (n remaining : Nat)
(bounded : remaining ≤ vertices) :
prefixRows graph n remaining =
(List.ofFn (fun i : Fin remaining =>
PoweringTableLayout.vertexRowBits graph n (Fin.castLE bounded i))).flatten := by
induction remaining with
| zero => rfl
| succ r ih =>
have hr : r < vertices := by omega
rw [prefixRows, dite_eq_left hr, List.ofFn_succ_last, List.flatten_append]
simp only [List.flatten_cons, List.flatten_nil, List.append_nil]
change prefixRows graph n r ++ PoweringTableLayout.vertexRowBits graph n ⟨r, hr⟩ =
(List.ofFn (fun i : Fin r => PoweringTableLayout.vertexRowBits graph n
(Fin.castLE (show r ≤ vertices by omega) i))).flatten ++
PoweringTableLayout.vertexRowBits graph n ⟨r, hr⟩
rw [ih]
theorem prefixRows_all (graph : PortTables.Table vertices d) (n : Nat) :
prefixRows graph n vertices =
(List.finRange vertices).flatMap (PoweringTableLayout.vertexRowBits graph n) := by
rw [prefixRows_ofFn graph n vertices (Nat.le_refl _)]
simp only [List.finRange, List.flatMap_def, List.map_ofFn]
rfl
theorem finalTapes_output (graph : PortTables.Table vertices d) (n : Nat)
(placement : Placement K n) (distinct : Function.Injective placement)
(output : K) (outside : ∀ i, output ≠ placement i)
(remaining : Nat) (bounded : remaining ≤ vertices) (base : K → List Bool)
(ready : Ready graph n placement base) :
finalTapes graph n placement output remaining bounded base output =
prefixRows graph n remaining ++ base output := by
induction remaining generalizing base with
| zero =>
exact MachineUnaryCounter.counterTapes_other (placement (.inl 1)) output (outside _)
base 0 []
| succ r ih =>
let vertex : Fin vertices := ⟨r, by omega⟩
let current := counter placement base r
have vertexReady := ready_vertex graph n placement distinct base ready vertex
have nextReady := PoweringMachineVertex.finalTapes_ready graph n placement distinct
output outside vertex current [] vertexReady
change finalTapes graph n placement output r (by omega)
(PoweringMachineVertex.finalTapes graph n placement output vertex current) output = _
rw [ih (by omega) _ (ready_of_vertex graph n placement _ vertex nextReady),
PoweringMachineVertex.finalTapes_output graph n placement distinct output outside
vertex current [] vertexReady]
have hc : current output = base output :=
MachineUnaryCounter.counterTapes_other (placement (.inl 1)) output (outside _) base r []
rw [hc, prefixRows, dite_eq_left vertex.isLt, List.append_assoc]
theorem loopTrace (graph : PortTables.Table vertices d) (n : Nat)
(placement : Placement K n) (distinct : Function.Injective placement)
(output : K) (outside : ∀ i, output ≠ placement i)
(guardLabel bridgeLabel exitLabel : Λ) (labels : PoweringMachineVertex.Label d n → Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ (State d n))
(atGuard : program guardLabel =
MachineUnaryCounter.guard (placement (.inl 1)) bridgeLabel exitLabel)
(atBridge : program bridgeLabel = bridge d n labels guardLabel)
(atVertex : ∀ l, program (labels l) =
PoweringMachineVertex.instruction n placement output labels (some guardLabel) l)
(remaining : Nat) (bounded : remaining ≤ vertices) (base : K → List Bool)
(ready : Ready graph n placement base) :
(advance (TM2.step program))^[steps graph n remaining bounded]
(some ⟨some guardLabel, PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n),
counter placement base remaining⟩) =
some ⟨some exitLabel, PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n),
finalTapes graph n placement output remaining bounded base⟩ := by
let initial := PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n)
induction remaining generalizing base with
| zero =>
simpa only [steps, finalTapes, counter, initial, PoweringMasterState.clean,
PoweringMasterState.withBuffer] using
MachineUnaryCounter.guardTrace_zero (placement (.inl 1)) guardLabel bridgeLabel exitLabel
program atGuard base [] initial.1 none
| succ r ih =>
let vertex : Fin vertices := ⟨r, by omega⟩
let current := counter placement base r
let next := PoweringMachineVertex.finalTapes graph n placement output vertex current
have vertexReady : PoweringMachineRowBody.Ready graph n placement vertex [] current :=
ready_vertex graph n placement distinct base ready vertex
have nextVertexReady := PoweringMachineVertex.finalTapes_ready graph n placement distinct
output outside vertex current [] vertexReady
have nextReady : Ready graph n placement next :=
ready_of_vertex graph n placement next vertex nextVertexReady
have sameCounter : counter placement next r = next := by
have hs := nextVertexReady.1.source
change next (placement (.inl 1)) = encodeWord r ++ [] at hs
unfold counter MachineUnaryCounter.counterTapes
rw [← hs]
exact Function.update_eq_self _ _
have tailRun := ih (by omega) next nextReady
rw [sameCounter] at tailRun
have guardRun : advance (TM2.step program)
(some ⟨some guardLabel, initial, counter placement base (r + 1)⟩) =
some ⟨some bridgeLabel, initial, current⟩ := by
simpa only [advance_some, current, counter, initial, PoweringMasterState.clean,
PoweringMasterState.withBuffer] using
MachineUnaryCounter.guardStep_succ (placement (.inl 1)) guardLabel bridgeLabel exitLabel
program atGuard base r [] initial.1 none
have bridgeRun : advance (TM2.step program)
(some ⟨some bridgeLabel, initial, current⟩) =
some ⟨PoweringMachineVertex.entry d n labels (some guardLabel), initial, current⟩ := by
change some (TM2.stepAux (program bridgeLabel) initial current) = _
rw [atBridge, vertexEntry]
rfl
have vertexRun := PoweringMachineVertex.vertexTrace graph n placement distinct output outside
vertex labels (some guardLabel) program atVertex current [] vertexReady
change (advance (TM2.step program))^[2 + PoweringMachineVertex.steps graph vertex n +
steps graph n r (by omega)]
(some ⟨some guardLabel, initial, counter placement base (r + 1)⟩) = _
rw [show 2 + PoweringMachineVertex.steps graph vertex n + steps graph n r (by omega) =
(steps graph n r (by omega) + PoweringMachineVertex.steps graph vertex n) + 1 + 1 by omega,
Function.iterate_succ_apply, guardRun, Function.iterate_succ_apply, bridgeRun,
Function.iterate_add_apply, vertexRun]
exact tailRun
def loopInTime (graph : PortTables.Table vertices d) (n : Nat)
(placement : Placement K n) (distinct : Function.Injective placement)
(output : K) (outside : ∀ i, output ≠ placement i)
(guardLabel bridgeLabel exitLabel : Λ) (labels : PoweringMachineVertex.Label d n → Λ)
(program : Λ → TM2.Stmt (fun _ : K => Bool) Λ (State d n))
(atGuard : program guardLabel =
MachineUnaryCounter.guard (placement (.inl 1)) bridgeLabel exitLabel)
(atBridge : program bridgeLabel = bridge d n labels guardLabel)
(atVertex : ∀ l, program (labels l) =
PoweringMachineVertex.instruction n placement output labels (some guardLabel) l)
(remaining : Nat) (bounded : remaining ≤ vertices) (base : K → List Bool)
(ready : Ready graph n placement base) :
StateTransition.EvalsToInTime (TM2.step program)
⟨some guardLabel, PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n),
counter placement base remaining⟩
(some ⟨some exitLabel, PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n),
finalTapes graph n placement output remaining bounded base⟩)
(remaining * (PoweringMachineVertex.budget d n (PortTables.tableBits graph).length + 2) + 1) where
steps := steps graph n remaining bounded
evals_in_steps := loopTrace graph n placement distinct output outside guardLabel bridgeLabel
exitLabel labels program atGuard atBridge atVertex remaining bounded base ready
steps_le_m := steps_le graph n remaining bounded
end IndependentSetsGames.Foundations.Complexity.PoweringMachineOuterLoop
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringRuntimeBudget
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringRuntimeBudget
open Turing
theorem finish_steps_le_of_execution (d radius : Nat) (input : List Bool)
(before : (PoweringMachineGlobal.machine d radius).Cfg)
(priorBudget vertices darts : Nat)
(prior : StateTransition.EvalsToInTime (PoweringMachineGlobal.machine d radius).step
(initList (PoweringMachineGlobal.machine d radius) input) (some before) priorBudget) :
PoweringMachineFinish.steps (PoweringMachineGlobal.enumeration radius)
(PoweringMachineGlobal.outputTape radius) before.stk vertices darts ≤
2 * (vertices + darts) + 6 + tapeCount radius *
(input.length + priorBudget * Runtime.programPushBound
(PoweringMachineGlobal.machine d radius) + vertices + darts + 3) := by
exact PoweringMachineFinish.steps_le_uniform (PoweringMachineGlobal.enumeration radius)
(PoweringMachineGlobal.outputTape radius) before.stk vertices darts
(input.length + priorBudget * Runtime.programPushBound (PoweringMachineGlobal.machine d radius))
(stackLength_le_from_input (PoweringMachineGlobal.machine d radius) input before priorBudget prior)
end IndependentSetsGames.Foundations.Complexity.PoweringRuntimeBudget
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PoweringMachineRuntime
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.Complexity.PoweringMachineRuntime
open Turing MachineComposition PCP PoweringMachineGlobal
variable {vertices d : Nat}
def beforeFinishBudget (graph : PortTables.Table vertices d) (n : Nat) : Nat :=
(3 * vertices + 5) + (vertices *
(PoweringMachineVertex.budget d n (PortTables.tableBits graph).length + 2) + 1)
theorem beforeFinish_ready (graph : PortTables.Table vertices d) (n : Nat) :
PoweringMachineOuterLoop.Ready graph n (placement n) (beforeFinish graph n) :=
PoweringMachineOuterLoop.finalTapes_ready graph n (placement n)
(PoweringMachineInitialize.commonPlacement_injective _)
(outputTape n) (fun i => Ne.symm (PoweringMachineInitialize.commonPlacement_ne_finalOutput _ i))
vertices (Nat.le_refl _) (PoweringInitializeFrame.preparedTapes graph n)
(PoweringInitializeFrame.prepared_ready graph n)
theorem beforeFinish_output (graph : PortTables.Table vertices d) (n : Nat) :
beforeFinish graph n (outputTape n) =
(List.finRange vertices).flatMap (PoweringTableLayout.vertexRowBits graph n) := by
rw [beforeFinish, PoweringMachineOuterLoop.finalTapes_output graph n (placement n)
(PoweringMachineInitialize.commonPlacement_injective _) (outputTape n)
(fun i => Ne.symm (PoweringMachineInitialize.commonPlacement_ne_finalOutput _ i))
vertices (Nat.le_refl _) (PoweringInitializeFrame.preparedTapes graph n)
(PoweringInitializeFrame.prepared_ready graph n),
PoweringMachineOuterLoop.prefixRows_all, PoweringInitializeFrame.prepared_output,
List.append_nil]
theorem beforeFinish_vertices (graph : PortTables.Table vertices d) (n : Nat) :
beforeFinish graph n (headerVertices n) = encodeWord vertices := by
rw [beforeFinish, PoweringMachineOuterLoop.finalTapes_other graph n (placement n)
(outputTape n) vertices (Nat.le_refl _) (PoweringInitializeFrame.preparedTapes graph n)
(headerVertices n) (PoweringGlobalConfiguration.headerVertices_ne_output n)
(fun i => Ne.symm (PoweringMachineInitialize.commonPlacement_ne_header _ i .vertices (by decide)))]
exact PoweringInitializeFrame.prepared_vertices graph n
theorem beforeFinish_darts (graph : PortTables.Table vertices d) (n : Nat) :
beforeFinish graph n (headerDarts n) =
encodeWord (PoweringTableLayout.blockSize d n * vertices) := by
rw [beforeFinish, PoweringMachineOuterLoop.finalTapes_other graph n (placement n)
(outputTape n) vertices (Nat.le_refl _) (PoweringInitializeFrame.preparedTapes graph n)
(headerDarts n) (PoweringGlobalConfiguration.headerDarts_ne_output n)
(fun i => Ne.symm (PoweringMachineInitialize.commonPlacement_ne_header _ i .darts (by decide)))]
exact PoweringInitializeFrame.prepared_darts graph n
theorem serialized_eq (graph : PortTables.Table vertices d) (n : Nat) :
encodeWords [vertices, PoweringTableLayout.blockSize d n * vertices] ++
beforeFinish graph n (outputTape n) = PoweringTables.outputBits graph n := by
rw [beforeFinish_output, PoweringTableLayout.outputBits_vertexRows]
congr 2
rw [PoweringTableLayout.dartCount_eq_vertex_blocks, Nat.mul_comm]
def beforeFinishExecution (graph : PortTables.Table vertices d) (n : Nat) :
StateTransition.EvalsToInTime (machine d n).step
(initList (machine d n) (PortTables.tableBits graph))
(some (finishConfiguration graph n)) (beforeFinishBudget graph n) := by
have initialRun := PoweringInitializeFrame.initializeInTime graph n
have loop := PoweringMachineOuterLoop.loopInTime graph n (placement n)
(PoweringMachineInitialize.commonPlacement_injective _) (outputTape n)
(fun i => Ne.symm (PoweringMachineInitialize.commonPlacement_ne_finalOutput _ i))
(guardLabel d n) (bridgeLabel d n) (finishEntry d n) (vertexLabels d n)
(program d n) (atGuard d n) (atBridge d n) (atVertex d n)
vertices (Nat.le_refl _) (PoweringInitializeFrame.preparedTapes graph n)
(PoweringInitializeFrame.prepared_ready graph n)
rw [PoweringInitializeFrame.prepared_counter] at loop
simpa only [beforeFinishBudget, Nat.add_comm] using
(StateTransition.EvalsToInTime.trans (machine d n).step
(3 * vertices + 5)
(vertices * (PoweringMachineVertex.budget d n (PortTables.tableBits graph).length + 2) + 1)
(initList (machine d n) (PortTables.tableBits graph))
(PoweringInitializeFrame.preparedCfg graph n) (some (finishConfiguration graph n))
initialRun loop)
def finishExecution (graph : PortTables.Table vertices d) (n : Nat) :
StateTransition.EvalsToInTime (machine d n).step (finishConfiguration graph n)
(some (haltList (machine d n) (PoweringTables.outputBits graph n)))
(finishSteps graph n) := by
have run := PoweringMachineFinish.traceAt (enumeration n)
(headerVertices n) (headerDarts n) (outputTape n)
(placement n (PoweringMachineTapes.scratch (PoweringMachineRowBody.capacity n)))
(PoweringGlobalConfiguration.headerVertices_ne_scratch n)
(PoweringGlobalConfiguration.headerVertices_ne_output n)
(PoweringGlobalConfiguration.headerDarts_ne_scratch n)
(PoweringGlobalConfiguration.headerDarts_ne_output n)
(PoweringMachineInitialize.commonPlacement_ne_finalOutput _ _)
(finishLabels d n) (program d n) (atFinish d n)
(beforeFinish graph n) vertices (PoweringTableLayout.blockSize d n * vertices) [] []
(by simpa only [List.append_nil] using beforeFinish_vertices graph n)
(by simpa only [List.append_nil] using beforeFinish_darts graph n)
(beforeFinish_ready graph n).scratch
(PoweringMasterState.clean (PoweringMachineRowBody.bufferSize d n)).1 none
rw [serialized_eq] at run
refine { steps := finishSteps graph n, evals_in_steps := ?_, steps_le_m := Nat.le_refl _ }
change (advance (TM2.step (program d n)))^[finishSteps graph n]
(some (finishConfiguration graph n)) = _
rw [PoweringGlobalConfiguration.haltList_eq]
exact run
def execution (graph : PortTables.Table vertices d) (n : Nat) :
TM2OutputsInTime (machine d n) (PortTables.tableBits graph)
(some (PoweringTables.outputBits graph n))
(beforeFinishBudget graph n + finishSteps graph n) := by
rw [Nat.add_comm (beforeFinishBudget graph n) (finishSteps graph n)]
exact StateTransition.EvalsToInTime.trans (machine d n).step
(beforeFinishBudget graph n) (finishSteps graph n)
(initList (machine d n) (PortTables.tableBits graph))
(finishConfiguration graph n)
(some (haltList (machine d n) (PoweringTables.outputBits graph n)))
(beforeFinishExecution graph n) (finishExecution graph n)
theorem finishSteps_le (graph : PortTables.Table vertices d) (n : Nat) :
finishSteps graph n ≤
2 * (vertices + PoweringTableLayout.blockSize d n * vertices) + 6 +
PoweringRuntimeBudget.tapeCount n *
((PortTables.tableBits graph).length + beforeFinishBudget graph n *
Runtime.programPushBound (machine d n) + vertices +
PoweringTableLayout.blockSize d n * vertices + 3) :=
PoweringRuntimeBudget.finish_steps_le_of_execution d n (PortTables.tableBits graph)
(finishConfiguration graph n) (beforeFinishBudget graph n) vertices
(PoweringTableLayout.blockSize d n * vertices) (beforeFinishExecution graph n)
theorem execution_budget_le (graph : PortTables.Table vertices d) (n : Nat) :
beforeFinishBudget graph n + finishSteps graph n ≤
(PoweringPolynomialBudget.time d n (Runtime.programPushBound (machine d n))
(PoweringRuntimeBudget.tapeCount n)).eval (PortTables.tableBits graph).length := by
exact PoweringPolynomialBudget.execution_budget_le_time d n
(Runtime.programPushBound (machine d n)) (PoweringRuntimeBudget.tapeCount n)
vertices (PortTables.tableBits graph).length (PortTables.vertices_le_tableBits_length graph)
(Nat.le_refl _) (finishSteps_le graph n)
noncomputable def computableInPolyTime (d n : Nat) :
TM2ComputableInPolyTime (@PortTables.inputBits d) GenericGraphTables.tableBits
(PoweringTables.transform d n) where
tm := machine d n
inputAlphabet := Equiv.refl Bool
outputAlphabet := Equiv.refl Bool
time := PoweringPolynomialBudget.time d n (Runtime.programPushBound (machine d n))
(PoweringRuntimeBudget.tapeCount n)
outputsFun input := by
rcases input with ⟨vertices, graph⟩
have run := execution graph n
let bounded : TM2OutputsInTime (machine d n) (PortTables.tableBits graph)
(some (PoweringTables.outputBits graph n))
((PoweringPolynomialBudget.time d n (Runtime.programPushBound (machine d n))
(PoweringRuntimeBudget.tapeCount n)).eval (PortTables.tableBits graph).length) :=
⟨run.toEvalsTo, run.steps_le_m.trans (execution_budget_le graph n)⟩
change TM2OutputsInTime (machine d n) ((PortTables.tableBits graph).map id)
(some ((PoweringTables.outputBits graph n).map id)) _
simpa only [machine, List.map_id, PortTables.inputBits] using bounded
end IndependentSetsGames.Foundations.Complexity.PoweringMachineRuntime
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Expansion_RoundComputation
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.PCP.RoundComputation
open Turing
open IndependentSetsGames.Foundations.Complexity
noncomputable def tablePolynomialTimeOfCertificates (H : RoundTables.BaseTable)
(preprocessing : PreprocessingCertificate H) (powering : PoweringCertificate) :
TM2ComputableInPolyTime GraphTables.tableBits GraphTables.tableBits
(RoundTables.build H) := by
change TM2ComputableInPolyTime GraphTables.tableBits GraphTables.tableBits
(fun table => AlphabetTable.Table.build (RoundTables.powered H table))
exact MachineSequential.composeBits
(poweredPolynomialTimeOfCertificates H preprocessing powering)
(AlphabetTable.Runtime.tablePolynomialTime RoundTables.alphabet)
noncomputable def tablePolynomialTime (H : RoundTables.BaseTable)
(preprocessing : PreprocessingCertificate H) :
TM2ComputableInPolyTime GraphTables.tableBits GraphTables.tableBits
(RoundTables.build H) :=
tablePolynomialTimeOfCertificates H preprocessing
(PoweringMachineRuntime.computableInPolyTime PreprocessingTables.degree
RoundTables.walkParameter)
end IndependentSetsGames.Foundations.PCP.RoundComputation
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_MachineLazyTableRuntime
attribute [-instance] _root_.Convexity.StdSimplex.instInhabited _root_.Convexity.StdSimplex.instNonempty _root_.Convexity.StdSimplex.instSubsingleton _root_.Convexity.StdSimplex.instUnique _root_.Convexity.StdSimplex.topologicalSpace _root_.OAI.IndependentSetsGames.Foundations.PCP.RoundTables.instNonemptyFinDartsValTableLtNatOfNat
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace IndependentSetsGames.Foundations.PCP.PreprocessingFinishRuntime
open Turing IndependentSetsGames.Foundations.Complexity
open PreprocessingRegularTables
def finish (H : PreprocessingTables.BaseTable) (d : Nat) (input : PortTables.Input d) :
PortTables.Input (2 * (d + internalDegree)) :=
PreprocessingStageMaps.lazy (d + internalDegree)
(PreprocessingStageMaps.paddedOverlay H d input)
noncomputable def computableInPolyTime (H : PreprocessingTables.BaseTable)
(d : Nat) (hd : 0 < d) :
TM2ComputableInPolyTime (PortTables.inputBits (ports := d))
(PortTables.inputBits (ports := 2 * (d + internalDegree))) (finish H d) := by
change TM2ComputableInPolyTime _ _
(fun input => PreprocessingStageMaps.lazy (d + internalDegree)
(PreprocessingStageMaps.paddedOverlay H d input))
exact MachineSequential.composeBits (MachinePaddedOverlayRuntime.computableInPolyTime H d hd)
(MachineLazyTableRuntime.computableInPolyTime (d + internalDegree)
(finish_degree_positive d hd))
end IndependentSetsGames.Foundations.PCP.PreprocessingFinishRuntime
namespace IndependentSetsGames.Foundations.PCP.PreprocessingRuntime
open Turing IndependentSetsGames.Foundations.Complexity
open PreprocessingRegularTables
noncomputable def tablePolynomialTime (H : PreprocessingTables.BaseTable) :
TM2ComputableInPolyTime GraphTables.tableBits
(PortTables.inputBits (ports := PreprocessingTables.degree))
(PreprocessingTables.output H) := by
change TM2ComputableInPolyTime GraphTables.tableBits
(PortTables.inputBits (ports := 2 * ((internalDegree + 1) + internalDegree)))
(fun t => PreprocessingFinishRuntime.finish H (internalDegree + 1)
(PreprocessingStageMaps.regular H t))
exact MachineSequential.composeBits
(MachineRegularTableRuntime.computableInPolyTime H)
(PreprocessingFinishRuntime.computableInPolyTime H (internalDegree + 1)
(Nat.succ_pos internalDegree))
end IndependentSetsGames.Foundations.PCP.PreprocessingRuntime
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Machines_PCPGapMachine
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace LargeIndependentSets.PCPGapMachine
open IndependentSetsGames.Foundations
open Complexity PCP
noncomputable def round (H : RoundTables.BaseTable) :=
RoundComputation.tablePolynomialTime H (PreprocessingRuntime.tablePolynomialTime H)
noncomputable def certificate (H : RoundTables.BaseTable) :
Turing.TM2ComputableInPolyTime Complexity.formulaBits Complexity.formulaBits
(TableIteration.gapMap H) :=
MachineTableIteration.gapMapCertificate H (round H)
end LargeIndependentSets.PCPGapMachine
namespace LargeIndependentSets.BinaryNormalize
open BinarySyntax BinaryNames
open IndependentSetsGames.Foundations
open IndependentSetsCut.CounterMachine
open scoped BigOperators
lemma encodeWords_flatMap (xs : List ℕ) :
Complexity.encodeWords xs=xs.flatMap (fun v => List.replicate v true++[false]) := by
induction xs with
| nil => rfl
| cons v xs ih => simp [Complexity.encodeWords,Complexity.encodeWord,ih]
lemma tableWords_spec (s : List Bool) :
UnaryTables.words (tableValue s) (tableCount s) = Complexity.formulaBits (normalize s) := by
rw [UnaryTables.words,tableValue_spec,Complexity.formulaBits,encodeWords_flatMap]
lemma serializer_spec (s : List Bool) :
UnaryTables.words (fun w => valueExpr.eval (annotated s).bits (fun _ => w))
(countExpr.eval (annotated s).bits (fun _ => 0))=Complexity.formulaBits (normalize s) := by
rw [countExpr_eval,← tableWords_spec]
exact UnaryTables.words_congr (valueExpr_eval s)
noncomputable def serializer : Turing.TM2ComputableInPolyTime
(fun s => (annotated s).bits) Complexity.formulaBits normalize :=
UnaryTables.encodedComputer _ _ _ countExpr valueExpr serializer_spec
noncomputable def certificate : Turing.TM2ComputableInPolyTime
(id : List Bool → List Bool) Complexity.formulaBits normalize :=
Complexity.MachineSequential.composeBits annotator serializer
noncomputable def gapCertificate (H : PCP.RoundTables.BaseTable) :
Turing.TM2ComputableInPolyTime (id : List Bool → List Bool) Complexity.formulaBits
(fun s => PCP.TableIteration.gapMap H (normalize s)) :=
Complexity.MachineSequential.composeBits certificate (PCPGapMachine.certificate H)
end LargeIndependentSets.BinaryNormalize
end OAI
end
section
-- module Solutions.OAIQ069_INDEP.IndependentSets_Main
set_option linter.all false
set_option linter.unusedVariables false
set_option linter.unusedTactic false
set_option linter.unreachableTactic false
namespace OAI
namespace LargeIndependentSets
open IndependentSetsGames.Foundations
open scoped Classical
noncomputable section
namespace CompleteReduction
open PCP Hastad.SourceContexts Hastad.SourceGame
open Complexity
def gapView (H : RoundTables.BaseTable) :
Turing.TM2ComputableInPolyTime (id : List Bool → List Bool)
(fun F : TargetLC.Input => Complexity.formulaBits F.val) (gapInput H) where
tm := (BinaryNormalize.gapCertificate H).tm
inputAlphabet := (BinaryNormalize.gapCertificate H).inputAlphabet
outputAlphabet := (BinaryNormalize.gapCertificate H).outputAlphabet
time := (BinaryNormalize.gapCertificate H).time
outputsFun := (BinaryNormalize.gapCertificate H).outputsFun
def lcComputer (H : RoundTables.BaseTable) (u : ℕ) :
Turing.TM2ComputableInPolyTime (id : List Bool → List Bool) UniformLC.Table.bits
(fun b => TargetLC.table u (gapInput H b)) :=
MachineSequential.composeBits (gapView H) (TargetLC.certificate u)
def certificate (H : RoundTables.BaseTable) (p : SamplerParameters) (u q : ℕ) (hq : 0<q) :
Turing.TM2ComputableInPolyTime (id : List Bool → List Bool) graphBits (reduce H p u q hq) :=
MachineSequential.composeBits (f := fun b => TargetLC.table u (gapInput H b))
(g := GeometryNames.output (J u) (I u) p q hq)
(lcComputer H u) (GeometryNames.graphComputer (J u) (I u) p q hq)
end CompleteReduction
end
end LargeIndependentSets
end OAI
end