The bit-level logic is inside LOGSPACE #
DescriptiveComplexity.BitDefinable.mem_LOGSPACE: every problem defined by a
prenex sentence over ≤, + and the bit at an index – hence, by
DescriptiveComplexity.ltDecidable_iff_bitDefinable, every problem decided by an
alternating machine with a logarithmic clock – is decided by a deterministic
multi-head automaton, so it is in LOGSPACE.
This is the fence the index naming cost, restored without either half of
Immerman's mutual definability: nothing here goes through FO(≤, +, ×), so this
route is independent of DescriptiveComplexity.powArithDef.
Why it is short #
The bit logic is prenex, so there is no formula induction to redo: the
evaluator is a recursion over DescriptiveComplexity.BitKernel, whose five
constructors become branches (DescriptiveComplexity.HeadProgram.iteP), and a
quantifier prefix, whose variables become sweeps
(DescriptiveComplexity.HeadProgram.scanP for a universal register, its negation
for an existential). The prefix peels its innermost variable first, which is
exactly how a sweep wraps a body, so the induction matches the semantics step for
step and the property a prefix decides depends on no head at all.
Only the atoms have content, and all of it is elsewhere: ≤ and an input
relation are quantifier-free guards, + is
DescriptiveComplexity.HeadProgram.plusP, and the bit is
DescriptiveComplexity.HeadProgram.bitP – the halving loop of
DescriptiveComplexity.HeadBit.
The head budget #
2 * vars + 8: two heads per quantified variable, the register itself and the
sweep's marker, then the eight the bit fragment needs (its five working heads
and the addition's three). Where an arithmetic evaluation pays seven scratch
heads (DescriptiveComplexity.HeadProgram.ArithScratch), a bit-level one pays
eight, and it never needs a multiplication.
Negating a fragment #
The negation of a fragment: run it and swap the exits.
Equations
Instances For
Dependency graph
Dependency graph
Dependency graph
The scratch layout of a bit-level evaluation #
The eight heads a bit-level atom needs, pinned to the eight positions from
S on: the bit fragment's five working heads, then the addition's three. S is
the top of the quantifier region, so every level the evaluator reaches is at
most S.
The working value sits at
S.The round counter sits at
S + 1.The scan's candidate sits at
S + 2.The candidate's successor sits at
S + 3.The scan's marker sits at
S + 4.The addition's running head sits at
S + 5.The addition's counter sits at
S + 6.The addition's marker sits at
S + 7.
Instances For
Dependency graph
The layout gives the bit fragment the head discipline it asks for, at any level the evaluator can reach.
Dependency graph
The layout gives an addition the head discipline it asks for.
Dependency graph
The atoms #
An input relation symbol, in the ordered expansion of its vocabulary. Named,
as every symbol of a sum vocabulary in this library is, so that rw matches
it.
Equations
Instances For
Dependency graph
A bit-level atom, as a program: the order and an input relation are read
as guards, the addition and the bit are computed, by plusP and by the halving
loop bitP.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.HeadProgram.bitAtomP y cnt cand w tmk a b mk hv (DescriptiveComplexity.BitAtom.le u v) = DescriptiveComplexity.HeadProgram.leafP (DescriptiveComplexity.leF (hv u) (hv v)) ⋯
- DescriptiveComplexity.HeadProgram.bitAtomP y cnt cand w tmk a b mk hv (DescriptiveComplexity.BitAtom.plus u v z) = DescriptiveComplexity.HeadProgram.plusP (hv u) (hv v) (hv z) a b mk
- DescriptiveComplexity.HeadProgram.bitAtomP y cnt cand w tmk a b mk hv (DescriptiveComplexity.BitAtom.bit u v) = DescriptiveComplexity.HeadProgram.bitP (hv u) (hv v) y cnt cand w tmk a b mk
Instances For
Dependency graph
The quantifier-free kernel, as a program: the Boolean structure becomes branches.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.HeadProgram.bitKernelP y cnt cand w tmk a b mk hv (DescriptiveComplexity.BitKernel.atom at') = DescriptiveComplexity.HeadProgram.bitAtomP y cnt cand w tmk a b mk hv at'
- DescriptiveComplexity.HeadProgram.bitKernelP y cnt cand w tmk a b mk hv DescriptiveComplexity.BitKernel.tt = DescriptiveComplexity.HeadProgram.exitP true
- DescriptiveComplexity.HeadProgram.bitKernelP y cnt cand w tmk a b mk hv k.not = (DescriptiveComplexity.HeadProgram.bitKernelP y cnt cand w tmk a b mk hv k).notP
Instances For
Dependency graph
A quantified register, as a sweep: universally the sweep itself, and existentially its double negation.
Equations
- DescriptiveComplexity.HeadProgram.quantP pol h hm F = if pol = true then (DescriptiveComplexity.HeadProgram.scanP h hm F.notP).notP else DescriptiveComplexity.HeadProgram.scanP h hm F
Instances For
Dependency graph
The quantifier prefix, as nested sweeps: the innermost variable wraps the
body first, which is how DescriptiveComplexity.prefixHolds peels it. Variable
j lives in head sh (2 * j), its sweep's marker in sh (2 * j + 1).
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.HeadProgram.prefixP sh 0 x_3 x✝ = x✝
Instances For
Dependency graph
Correctness #
A property read off a fixed tuple of heads only sees those heads.
Dependency graph
An atom is decided: as a guard where it is the order or an input relation, by a fragment where it is the addition or the bit.
Dependency graph
A kernel is decided, by recursion on its Boolean structure.
Dependency graph
A quantified register is decided: universally by the sweep, existentially by its double negation.
Dependency graph
Reading a valuation off the registers, one variable per even head.
Dependency graph
The prefix is decided: nested sweeps, one per variable, innermost first – and what they decide depends on no head at all, the prefix binding every variable.
Dependency graph
Determinism #
Dependency graph
Dependency graph
Dependency graph
Dependency graph
The inclusion #
The bit-level logic is inside FO(DTC): a prenex sentence over ≤, +
and the bit at an index is evaluated by a deterministic multi-head automaton –
the registers swept, the order and the input atoms read as guards, the addition
and the bit computed by DescriptiveComplexity.HeadProgram.plusP and
DescriptiveComplexity.HeadProgram.bitP.
The machine has 2 * vars + 8 heads: two per quantified register, then the
eight the bit fragment needs.
Dependency graph
The bit-level logic is inside LOGSPACE, and with it the machine model of
DescriptiveComplexity.LogTime. No part of Immerman's mutual definability is
used: the route through AC⁰ (DescriptiveComplexity.powArithDef, then
DescriptiveComplexity.ac0Definable_mem_LOGSPACE) is a different one, and
longer.
Dependency graph
Constant-alternation logarithmic time is inside LOGSPACE, through the logic it is equal to.