Este es solo un comentario extendido. Hace algunas veces pregunté (a mí mismo :-) qué tan rápido puede ser un NTM multitapa que acepta un lenguaje NP (razonablemente codificado). Se me ocurrió esta idea:
3-SAT permanece NP-completo incluso si las variables se representan en unario. En particular, podemos convertir una cláusula, supongamos , de una fórmula arbitraria 3-SAT φ en n variables y m cláusulas en una secuencia de caracteres sobre el alfabeto Σ = { + , - , 1 } en el que cada aparición de variable se representa en unario:(xi∨¬xj∨xk)φnmΣ={+,−,1}
+1i0,−1j,+1k
Por ejemplo, se puede convertir a:(x2∨−x3∨+4)
+110-1110+11110
Entonces podemos convertir una fórmula 3-SAT en una cadena equivalente U ( φ i ) concatenando sus cláusulas. El lenguaje L U = { U ( φ i ) ∣ φ i ∈ 3 - S A T } es NP-completo.φiU(φi)LU= { U( φyo) ∣ φyo∈ 3 - SA T}
Una NTM de 2 cintas puede decidir si una cadena en el tiempo 2 | x | De este modo.x ∈ LU2 | x |
- la primera cabeza escanea la entrada de izquierda a derecha y con la lógica interna realiza un seguimiento cuando ingresa o sale de una cláusula o llega al final de la fórmula. Cada vez que encuentra un o - , la segunda cabeza comienza a moverse hacia la derecha con ella en el 1 i que representa x i . Al final de 1 i , si el segundo encabezado está en 0 , adivina un valor de verdad + o - (realiza una asignación) y lo escribe en la segunda cinta; si encuentra un + o - entonces a esa variable ya se le ha asignado un valor;+-1yoXyo1yo0 0+-+-
- en ambos casos, usando la lógica interna, el NTM hace coincidir el valor de verdad debajo del segundo encabezado (la asignación) con el último visto o - ; si coinciden, entonces se cumple la cláusula;+-
- entonces la segunda cabeza puede regresar a la celda más a la derecha;
- Con la lógica interna, el NTM puede realizar un seguimiento si se cumplen todas las cláusulas mientras el primer cabezal se mueve hacia el final de la entrada.
Ejemplo:
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)
El tiempo puede reducirse a si agregamos algunos símbolos redundantes a la representación de la cláusula:El | x |
+ 1yo0 0yo, - 1j0 0j, + 1k0 0k. . .+++
( marca el final de la fórmula)+++
De esta manera, la segunda cabeza puede volver a la celda más a la izquierda, mientras que la primera escanea la parte . Usando ++ como delimitador de cláusula y +++ como marcador para el final de la fórmula, podemos usar la misma representación para fórmulas CNF con un número arbitrario de literales por cláusula.0 0yo+++++