An address, read block by block #
A reduction into a wide machine chooses the order wmLe of the instance it
draws, and the whole design of the sweep depends on choosing it block-major:
the universe of the instance is a product T × V – a block index and a
coordinate – ordered by DescriptiveComplexity.lexRel, so that an address is a
family of blocks, one per index (DescriptiveComplexity.wmBlk). One block per
variable of the kernel, one for the scratch, and the sweep's two structural facts
become theorems about this decomposition:
- the address order is lexicographic on blocks
(
DescriptiveComplexity.wmSetLt_lexRel_iff): two addresses compare at the least index where their blocks differ. So the addresses agreeing on a prefix of the blocks form a contiguous stretch of the tape, which is what lets a guessed relation of arity smaller than the number of variables be kept consistent by one state bit rather than by comparing distant cells; - the increment carries block by block
(
DescriptiveComplexity.wmIncr_lexRel_iff): there is a last index whose block is not full, that block increments, every later block is emptied and every earlier one is untouched. That is the roll-over information the sweep folds its accumulators by – “which variables have just been requantified” – and it is what a machine computes when it increments the mirror of its own head position.
A third fact comes from the same reading and is what a program on a clock lives on:
- the addresses avoiding a set of blocks are an initial stretch
(
DescriptiveComplexity.wmAvoids_of_wmSetLe), provided the set is closed downwards in the index order – the smallest index being the most significant digit. So a program that keeps its data in the least significant blocks and leaves the others empty never leaves a segment of the tape at the bottom, and the surplus blocks multiply its clock while costing it nothing.
All of them are stated at arbitrary linear order relations on T and on V, so
they apply to whatever key a reduction chooses;
DescriptiveComplexity.isLinOrd_lexRel supplies the linearity of the product.
The blocks of an address #
The block of an address at an index: the coordinates the address holds there.
Equations
- DescriptiveComplexity.wmBlk s τ v = s (τ, v)
Instances For
Dependency graph
Dependency graph
The strict order of a block-major product: strictly earlier index, or the same index and a strictly earlier coordinate.
Dependency graph
Inside one block, the order of the product is the order of the block.
Dependency graph
Two coordinates of the same block name the same element exactly when they are equal.
Dependency graph
The address order is lexicographic on blocks: two addresses compare at the least index where their blocks differ, and there by the order of that block. So the addresses agreeing on a prefix of the blocks are consecutive.
Dependency graph
The working region #
A program that keeps its data in the least significant blocks and leaves the others empty never leaves an initial stretch of the tape: the smallest block index is the most significant digit, so putting anything in a block a program avoids makes an address bigger than every address that avoids it. That is what buys a clocked program its budget – the surplus blocks multiply the clock and cost the program nothing – and what makes “the region” a segment rather than a scattered set.
An address avoids a set of block indices when its blocks there are empty.
Instances For
Dependency graph
The greatest address avoiding a set of blocks: full everywhere else.
Equations
- DescriptiveComplexity.wmAvoidTop H p = ¬H p.1
Instances For
Dependency graph
Every address avoiding a set of blocks is at or below its top.
Dependency graph
The region is an initial stretch of the tape: an address below one that avoids a downward-closed set of blocks avoids it too. So a sweep upwards stays in the region until it leaves it once and for all, and the program never has to say where it is.
Dependency graph
A product plus an opening fits the clock: a counted program's cost is not «rounds × width» alone – there is the opening before the evaluation and the odd step between phases – and an additive term of the region's own size still fits, at the price of one more surplus block than the product alone needs.
The arithmetic: a · b + s ≤ 2 ^ (2km) + 2 ^ (km) ≤ 2 ^ (2km + 1), and
2km + 1 < (k + j)m as soon as k + 1 < j.
Dependency graph
A product and an opening twice the region fit the clock: the same sum as
mul_add_lt_two_pow with the additive term allowed a whole extra factor of
2 ^ m – which is what an opening that sweeps the file and the region costs,
where the region is 2 ^ (k · m) and the sweep goes out and back. One working
block is enough for it (1 ≤ k), since the opening is then below the product
itself.
Dependency graph
The increment of an address carries block by block: at the last index whose block is not full, that block increments; every later block is emptied and every earlier one is left alone. The index is the carry index, and which blocks it empties is exactly the roll-over information the sweep folds by.