Это только расширенный комментарий. Несколько раз назад я спрашивал (сам :-), насколько быстрым может быть многолинейный NTM, который принимает (разумно закодированный) NP-полный язык. Я пришел с этой идеей:
3-SAT остается NP-полной, даже если переменные представлены в унарной форме. В частности, мы можем преобразовать предложение - предположим - произвольной формулы 3-SAT φ на n переменных и m предложений в последовательности символов над алфавитом Σ = { + , - , 1 } в которой каждое вхождение переменной представляется в унарном виде:(xi∨¬xj∨xk)φnmΣ={+,−,1}
+1i0,−1j,+1k
Например, можно преобразовать в:(x2∨−x3∨+4)
+110-1110+11110
Таким образом, мы можем преобразовать формулу 3-SAT в эквивалентную строку U ( φ i ), объединяющую ее предложения. Язык L U = { U ( ф я ) | ф я ∈ 3 - S Т } является NP-полной.φiU(φi)LU= { U( φя) ∣ φя∈ 3 - SА Т}
Двухмоторная НТМ может решить, будет ли строка за время 2 | х | этим способом.x ∈ LU2 | х |
- первая головка сканирует ввод слева направо и, следуя внутренней логике, отслеживает вход, выход из предложения или достижение конца формулы. Всякий раз, когда он находит или - , вторая голова начинает двигаться вместе с ним на 1 i, который представляет x i . В конце 1 i , если второй заголовок находится на 0, тогда он угадывает значение истинности + или - (делает присваивание) и записывает его на вторую ленту; если он находит + или - тогда этой переменной уже присвоено значение;+-1яИкся1я0+-+-
- в обоих случаях, используя внутреннюю логику, NTM сопоставляет значение истинности под вторым заголовком (назначением) с последним увиденным или - ; если они совпадают, то условие удовлетворяется;+-
- затем вторая голова может вернуться в крайнюю правую ячейку;
- с помощью внутренней логики NTM может отслеживать, удовлетворены ли все условия, пока первая головка движется к концу ввода.
Пример:
Tape 1 (formula) Tape 2 (variable assignments)
+110-1110+11110... 0000000000000...
^ ^
+110-1110+11110... 0000000000000...
^ ^
+110-1110+11110... 0000000000000...
^ ^
+110-1110+11110... 0+00000000000... first guess set x2=T; matches +
^ ^ so remember that current clause is satisfied
+110-1110+11110... 0+00000000000...
^ ^
...
+110-1110+11110... 0+00000000000...
^ ^
...
+110-1110+11110... 0++0000000000... second guess set x3=T
^ ^ don't reject because current
clause is satisfied (and in every
case another literal must be parsed)
Время может быть сокращено до если мы добавим несколько избыточных символов к представлению предложения:| х |
+ 1я0я, - 1J0J, + 1К0К, , ,+++
( отмечает конец формулы)+++
Таким образом, вторая головка может вернуться в крайнюю левую ячейку, а первая сканирует часть . Используя ++ в качестве разделителя предложений и +++ в качестве маркера конца формулы, мы можем использовать то же представление для формул CNF с произвольным числом литералов в предложении.0я+++++