The reachability search as a finite computation on codes #
⚠️ Unreviewed by Bolton
Complexitylib.Classes.Containments.Internal.BoundedReach reduces membership to a bounded
breadth-first search in the configuration graph, but the rounds there are Set (Cfg k tm.Q) —
a specification, not a computation. This file replays the same search on the codes of
Complexitylib.Classes.Containments.Internal.ConfigCount: a round is a Finset operation on a
finite type, so the whole search is a finite, decidable iteration.
The bridge is a decoder. cfgCode forgets nothing about a configuration that respects the space
window, so it has a left inverse there, and the successor of a code is simply the code of the
successor of the configuration it denotes.
For a log-space machine the code type has polynomially many elements, so a round set is a polynomially sized object and the search runs for polynomially many rounds — this is the data structure a polynomial-time implementation manipulates.
Main definitions #
decodeCfg— rebuild a configuration from its codeNTM.codeSucc,NTM.codeRound,NTM.reachCodes— the search, onFinsets of codes
Main results #
decodeCfg_cfgCode— decoding inverts coding inside the windowNTM.mem_reachCodes_iff— the code search computes exactly the specified roundsNTM.mem_iff_exists_mem_reachCodes— membership as a finite searchlogWindow_bigO— the concrete window is stillO(log n)NL_finite_search— forNL, a finite search whose window, round count, and accept test are all explicit arithmetic in the input length
Rebuild a configuration from its code. The input tape is restored from the input itself — it is read-only — and each work and output cell beyond the window is restored to the blank that the window invariant guarantees is there.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Decoding inverts coding on the configurations the search meets. Inside the space window
the clamps in cfgCode are inert and the cells it drops are the ones Windowed pins down, so
nothing is lost.
The search: t rounds of successor-closure starting from a single code.
Equations
- tm.reachCodes x S a₀ 0 = {a₀}
- tm.reachCodes x S a₀ t.succ = tm.codeRound x S (tm.reachCodes x S a₀ t)
Instances For
The code search computes exactly the specified rounds. Every code in round t is the
code of a configuration in round t, and conversely.
Membership is a finite search over codes. Every quantifier is over a finite type and
every operation is a Finset operation, so this is an algorithm — what remains for NL ⊆ P is
to bound its cost.
A language in NL is a finite search of polynomially many rounds. Every quantity in
this statement is an explicit arithmetic function of the input length and finitely many machine
constants: the window is logWindow C D |x|, the round count is A · (|x| + 1) ^ B, the rounds
are Finsets of codes over that window, and the accept test is a decidable property of a single
code. No trace, choice sequence, machine time bound, or asymptotic quantifier survives. This is
the specification a polynomial-time implementation has to run; what remains for NL ⊆ P is to
account for its cost.