What the spine does to the tape, at an arbitrary file #
DescriptiveComplexity.Problems.Wide.DrawSpineSem read at a coarse file: what a
whole spine leaves on the tape at one address, the sweep's fold over the
addresses, and the semantic packs the positions are run with.
One position's write #
The spine's writes #
The only thing the new tracks need of a position: its own cell at
the marker holds its verdict and every other cell rides. Weaker than the
cover equation hst, and weaker on purpose – a branched position's leg
is not literally a
DescriptiveComplexity.Draw.Data.ixPostVarSt of the position's entry
state (its VAL loop may normalize the two scratch registers first), while
this projection of it is
(DescriptiveComplexity.Draw.Data.ixLegStB_new).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
Anything a position's write leaves alone rides the whole spine: the
induction along the positions, once, for every field but val and new.
Dependency graph
The working address rides the spine.
Dependency graph
Off the marker, the new tracks ride the spine: a position writes
its own cell only.
Dependency graph
At the marker, a variable's new cell is the verdict of its own
position: it is written there, and no later position writes it, the
enumeration being duplicate-free.
Dependency graph
At an address every position rejects, the marker's new cells are
all clear – the junk legs
(DescriptiveComplexity.Draw.Data.ixVarLegFail_reachesIn,
DescriptiveComplexity.Draw.Data.ixVarLegUngated_reachesIn) store False, which
is what the stage dictionary holds at an address that encodes no tuple.
Dependency graph
The spine's semantic reading #
After the spine, one variable's new cell holds its own step of the
iteration – the per-position form: only the position of that variable, its
pack and its verdict are named, so an address where other positions are
junk is covered too (which is what a sweep needs, the gates being per
variable).
Dependency graph
After the spine, every new track holds the next stage at the
address's points. The position of a variable writes its verdict, which
DescriptiveComplexity.Draw.Data.ixAccVerdict_next reads as
DescriptiveComplexity.StepDef.next; the mirror and the dictionary ride
the spine, so the semantic hypotheses need only be given at the entry
state.
Dependency graph
What a whole sweep leaves behind #
The address's cell, in dictionary form #
The semantic pack, transported along the spine #
The per-position families, built #
One node of the spine: the tape state, the proof that its mirror is
still the address's – which is what lets the next node build its pack –
and the control. The three have to be produced together: the pack a
position's leg needs is typed at that position's state, and is available
only because the mirror rode (ixSpineSem).
Equations
- One or more equations did not get rendered due to their size.
- dt.ixSpineNode F hinj hhasP heltP mV st₀ f₀ sem₀ tOf 0 = ⟨st₀, ⟨⋯, f₀⟩⟩
Instances For
Dependency graph
The tape family of the spine.
Equations
- dt.ixSpineStOf F hinj hhasP heltP mV st₀ f₀ sem₀ tOf k = (dt.ixSpineNode F hinj hhasP heltP mV st₀ f₀ sem₀ tOf ↑k).fst
Instances For
Dependency graph
The per-position families, threaded #
One node of the spine, threaded: as
DescriptiveComplexity.Draw.Data.ixSpineNode, with the leg's own exit
state – SAV and TARGET as its VAL loop left them – instead of the
normalized one. The mirror still rides, which is what makes the next
position's pack exist.
Equations
- One or more equations did not get rendered due to their size.
- dt.ixSpineNodeT F hinj hhasP heltP mV st₀ f₀ sem₀ tOf 0 = ⟨st₀, ⟨⋯, f₀⟩⟩
Instances For
Dependency graph
The threaded tape family of the spine.
Equations
- dt.ixSpineStOfT F hinj hhasP heltP mV st₀ f₀ sem₀ tOf k = (dt.ixSpineNodeT F hinj hhasP heltP mV st₀ f₀ sem₀ tOf ↑k).fst
Instances For
Dependency graph
The mirror rides the threaded family too – by construction.
Dependency graph
The per-position families, branched #
The threaded family above runs the gated leg at every position, which a
sweep cannot afford: it visits junk addresses too. The branched family
takes whichever of the three legs each position's own gates call for
(DescriptiveComplexity.Draw.Data.ixLegStB), and is otherwise the same
recursion – the mirror still rides, because no leg writes it.
Its semantic parameter is not the entry state's pack transported: it is
the conditioned family DescriptiveComplexity.Draw.Data.ixGatedSem
inhabits – a pack at every gated position of every state, at every address.
Conditioned, because at a junk position no pack exists (the argument blocks
encode nothing there); quantified over the address as well, because the sweep runs this spine at
v := w for an address w its own binders are fixed before. With that type the
parameter is supplied outright at the top – fun w => dt.ixGatedSem hzo hlin mV – and no semantic assumption about a position survives in the run
layer.
One node of the spine, branched.
Equations
- One or more equations did not get rendered due to their size.
- dt.ixSpineNodeB F hinj hhasP heltP mV st₀ f₀ semB 0 = ⟨st₀, ⟨⋯, f₀⟩⟩
Instances For
Dependency graph
The branched tape family of the spine.
Equations
- dt.ixSpineStOfB F hinj hhasP heltP mV st₀ f₀ semB k = (dt.ixSpineNodeB F hinj hhasP heltP mV st₀ f₀ semB ↑k).fst
Instances For
Dependency graph
The branched control family of the spine.
Equations
- dt.ixSpineFsOfB F hinj hhasP heltP mV st₀ f₀ semB k = (dt.ixSpineNodeB F hinj hhasP heltP mV st₀ f₀ semB ↑k).snd.snd
Instances For
Dependency graph
The mirror rides the branched family – by construction.
Dependency graph
The marker rides the branched family: no leg writes the working
register, so the hwkOf a spine asks for is the entry state's.
Dependency graph
The bottom mark rides the branched family – the hbotOf a spine asks
for.
Dependency graph
The dictionary rides the branched family: no leg of the evaluation
writes the old tracks, so the stage the spine reads at its last checkpoint is
the stage it was entered with. This is what lets a guessing program discharge
the output's hdict: what its guess wrote is what the verdict is read
against.
Dependency graph
The packs of the branched family: the parameter's own, at the position's state – the gate being what makes them exist.
Equations
- dt.ixSpineSemOfB F hinj hhasP heltP mV st₀ f₀ semB j hg p a hp b = semB v j (dt.ixSpineStOfB F hinj hhasP heltP mV st₀ f₀ semB j.castSucc) hg p a hp b
Instances For
Dependency graph
The branched control's cover equation –
DescriptiveComplexity.Draw.Data.nexIxSpineB_reachesIn's hfs.
Dependency graph
The branched tape's cover equation –
DescriptiveComplexity.Draw.Data.nexIxSpineB_reachesIn's hst.
Dependency graph
The branched spine's dictionary at one address #
Gating is per variable, and so is the reading: at an address whose blocks
below a variable's arity all encode points, that variable's cell holds one
step of the iteration there; where one of them does not, the position takes
an ungated leg, writes False, and the dictionary is False too. Nothing
is assumed of the other variables' blocks – which is what a sweep needs,
since it passes every address.
The verdict the output's leg leaves is the output sentence, at the
stage the tracks hold. The output variable is nullary, so its blocks encode
the empty tuple and there is nothing to ask of them – which is why this is the
one verdict a program can take at the address its head starts on. This is the
hacc a run through the output's machinery
(DescriptiveComplexity.Draw.Data.nexIxEvalOutB_reachesIn) asks for, and the
reason the accepting bit says anything at all.
Dependency graph
The sweep's families, over an arbitrary per-address leg #
Everything the sweep's families need of an address's evaluation is what
state and control it ends in. Taking those two as parameters makes the
whole layer – the iteration, its two cover equations, and the ride lemmas
that discharge reaches_sweep's hwkE/hmirE/hltpE – serve any
evaluation: the spine as first built, its threaded twin, and the branched
form a junk address will need.
The pair the sweep arrives at each address with: the base at the
empty address, and at every increment the previous address's evaluation
exit – its marker moved on and its mirror set to the new address, exactly
the shape DescriptiveComplexity.Draw.Data.reaches_sweep demands.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The sweep's tape family – reaches_sweep's SW.
Equations
- dt.ixSweepSWG stE fsE hlin st₀ f₀ w = (dt.ixSweepPairG stE fsE hlin st₀ f₀ w).1
Instances For
Dependency graph
The sweep's control family – reaches_sweep's FS.
Equations
- dt.ixSweepFSG stE fsE hlin st₀ f₀ w = (dt.ixSweepPairG stE fsE hlin st₀ f₀ w).2
Instances For
Dependency graph
The state the sweep leaves each address in – reaches_sweep's
stE.
Equations
- dt.ixSweepStEG stE fsE hlin st₀ f₀ w = stE w (dt.ixSweepSWG stE fsE hlin st₀ f₀ w) (dt.ixSweepFSG stE fsE hlin st₀ f₀ w)
Instances For
Dependency graph
Dependency graph
The tape's cover equation – reaches_sweep's hSW, verbatim.
Dependency graph
The sweep's families #
The stage atom's restore, as an algebra #
DescriptiveComplexity.Draw.Data.stageEndSt st v = { st with sav := v, tgt := v }: the random access writes the home address into SAV and
TARGET whatever they held, so a stage atom is transparent exactly when they
held it already – which is what ixStageEndSt_eq's two hypotheses say, and
why they are not a proof artifact.
Closing the sweep's gap by “reading the mirror” therefore means threading
that normalization rather than assuming it away: an atom's exit state is
ixStageEndSt st v, and the layers above carry it. These are the equations
that threading needs; they are all definitional, which is what makes the
propagation mechanical.