The tape of the unit-propagation machine #
The layout half of HORNSAT ≤ᶠᵒ[≤] DTMAccept, stage 4 of the machine bridge:
which tagged tuples are positions, in what order, and why there are enough of
them. The program that runs on this tape is in
DescriptiveComplexity.Problems.Machine.HornHardness.
The layout #
As for the SAT machine of stage 3: one cell per element of the instance,
bracketed by two markers, followed by filler cells supplying time. The
difference is the dimension: this machine does n propagation rounds of
one check-and-mark pass per clause, O(n³) steps in all, so the interpreted
universe is UPTag × A³ and sixteen filler tags give 16n³ positions.
A cell holds its element together with a mark – sU x unmarked, sM x
marked – and the marked set is the machine's working copy of the unit
propagation closure DescriptiveComplexity.Forced.
The program's tags #
All the machine's tags are declared here, as for stage 3: symbols, states and transitions get indices above the position tags, which leaves the order of the positions undisturbed. The states carry up to two elements – the current round and the current clause – which is what the third dimension of the payload accommodates.
The tags #
The tags of the unit-propagation machine. Position tags first – their constructor order is the tape order – then symbols, states and transitions.
- pStart : UPTag
The left marker cell.
- pCell : UPTag
The cell of an element: one per element of the instance.
- pEnd : UPTag
The right marker cell.
- pFill
(i : Fin 16)
: UPTag
Filler cells, sixteen tags' worth, supplying the time budget.
- sStart : UPTag
The left-marker symbol
⊢. - sEnd : UPTag
The right-marker symbol
⊣. - sBlank : UPTag
The blank symbol.
- sU : UPTag
The symbol
(x, unmarked). - sM : UPTag
The symbol
(x, marked). - qInit : UPTag
The dispatch state, at the left marker.
- qChk
(f : Bool)
: UPTag
Checking the current clause, sweeping right:
fsays every negative literal seen so far is marked. Payload: the round and the clause. - qMark
(m : Bool)
: UPTag
The return sweep of a clause:
msays the check succeeded, so the positive literal is marked in passing. Payload: the round and the clause. - qVer
(f d : Bool)
: UPTag
Verifying the clause of the payload against the final marks, flag
f, sweeping in directiond. - qAcc : UPTag
The accepting state.
- tInitChk : UPTag
Dispatch: a clause exists, start the first check sweep.
- tInitAcc : UPTag
Dispatch: no clause at all, accept.
- tChk
(m f : Bool)
: UPTag
Check sweep: read a cell with mark
munder flagf. - tChkEnd
(f : Bool)
: UPTag
Check sweep over: turn round at
⊣into the return sweep. - tMark
(m mk : Bool)
: UPTag
Return sweep: read a cell with mark
m; ifmk, mark the positive literal of the clause in passing. - tMarkEndNext
(mk : Bool)
: UPTag
Return sweep over, another clause follows in this round.
- tMarkEndRound
(mk : Bool)
: UPTag
Return sweep over, last clause, another round follows.
- tMarkEndVer
(mk : Bool)
: UPTag
Return sweep over, last clause of the last round: verification begins.
- tVer
(m f d : Bool)
: UPTag
Verification sweep: read a cell with mark
munder flagf, sweeping in directiond. - tVerNext
(d : Bool)
: UPTag
Verified: the clause is satisfied and another one follows.
- tVerAcc
(d : Bool)
: UPTag
Verified: the last clause is satisfied, and the instance is Horn.
Instances For
Dependency graph
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
Equations
- One or more equations did not get rendered due to their size.
Dependency graph
Dependency graph
The position of a tag in the tape order.
Equations
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.pStart = 0
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.pCell = 1
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.pEnd = 2
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.pFill a) = 3 + ↑a
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.sStart = 19
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.sEnd = 20
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.sBlank = 21
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.sU = 22
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.sM = 23
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.qInit = 24
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.qChk a) = 25 + if a = true then 1 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.qMark a) = 27 + if a = true then 1 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.qVer a a_1) = (29 + if a = true then 1 else 0) + if a_1 = true then 2 else 0
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.qAcc = 33
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.tInitChk = 34
- DescriptiveComplexity.hTagIdx DescriptiveComplexity.UPTag.tInitAcc = 35
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tChk a a_1) = (36 + if a = true then 1 else 0) + if a_1 = true then 2 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tChkEnd a) = 40 + if a = true then 1 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tMark a a_1) = (42 + if a = true then 1 else 0) + if a_1 = true then 2 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tMarkEndNext a) = 46 + if a = true then 1 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tMarkEndRound a) = 48 + if a = true then 1 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tMarkEndVer a) = 50 + if a = true then 1 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tVer a a_1 a_2) = ((52 + if a = true then 1 else 0) + if a_1 = true then 2 else 0) + if a_2 = true then 4 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tVerNext a) = 60 + if a = true then 1 else 0
- DescriptiveComplexity.hTagIdx (DescriptiveComplexity.UPTag.tVerAcc a) = 62 + if a = true then 1 else 0
Instances For
Dependency graph
Dependency graph
The tape order on tags.
Dependency graph
The intended positions #
The tuple of minima at dimension three: what markers and constants are pinned to.
Equations
Instances For
Dependency graph
Dependency graph
The tagged tuples that are positions: the markers on the triple of minima, an element's cell that element with a minimal rest, the fillers unrestricted.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
Dependency graph
The blank symbol of the machine: pinned to the triple of minima.
Equations
Instances For
Dependency graph
Dependency graph
Dependency graph
The initial tape: the markers hold their own symbols and the cell of an element holds that element, unmarked.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Dependency graph
The initial tape is functional.
Dependency graph
There is a position: the left marker.
Dependency graph
The interpreted order is linear, from DescriptiveComplexity.tagTupleOrder –
no tag-pair case analysis, exactly as for stage 3.
Dependency graph
The budget #
The filler cells alone are enough. One dispatch step, two sweeps per
round and clause, one sweep per clause of verification: at most
(2n² + n + 2)(n + 2) steps for n elements, while the sixteen filler tags
contribute 16n³ positions by themselves.