A tiling of the emitted square is an accepting run #
The backward half of the hardness. A tiling is read row by row: the row of rank
k is the configuration at time k, and the whole argument is that each row
holds at most one head, and the row above it is the step that head takes.
Why a row holds at most one head #
A head in a row is either a head that halted below it, or one a neighbor sent: the vertical rule lets nothing else stand above a symbol. A neighbor that sends one is a head moving that way, by the horizontal rule, so the head of a row is determined by the head of the row below it and the transition that head fires – which is why a tile carries the transition and an arrival is a tile of its own.
The two edge columns are where this argument would otherwise fail, and why
DescriptiveComplexity.TileData.EdgeL and EdgeR are part of a tiling: an
arrival at the leftmost column is sent by nothing, so without a border condition
a head would appear there out of nowhere, carrying whatever state it liked.
What is read off a row #
The drawing is packaged as DescriptiveComplexity.TilingHard.TileRun – rows
numbered by the clock, columns the machine's addresses – so the coordinates of
the emitted square are translated once and the argument itself is a plain
induction on the row number.
A cell holding a head, halted or not: the two tags an accepting tile may carry, and the two a tiling never puts side by side.
Equations
Instances For
Dependency graph
The wide machine an instance describes, at a given input description:
the machine of DescriptiveComplexity.wideData with its tape described by the
given relation, which is the one thing the clocked machine and the
space-bounded one disagree on.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
A drawing of a run, read at the machine's own coordinates: the rows numbered by time, the columns the addresses of the machine, and every condition a tiling puts on them. The bottom row is stated as the machine's initial tape, so the same drawing serves whichever way that tape is described.
- rows : ℕ
The number of rows.
The tile in a column of a row.
Every cell carries a tile.
The corner carries the machine's start.
- first (s : A → Prop) : (s ≠ fun (x : A) => False) → TPNoHead (self.tl 0 s) ∧ (Inp (Sum.inl s) (Sum.inr (tpSym (self.tl 0 s))) ∨ (∀ (b : WPoint A), ¬Inp (Sum.inl s) b) ∧ WMBlank (tpSym (self.tl 0 s)))
Every other column of the bottom row holds no head, and holds what the machine's initial tape holds there.
The leftmost column carries no arrival from the left.
Nor the rightmost one an arrival from the right.
Neighbors in a row agree.
And one row becomes the next.
- accRow : ℕ
The row of the accepting cell.
- accCol : A → Prop
And its column.
The accepting cell is inside the square.
And it carries an accepting tile.
Instances For
Dependency graph
Neighboring columns #
Every column but the last has one to its right.
Dependency graph
And every column but the first one to its left, which is what justifies an arrival that is not at the edge.
Dependency graph
A column has one column to its left at most.
Dependency graph
What stands above a cell #
A cell holds a head or holds none.
Dependency graph
And not both.
Dependency graph
A cell that holds no head keeps its symbol, whatever stands above it.
Dependency graph
Nothing but a head or an arrival puts a head above it: above a symbol stands a cell with no head, and above a head the cell the head has left.
Dependency graph
The head of a row comes from the row below #
Where a head comes from: either it stood in the same column and halted, or the head of a neighboring column moved into it – and then that head's transition names the state it arrives in and the direction it came from.
Dependency graph
The bottom row holds one head, at the corner: the corner carries the machine's start, and every other column the initial tape, which holds none.
Dependency graph
And it is the only one.
Dependency graph
A row holds one head at most. A head is either one that halted below it or one a neighbor sent, and the neighbor that sends one is the head of the row below moving that way; so the head of a row is determined by the head of the row below and the transition it fires.
Dependency graph
A row with a head stands on one below it: nothing sends a head into a row whose own row below has none.
Dependency graph
The run a tiling draws #
The column the head of a row stands in, arbitrary in a row with no head.
Equations
- DescriptiveComplexity.TilingHard.headCol R k = if h : ∃ (s : A → Prop), DescriptiveComplexity.TilingHard.IsHeadTile (R.tl k s) then h.choose else fun (x : A) => False
Instances For
Dependency graph
A square has a row: the accepting cell stands in one.
Dependency graph
Dependency graph
And it is the column of the head.
Dependency graph
Every other column of a row holds no head, the head being unique.
Dependency graph
The configuration a row is: the head in its column, the state that head carries, and the symbols of the row on the tape. The control points hold a blank, which is what the machine's initial tape asks of them.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The bottom row is an initial configuration: the head at the corner in a start state, the cell of an element carrying its input symbol and every other cell a blank.
Dependency graph
The row above is the step the head takes, or the same configuration again where the head has halted.
Dependency graph
The run reaches the accepting row #
A row with a head stands a bounded number of steps above the bottom row: each row below it is either the step its head takes or the same configuration again, where that head has halted.
Dependency graph
A drawing is an accepting run of the machine: the accepting cell holds a head, so the row it stands in is a configuration the run reaches, in fewer steps than there are addresses.
Dependency graph
And an accepting run in bounded space, where the drawing has no clock to answer to: the same run, with its length forgotten.
Dependency graph
A tiling of the emitted square, read at the machine's coordinates #
The order a tiling promises is the machine's own, read at the digits: they are one per element, and the emitted order between two of them is the instance's.
Dependency graph
The address of a given rank, which is how the rows of the square are numbered by the clock.
Equations
- DescriptiveComplexity.TilingHard.rowAt k = if h : ∃ (s : A → Prop), DescriptiveComplexity.wideRank s = k then h.choose else fun (x : A) => False
Instances For
Dependency graph
Dependency graph
The bottom row is the empty address, where the machine's head starts.
Dependency graph
And one row above another is the increment of its address.
Dependency graph
The backward half #
A tiling of the emitted square is an accepting run of the machine. The square's coordinates are the machine's addresses, so a row is a configuration and the row above it the step its head takes; the promises the machine owes are carried by the start tile at the corner.