The file a clocked program lays out #
A space-bounded program gives every element of its universe a register
(DescriptiveComplexity.segFile), and laying that file out costs one sweep of
it. A program on a clock cannot pay that: a rule sees the control and the cell
under the head and nothing else, so the only stretches it can walk are a fixed
number of tuple roll-overs long, and the universe is |Tag| of those with
|Tag| the program's own rule count.
What it can afford is one register per block and tuple, which is also all
that a register's contents ever depend on: the block one-hot goes through
DescriptiveComplexity.Draw.tagBlk alone and the name slots are the tuple, so
nothing of a tag beyond its block is ever read back
(DescriptiveComplexity.Draw.Data.ixBack). This file is that file:
DescriptiveComplexity.blkFile, one register per
DescriptiveComplexity.Wide.BlkIx, laid out on a stretch of consecutive
addresses in the block-major order DescriptiveComplexity.Wide.blkLe.
Everything it needs is already general – the interface
(DescriptiveComplexity.IxFile), the walks over it, the construction on a
stretch (DescriptiveComplexity.ixSegFile) and the background
(DescriptiveComplexity.Draw.Data.ixBack) – so all that is added here is the
instantiation and the two numbers a caller has to check: how many registers
there are, and that the stretch fits.
The file a clocked program lays out: one register per block and tuple,
on the stretch of consecutive addresses whose ranks start at base.
Equations
- DescriptiveComplexity.blkFile A K U dd h hpos hbase = DescriptiveComplexity.ixSegFile (DescriptiveComplexity.Wide.blkLe K A dd) h ⋯ hpos hbase
Instances For
Dependency graph
How many registers the file has: one per block, one more for the blockless ones, times the tuples. This is the number the stretch has to fit, and the number of tuple roll-overs the laying sweep runs for.
Dependency graph
Walking the file: the pointer's advance and its two ends #
The sweep that lays the file out carries the register it is at in the machine's
control, and a rule advances it: dstSt is a function of the control, so the
next register has to be a function of the current one, not merely to exist.
These three are that function and the two ends its walk runs between; nothing
here is computed – a rule's fields are semantic – so the choice off
DescriptiveComplexity.exists_ixSucc is the definition, and its
characterization is what a caller discharges the walk with.
The next register: the successor of an index in the layout order, and the index itself at the top of it.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The first register: least in the layout order, where the laying sweep's pointer starts.
Equations
- DescriptiveComplexity.blkBot A K dd = ⋯.choose
Instances For
Dependency graph
The last register: greatest in the layout order, where it stops.
Equations
- DescriptiveComplexity.blkTop A K dd = ⋯.choose
Instances For
Dependency graph
The last tuple: greatest in the tuples' own lexicographic order. A pointer holding it is at the last register of its block, which is what a roll-over's guard reads.
Equations
- DescriptiveComplexity.tupTop A dd = ⋯.choose
Instances For
Dependency graph
The next block: the block of the register after the last of this one. A destination phase is a constant, so a roll-over rule needs the next block as a function of the current one alone, and this is it.
Equations
- DescriptiveComplexity.blkNextB A K dd b = (DescriptiveComplexity.blkNext A K dd (b, DescriptiveComplexity.tupTop A dd)).1
Instances For
Dependency graph
The stretch fits #
The one arithmetic fact a caller of DescriptiveComplexity.blkFile owes: the
file has fewer registers than the universe has elements – a block and a tuple
is an element of the universe, the blockless register taking the alphabet tag
– and the addresses are 2 ^ that, so a stretch based at 1 always fits.
The blockless register and each block, as tags: the alphabet tag stands for the blockless one.
Equations
Instances For
Dependency graph
Dependency graph
The address a clocked file's marks stand for #
A mark on the file is an address of the tape (DescriptiveComplexity.ixAddr),
and the correspondence is what lets a program hold an address it cannot see –
the one under its head – on registers it can. It is only used on the argument
registers, and the two conditions of DescriptiveComplexity.wmIncr_ixAddr hold
of exactly those: the argument tags are the greatest ones
(DescriptiveComplexity.Draw.lt_arg), so nothing the file has no register for
lies above an argument element, and the block order was chosen to make
DescriptiveComplexity.blkTag monotone.
The element a register holds the bit of.
Equations
- DescriptiveComplexity.blkIxElt R P dd u = (DescriptiveComplexity.blkTag R P K u.1, u.2)
Instances For
Dependency graph
The registers an address uses: the argument blocks, the blockless ones standing for the alphabet tag and never entering a logical address.
Equations
- DescriptiveComplexity.BlkIxUse A K dd u = ∃ (k : K), u.1 = some k
Instances For
Dependency graph
The register order is the element order, strictly.
Dependency graph
Nothing without a register lies above an argument element: the argument tags come last, so the elements the file names are upward closed and the addresses over them are an initial interval of the tape.