What the control carries: contributions, not fold values #
A design correction, found by writing the update rule down. The sweep's
control cannot carry the fold values DescriptiveComplexity.foldFrom j v:
at a step whose carry is c, the new value at a level j < c is the level's
own contribution combined with the deeper value – and the contribution is not
recoverable from the two old values (x = C ∨ y does not determine C). What
is closed under the update is the family of contributions themselves:
DescriptiveComplexity.Draw.accCVal j v– the completed-subtree contribution at levelj: the disjunction (existential polarity) or conjunction (universal) over the values strictly below the current coordinate;DescriptiveComplexity.Draw.foldFrom_eq_accCVal– the fold value at a level is the contribution combined with the deeper fold value, so any fold value is a finite Boolean chain of the contributions and the current leaf (DescriptiveComplexity.foldFrom_last), which a rule's guard can spell out;- the three update rules along an increment with carry
c:DescriptiveComplexity.Draw.accCVal_congr_above(levels before the carry are untouched),DescriptiveComplexity.Draw.accCVal_carry(the carry level absorbs the completed subtree, which is the deeper chain at the old valuation), andDescriptiveComplexity.Draw.accCVal_reset(levels after the carry reset to the polarity's unit).
So the machine's payload holds one bit per level – the contribution – plus the last leaf, and every verdict it ever needs is a chain of those bits.
The completed-subtree contribution at a level: what the enumeration has finished below the current coordinate – a disjunction of subtrees under an existential polarity, a conjunction under a universal one. Past the last level it is the polarity's unit.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The fold value is the contribution combined with the deeper value –
DescriptiveComplexity.foldFrom_ex / foldFrom_all read through the
contribution. Iterated down to DescriptiveComplexity.foldFrom_last, any fold
value is a finite Boolean chain of the contributions and the leaf.
Dependency graph
The three update rules along an increment #
Levels before the carry are untouched: their coordinate and everything above it agree across the step.
Dependency graph
Levels after the carry reset to the polarity's unit: nothing lies strictly below a minimal coordinate.
Dependency graph
The carry level absorbs the completed subtree: the new contribution is the old one together with the deeper fold value at the old valuation – which the machine has as a chain of its stored bits and the old leaf.
Dependency graph
The vector the control carries, and its update #
What the machine holds is one bit per level – the contribution – plus the
value of the last leaf. Two operations turn that into everything it needs: a
fold value is the chain of the stored bits from a level down, closed by the
leaf (DescriptiveComplexity.Draw.chainFrom, correct by
chainFrom_iff_foldFrom), and one round of the enumeration rewrites the
vector by the three rules above (accCVal_step: untouched before the carry,
absorbing at it, reset after it). A rule's dstSt spells out the first and
its guard the second; nothing else about the fold ever reaches the
program.
The chain, with an explicit fuel so that the recursion is structural.
Equations
- One or more equations did not get rendered due to their size.
- DescriptiveComplexity.Draw.chainAux pol acc leaf n 0 x✝ = leaf
Instances For
Dependency graph
A fold value as the machine holds it: the chain of the stored contributions from a level down, closed by the last leaf.
Equations
- DescriptiveComplexity.Draw.chainFrom pol acc leaf n j = DescriptiveComplexity.Draw.chainAux pol acc leaf n (n - j) j