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 advance is the layout order's successor, wherever there is one.
Dependency graph
The advance stops at the top, which is what makes the sweep's last round recognizable without a second test.
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 first register is below every register.
Dependency graph
Every register is below the last.
Dependency graph
The advance stops exactly at the last register, so the walk's stop test
is the pointer reaching DescriptiveComplexity.blkTop.
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
Every tuple is below the last.
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
Within a block the advance stays in it: below the last tuple the next register is the same block's, so the stepping rule keeps its phase and only the roll-over changes it.
Dependency graph
The last register's tuple is the last tuple: the order is block-major, so the greatest index is the greatest tuple of the greatest block. This is what makes the sweep's stop test – the pointer holds the last tuple and the last register – fire at one place.
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
A block is below another exactly when its tag is: the block order was built for this, the blockless registers taking the alphabet tag, which the argument tags all sit above.
Dependency graph
The register order is the element order: the block order was built for it.
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.