The argument blocks, concretely: outer arguments first, inner variables last #
The EXPSPACE program keeps two families of argument blocks
(DescriptiveComplexity.Draw.Tag's K): the outer
ones hold the arguments of the fixed-point variable at the working cell, the
inner ones hold the valuations of the step formula's quantifier prefix,
enumerated by the VAL register. This file fixes K := Fin ko ⊕ₗ Fin ki and
proves the two facts the choice was made for:
DescriptiveComplexity.Draw.kinSeg– the inner tags are an order embedding onto a final segment of the whole tag order, which is what hands the inner loop its fold rules (DescriptiveComplexity.Draw.exists_carry_ixand its consequences inDescriptiveComplexity.Problems.Wide.DrawInner);- the stage dictionary –
DescriptiveComplexity.Draw.trackOf, the content of a stage track at an address: the stage of the fixed-point variable at the decoded outer blocks when they decode,Falsewhen they do not. It reads only the blocks below the variable's arity (DescriptiveComplexity.Draw.trackOf_of_blocks), so a track may be read at any address with the right prefix – no canonical address, no gating – and the all-blank initial tape is exactly stage0(DescriptiveComplexity.Draw.trackOf_botAssign).
DescriptiveComplexity.Draw.outAddr builds the address a family of outer blocks
is, with every other block empty; it is what the working cell of the sweep
holds, and its non-argument blocks being empty is what puts it in the logical
interval (DescriptiveComplexity.Draw.wmSetLe_logicalTop).
The two families of argument tags #
An outer argument tag: one block per argument of the fixed-point variable.
Equations
Instances For
Dependency graph
An inner argument tag: one block per variable of the quantifier prefix.
Equations
Instances For
Dependency graph
Dependency graph
The strict tag order through the key.
Dependency graph
Argument tags compare by their block index.
Dependency graph
The inner tags are a final segment of the tag order: strictly monotone, and everything strictly above an inner tag is an inner tag – the non-argument tags and the outer arguments all come first. This is the hypothesis pack of the inner loop's fold rules.
Dependency graph
The address a family of outer blocks is #
The address holding given outer blocks and nothing else: what the working cell of the sweep is, its inner and non-argument blocks empty.
Equations
- DescriptiveComplexity.Draw.outAddr V u = ∃ (k : Fin ko), u.1 = DescriptiveComplexity.Draw.argOut ki k ∧ V k u.2
Instances For
Dependency graph
The outer blocks of outAddr are the given family.
Dependency graph
An address that marks outer argument blocks alone is outAddr of its
blocks. This is the uniqueness that turns a reading of the blocks into a
reading of the address, and with it a set of marked addresses into a stage.
Dependency graph
The non-argument blocks of outAddr are empty, which is what puts the
working cell in the logical interval.
Dependency graph
The stage dictionary #
The content of a stage track at an address: the stage of the variable at
the decoded outer blocks when the blocks below its arity decode to points,
False when they do not. Only those blocks are read, so the track may be read
at any address with the right prefix, and the all-blank initial tape is exactly
stage 0.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The dictionary reads back: at an address whose relevant blocks encode a tuple, the track holds the stage at that tuple.
Dependency graph
A track is empty at an address that encodes no tuple: one block below the variable's arity holding no point is enough, whatever the stage. This is what the junk addresses of a sweep write, and it is why a program may leave them alone.
Dependency graph
A track marks no empty address: a variable of positive arity has a block below its arity encoding a point, and an encoding always holds its tag's own tuple, so an address the track marks has an element in that block. This is what puts a dictionary entry inside a clocked program's guessed stretch, whose bottom is the file's first register and not the empty address.
Dependency graph
The address of a tuple of points: its outer blocks are the tuple's encodings, everything else empty – where the dictionary of a variable at that tuple is read.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
Its blocks below the variable's arity are the tuple's encodings.
Dependency graph
An address whose blocks below the arity are the encodings, and which
marks nothing else, is the tuple's address. The addresses a stage atom
builds are of that kind – written block by block from named registers – so the
dictionary a backward reading needs is asked exactly where
trackOf_assignOfTrack answers it.
Dependency graph
The assignment a track carries: a tuple is in the relation exactly when
the address that names it is marked. This is the inverse the forward direction
never needs – it writes trackOf of an assignment – and the one a backward
reading is built on.
Equations
- DescriptiveComplexity.Draw.assignOfTrack ly zero one ha T i x = T i (DescriptiveComplexity.Draw.tupAddr ly zero one ⋯ x)
Instances For
Dependency graph
And it reads back: at the address a tuple names, the track of the assignment a track carries is that track. So a run that left an arbitrary set of addresses marked has left the stage of a definite assignment, as far as the evaluation ever looks.
Dependency graph
A tuple's address lies in the logical interval: its non-argument
blocks are empty, which is exactly wmSetLe_logicalTop's hypothesis. What is
not automatic is that it lies strictly below the top – the reduction owes
that where it plants the end marker.
Dependency graph
A tuple's address is strictly below the logical top: the top's blocks
are full, and an encoding is not (not_encPt_zeroTup). One position of the
tuple is enough; at a nullary variable the address is the empty one, which is
strictly below any nonempty top.
Dependency graph
A padded address of argument cells alone is strictly below the logical
top: it is at or below it because its non-argument blocks are empty
(wmSetLe_logicalTop), and it is not the top itself because the top's blocks
are full – they hold the cells whose coordinates beyond the payload are not
zero, and a padded address holds none of those. This is what an address a
program builds out of padded cells (rather than reads from a register) has
to offer, and it needs one coordinate of slack (c < dd) and one argument
block to name (i) – the same nonemptiness the interval is given anyway.
Dependency graph
A tuple's address is strictly below the logical top, at every arity:
wmSetLt_tupAddr_logicalTop at a variable of arity ≥ 1, and at a nullary
one the address is the empty one, which is strictly below any nonempty top –
so what the nullary case asks for is an argument block to name, the same
nonemptiness of the interval the run layer is given anyway. This is the form
assignment_ext_of_trackOf's hS is discharged in.
Dependency graph
The dictionary determines the stage: two assignments whose tracks agree
at every address of a family that carries every tuple's own address are equal.
This is what turns the machine's convergence test – the tracks of one stage and
the next agreeing over the logical interval – back into «the stages are
equal», which is what hnotconv needs.
Dependency graph
The empty stage writes an empty track: at the bottom assignment nothing
holds, whatever the address – the all-blank initial tape is stage 0.