What a rule may not write #
A forward run constructs the tape it walks: every lemma says the machine
reaches a configuration whose tape is a named function of a named tape state, so
nothing has to be said about what the rules leave alone. A backward reading
is handed an arbitrary run and has to recognize the tape, and there the missing
fact bites: a configuration's tape is of the form
DescriptiveComplexity.Draw.Data.ixBack of some tape state only because no
rule ever writes the slots the channel wrote – the register flag, the two ends,
the block one-hots, the name coordinates and the padding flag.
This file states that (Rule.KeepsFile) and proves it of the shapes a rule's
write can take: no write at all, an update of a slot that is not one of those,
and the guess's own write. With them the outer layer's rules keep the file, which
is what an opening's reading needs.
A run as a sequence #
A run of n steps is a sequence of n + 1 configurations. The
StepsIn form is an iterated existential, which is what a forward proof wants;
a backward reading has to speak of the configuration at each time, and that is
this.
Dependency graph
A stretch of a run, as reachability: from any time to any later one, the
steps compose. This is how a backward reading passes the rest of the run – from
the entry it found to the accepting configuration – to
DescriptiveComplexity.TMData.not_acc_of_reaches_dead_of_uniqueFrom.
Dependency graph
The slots the channel writes #
A slot of the register file: what the channel writes at time zero and no rule may touch – the register flag, the file's two ends, the block one-hots, the name coordinates and the padding flag. Everything else is a track: scratch the program owns.
Equations
- DescriptiveComplexity.Draw.Slot.reg.IsFile = True
- DescriptiveComplexity.Draw.Slot.regFirst.IsFile = True
- DescriptiveComplexity.Draw.Slot.regLast.IsFile = True
- (DescriptiveComplexity.Draw.Slot.blk a).IsFile = True
- (DescriptiveComplexity.Draw.Slot.name a).IsFile = True
- DescriptiveComplexity.Draw.Slot.pdd.IsFile = True
- x✝.IsFile = False
Instances For
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Dependency graph
Rules that keep the file #
A rule keeps the file: whatever it writes, the slots the channel wrote come out unchanged.
Equations
- DescriptiveComplexity.Draw.Rule.KeepsFile dt ρ = ∀ (f : Q → A) (g : dt.SlotIx → A) (s : dt.SlotIx), DescriptiveComplexity.Draw.Slot.IsFile s → ρ.wr f g s = g s
Instances For
Dependency graph
A rule writes bits: every slot it leaves is either untouched or one of
the two designated elements. This is what keeps a tape readable as an
DescriptiveComplexity.Draw.Data.ixBack, whose tracks are bitVals.
Equations
Instances For
Dependency graph
A rule leaves the addressed tracks alone: the mirror, the target, the
saved mirror and the valuation are read off the file's registers, so a tape
that carries them at an address which is nobody's register is not an
ixBack of anything. The opening never writes them.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
A rule leaves one slot alone. The semantic half of a backward reading is built from these: which slot each rule may touch, and hence what a track still holds after a stretch of the run.
Equations
- DescriptiveComplexity.Draw.Rule.KeepsSlot dt t ρ = ∀ (f : Q → A) (g : dt.SlotIx → A), ρ.wr f g t = g t
Instances For
Dependency graph
A rule sets a slot: whatever it reads, it leaves that slot holding the designated one. The start step does this to the marker and the bottom mark.
Equations
- DescriptiveComplexity.Draw.Rule.SetsSlot dt one t ρ = ∀ (f : Q → A) (g : dt.SlotIx → A), ρ.wr f g t = one
Instances For
Dependency graph
After a rule that sets a slot, that track marks the cell it was written
at – provided it was clear before, which at the channel's tape it is
(initBackReg_track_zero).
Dependency graph
The shapes the outer layer writes with #
The guess keeps the file: it writes the stage tracks and copies every other slot, the file's included.
Dependency graph
The outer layer keeps the file: at every site but the evaluation's, the
handed program's rules either write nothing, or write the marker and the bottom
mark (the start step), or write the guess's stage tracks – and none of those is a
slot the channel wrote. The evaluation's own sites are the parameter ruleE, and
a backward opening reading never reaches them.
Dependency graph
The guess's write is a bit at the stage tracks and a copy everywhere else.
Dependency graph
The guess leaves the addressed tracks alone.
Dependency graph
The outer layer writes bits: the start step writes one, the guess
writes a stage bit, and every other site of the opening writes nothing.
Dependency graph
The outer layer leaves the addressed tracks alone: the opening writes the marker, the bottom mark and the stage tracks, never the mirror, the target, the saved mirror or the valuation.
Dependency graph
Only the start step writes the marker and the bottom mark: every other site of the opening leaves both alone, so after the first step the working track marks the address the head started on and nothing else.
Dependency graph
Only the guess writes the stage tracks: every other site of the opening leaves them alone, so what the evaluation reads there is what the guess wrote.
Dependency graph
The start step sets the marker and the bottom mark.
Dependency graph
Reading a tape back as a tape state #
A tape of the right shape is an ixBack: the file's slots as the layout
has them, the four addressed tracks clear, every other track a bit – and the tape
state is read off the tape, bit by bit. This is what turns a recognized tape
into the object every run lemma is stated against.
Dependency graph
A tape the reading recognizes: every cell carries a slot vector, the file's slots are the layout's, the four addressed tracks are clear, and every other track is a bit.
- file (r : Univ A R' P' dt.KIx dt.dd → Prop) (s : Slot dt.d.B.ι dt.ko dt.ki dt.dd0) : s.IsFile → rest r s = dt.ixBack lay zero one ⋯ st₀ r s
The file's slots are the layout's.
- cells (r : Univ A R' P' dt.KIx dt.dd → Prop) (s : Slot dt.d.B.ι dt.ko dt.ki dt.dd0) : s = Slot.mir ∨ s = Slot.tgt ∨ s = Slot.sav ∨ s = Slot.val → rest r s = zero
The four tracks read at a register are clear.
- bits (r : Univ A R' P' dt.KIx dt.dd → Prop) (s : Slot dt.d.B.ι dt.ko dt.ki dt.dd0) : ¬s.IsFile → rest r s = zero ∨ rest r s = one
Every other track is a bit.
Instances For
Dependency graph
A rule that keeps the file, keeps the addressed tracks and writes bits keeps the shape. This is the step of the opening's reading: the cell under the head is the only one that changes, and the three facts say the change stays inside the shape.
Dependency graph
The marker track, read back.
Dependency graph
The bottom mark, read back.
Dependency graph
A tape whose mirror track is clear is its own pass tape: the run layer
writes its tapes as passTracksAt, which overwrites the walked track with the
mark the head carries; where the head carries no mark and the track is clear,
the two agree. This is the bridge from the shape a reading recovers to the
tape the run lemmas are stated over.
Dependency graph
One step of the machine, seen from the tape #
What a step does to the tape: it leaves every cell but the one under the
head, and there it writes what the fired rule's wr makes of the control's
payload and the cell's own tracks. Read backwards – from an arbitrary step to the
tape it produces – this is what a recognizing argument walks along, and it is the
converse of the run layer's Prog.step_* lemmas, which write the cell they
already know.
Dependency graph
The reading, along a run #
A configuration the reading recognizes: its tape carries a slot vector
at every cell, of the shape TapeShape describes.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
One step keeps the shape, when the rule that fires is one of the phases the caller vouches for. A step's transition carries its rule, and the state it fires from carries that rule's source phase, so vouching for the phases a run passes through is vouching for the rules it fires.
Dependency graph
A run keeps the shape, as long as the caller vouches for the phases it
passes through – all of them but the last, since it is the fired rules that
matter. This is the form an opening's reading uses: the phases before the
evaluation's entry are the outer layer's, and those are the rules
nexRule_keepsFile_of_ne_eval and its two siblings are about.
Dependency graph
The reading along a sequence: the configuration at each time is
recognized, as long as the phases up to that time are ones the caller vouches
for. This is shapedAt_of_reaches_of_phase in the form a backward reading
actually has its run in – time by time, so that «the phases before the entry»
is a statement about indices.
Dependency graph
A step that fires a rule keeping a slot leaves that track alone, at every address: at the head because the rule keeps it, elsewhere because a step writes nowhere else.
Dependency graph
After a step the head is on an address: a move lands on a position, and the positions of a wide machine are its addresses. The head of the initial configuration is one by construction, so along a run every head is – which is what a reading needs before it can speak of the cell under the head.
Dependency graph
A step, inverted: the rule that fired, the data it fired on, that its
guard held, and the two phases it went between. step_state_dst is its
destination half; a reading that has to know which rule fired – because the
guard of every other one is false – needs the guard too.
Dependency graph
A symbol determines its tracks: the payload is the packed track vector and the packing is injective, so two recognized tapes that are equal carry equal tracks. That is what lets a reading combine facts proved of different recognitions of the same run – the shape's, and the marker's.
Dependency graph
The state a step lands in is a rule's destination: which is how a reading learns that a phase no rule enters – the start phase – occurs at time zero and never again.
Dependency graph
A step that fires a rule setting a slot leaves that track marking the cell
it was written at – provided the track was clear before, which at the
channel's tape it is (initBackReg_track_zero). This is the one write of the
opening a backward reading has to read, rather than merely skip: the start
step's marker, which every later rule keeps (nexRule_keepsSlot_wk_bot).
Dependency graph
A track the opening never writes still holds what it held: the same
induction as the shape's, carried on one slot. Together with
nexRule_keepsSlot_wk_bot and nexRule_keepsSlot_old this is how a backward
reading learns what the tracks hold, not merely that they hold bits.
Dependency graph
The marker, along a run: the first step writes it at the cell the head
began on and every later step keeps it, so at any time after the first the track
marks that cell and nothing else. With ixBack_wk_inv this is «the working
track marks the address the machine started at», the first of the hypotheses the
evaluation's entry state is asked for.