Documentation

DescriptiveComplexity.Problems.Wide.RegChannelTape

Starting a run at the register channel #

The two machines an instance describes – DescriptiveComplexity.wideData and DescriptiveComplexity.wideRegData – differ in one field, the channel, and it is read nowhere but in the initial tape: a step reads the transitions, the order and the positions and nothing else. So every run lemma of the library transfers by definition (wideRegData_step, wideRegData_reachesIn), and what has to be redone is the pair of statements at the two ends of a run.

They are the segment channel's own with two changes: the cell of x is wmRegSeg x, and only the elements that carry input have one. Where the segment channel says “every cell holds its element's symbol, every other address is blank”, the register channel says the same of the elements it writes for, and an address that is nobody's cell is blank as before.

The two machines take the same steps: a step reads the transitions, the order and the positions, and the channel is none of those.

Dependency graph

And so they take the same runs.

Dependency graph

And the same bounded runs.

Dependency graph

A register cell starts holding its element's symbol.

Dependency graph
theorem DescriptiveComplexity.initTape_of_not_wmRegSeg {A : Type} [FirstOrder.Language.wide.Structure A] {s : AProp} (hno : ∀ (x y : A), WMRegSeg s x¬WMInp x y) (a : WPoint A) :

Every other address starts blank: one that is no writing element's cell.

Dependency graph
theorem DescriptiveComplexity.initTape_of_marksReg {A : Type} [FirstOrder.Language.wide.Structure A] {b : A} (hb : WMBlank b) {sym : AA} (hinp : ∀ (x : A), WMHasInp xWMInp x (sym x)) {tp : WPoint AWPoint A} (hmark : ∀ (x : A), WMHasInp xtp (Sum.inl (wmRegSeg x)) = Sum.inr (sym x)) (hrest : ∀ (p : WPoint A), (∀ (x : A), WMHasInp xp Sum.inl (wmRegSeg x))tp p = Sum.inr b) (p : WPoint A) :
(wideRegData A).InitTape p (tp p)

The initial tape at the register channel: the symbol of x at the cell of x for every element the channel writes for, the blank at every address that is no such element's cell.

Dependency graph

The promise of the register-channel machine is the same promise about the instance: a linear order, a functional input and a unique blank. The channel enters only through the functionality of the input, and there two elements with the same cell that both carry input are equal.

Dependency graph
theorem DescriptiveComplexity.isInit_wideReg_marks {A : Type} [FirstOrder.Language.wide.Structure A] [Finite A] (h : IsLinOrd WMLe) {b : A} (hb : WMBlank b) {sym : AA} (hinp : ∀ (x : A), WMHasInp xWMInp x (sym x)) {tp : WPoint AWPoint A} (hmark : ∀ (x : A), WMHasInp xtp (Sum.inl (wmRegSeg x)) = Sum.inr (sym x)) (hrest : ∀ (p : WPoint A), (∀ (x : A), WMHasInp xp Sum.inl (wmRegSeg x))tp p = Sum.inr b) {q₀ : A} (hq : WMStart q₀) :
(wideRegData A).IsInit { state := Sum.inr q₀, head := Sum.inl fun (x : A) => False, tape := tp }

The initial configuration at the register channel: a start state, the head on the empty address – which is no register's cell, a register's cell holding its own element – and the marked tape.

Dependency graph
theorem DescriptiveComplexity.isInit_wideRegTape {A : Type} [FirstOrder.Language.wide.Structure A] [Finite A] (h : IsLinOrd WMLe) {b : A} (hb : WMBlank b) {sym : AA} (hinp : ∀ (x : A), WMHasInp xWMInp x (sym x)) {f : (AProp)A} (hmark : ∀ (x : A), WMHasInp xf (wmRegSeg x) = sym x) (hrest : ∀ (s : AProp), (∀ (x : A), WMHasInp xs wmRegSeg x)f s = b) {q₀ : A} (hq : WMStart q₀) :
(wideRegData A).IsInit { state := Sum.inr q₀, head := Sum.inl fun (x : A) => False, tape := wideTape f b }

The initial configuration of a program at the register channel, its tape given as a function of the addresses.

Dependency graph
theorem DescriptiveComplexity.accepts_of_wideRegTape {A : Type} [FirstOrder.Language.wide.Structure A] [Finite A] (h : IsLinOrd WMLe) {b : A} (hb : WMBlank b) {sym : AA} (hinp : ∀ (x : A), WMHasInp xWMInp x (sym x)) {f : (AProp)A} (hmark : ∀ (x : A), WMHasInp xf (wmRegSeg x) = sym x) (hrest : ∀ (s : AProp), (∀ (x : A), WMHasInp xs wmRegSeg x)f s = b) {q₀ : A} (hq : WMStart q₀) {n : } {c : Config (WPoint A)} (hreach : (wideData A).ReachesIn n { state := Sum.inr q₀, head := Sum.inl fun (x : A) => False, tape := wideTape f b } c) (hlt : n < Nat.card { p : WPoint A // (wideData A).Posn p }) {qa : A} (hstate : c.state = Sum.inr qa) (hacc : WMAcc qa) :

A program at the register channel accepts on its clock: it starts as isInit_wideRegTape says, runs for fewer steps than there are addresses, and ends in an accepting state.

Dependency graph
theorem DescriptiveComplexity.accepts_of_wideRegTape_lt_two_pow {A : Type} [FirstOrder.Language.wide.Structure A] [Finite A] (h : IsLinOrd WMLe) {b : A} (hb : WMBlank b) {sym : AA} (hinp : ∀ (x : A), WMHasInp xWMInp x (sym x)) {f : (AProp)A} (hmark : ∀ (x : A), WMHasInp xf (wmRegSeg x) = sym x) (hrest : ∀ (s : AProp), (∀ (x : A), WMHasInp xs wmRegSeg x)f s = b) {q₀ : A} (hq : WMStart q₀) {n : } {c : Config (WPoint A)} (hreach : (wideData A).ReachesIn n { state := Sum.inr q₀, head := Sum.inl fun (x : A) => False, tape := wideTape f b } c) (hlt : n < 2 ^ Nat.card A) {qa : A} (hstate : c.state = Sum.inr qa) (hacc : WMAcc qa) :

The same, with the budget compared against 2 ^ n.

Dependency graph