Questo è solo un commento esteso. Qualche volta fa mi sono chiesto (me stesso :-) quanto velocemente può essere un NTM multitape che accetta un linguaggio NP completo (ragionevolmente codificato). Mi è venuta questa idea:
3-SAT rimane NP-completo anche se le variabili sono rappresentate in modo unario. In particolare possiamo convertire una clausola - supponiamo - di una formula 3-SAT arbitraria φ su n variabili e clausole m in una sequenza di caratteri sull'alfabeto Σ = { + , - , 1 } in cui ogni occorrenza variabile è rappresentata in unario:(xi∨¬xj∨xk)φnmΣ={+,−,1}
+1i0,−1j,+1k
Ad esempio, può essere convertito in:(x2∨−x3∨+4)
+110-1110+11110
Quindi possiamo convertire una formula 3-SAT in una stringa equivalente U ( φ i ) concatenando le sue clausole. La lingua L U = { U ( φ i ) ∣ φ i ∈ 3 - S A T } è NP-completa.φiU(φi)LU={U(φi)∣φi∈3−SAT}
Un NTM a 2 nastri può decidere se una stringa nel tempo 2 | x | in questo modo.x∈LU2|x|
- la prima testa analizza l'input da sinistra a destra e con la logica interna tiene traccia quando entra o esce da una clausola o raggiunge la fine della formula. Ogni volta che trova un o - , la seconda testa inizia a spostarsi a destra con essa sull'1 i che rappresenta x i . Alla fine di 1 i , se la seconda testa è su uno 0, allora indovina un valore di verità + o - (fa un incarico) e lo scrive sul secondo nastro; se trova un + o - allora a quella variabile è già stato assegnato un valore;+−1ixi1i0+−+−
- in entrambi i casi, usando la logica interna, l'NTM abbina il valore di verità sotto la seconda testa (l'assegnazione) con l'ultimo visto o - ; se corrispondono, la clausola è soddisfatta;+−
- quindi la seconda testa può tornare alla cella più a destra;
- con la logica interna, NTM può tenere traccia se tutte le clausole sono soddisfatte mentre la prima testa si sposta verso la fine dell'ingresso.
Esempio:
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)
Il tempo può essere ridotto a se aggiungiamo alcuni simboli ridondanti alla rappresentazione della clausola:|x|
+1i0i,−1j0j,+1k0k...+++
( segna la fine della formula)+++
In questo modo la seconda testa può tornare alla cella più a sinistra mentre la prima esegue la scansione della parte . Usando ++ come delimitatore di clausole e +++ come marker per la fine della formula, possiamo usare la stessa rappresentazione per le formule CNF con un numero arbitrario di letterali per clausola.0i+++++