To tylko rozszerzony komentarz. Kilka razy temu zapytałem (siebie :-), jak szybko może być wielopasmowy NTM, który akceptuje (rozsądnie zakodowany) język NP-zupełny. Wpadłem na ten pomysł:
3-SAT pozostaje NP-kompletny, nawet jeśli zmienne są reprezentowane w jedności. W szczególności możemy przekonwertować klauzulę - załóżmy - o dowolnej formule 3-SAT φ na n zmiennych i klauzulach mw sekwencji znaków nad alfabetem Σ = { + , - , 1 }, w którym każde wystąpienie zmiennej jest reprezentowane jako jednoargumentowe:( xja∨ ¬ xjot∨ xk)φnmΣ={+,−,1}
+1i0,−1j,+1k
Na przykład można przekonwertować na:(x2∨−x3∨+4)
+110-1110+11110
Możemy więc przekonwertować wzór 3-SAT na równoważny ciąg U ( φ i ) łączący jego zdania. Język L U = { U ( φ i ) ∣ φ i ∈φiU(φi) jest NP-kompletny.LU={U(φi)∣φi∈3−SAT}
NTM z 2 taśmami może zdecydować, czy ciąg w czasie 2 | x | w ten sposób.x∈LU2|x|
- pierwsza głowa skanuje dane wejściowe od lewej do prawej iz wewnętrzną logiką śledzi, kiedy wchodzi lub wychodzi z klauzuli lub osiąga koniec formuły. Ilekroć znajdzie znak lub - , druga głowa zaczyna się przesuwać w prawo na 1 i, który reprezentuje x i . Na końcu 1 i , jeśli druga głowa ma wartość 0, wówczas zgaduje wartość prawdy + lub - (wykonuje przypisanie) i zapisuje ją na drugiej taśmie; jeśli znajdzie znak + lub -, wówczas tej zmiennej przypisano już wartość;+−1ixi1i0+−+−
- w obu przypadkach, używając wewnętrznej logiki, NTM dopasowuje wartość prawdy pod drugą głową (przypisanie) do ostatnio widzianego lub - ; jeśli się zgadzają, klauzula jest spełniona;+−
- wtedy druga głowa może powrócić do skrajnie prawej komórki;
- z wewnętrzną logiką NTM może śledzić, czy wszystkie klauzule są spełnione, gdy pierwsza głowa przesuwa się w kierunku końca wejścia.
Przykład:
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)
Czas można skrócić do jeśli dodamy kilka zbędnych symboli do reprezentacji klauzuli:|x|
+1i0i,−1j0j,+1k0k...+++
( oznacza koniec formuły)+++
W ten sposób druga głowa może powrócić do lewej komórki, podczas gdy pierwsza skanuje część . Używanie ++ jako separatora klauzul i +++0i+++++ jako znacznika końca formuły, możemy użyć tej samej reprezentacji dla formuł CNF z dowolną liczbą literałów na klauzulę.