Lenguajes recursivos (LRC) y recursivamente enumerables (LRE)
Un lenguaje es recursivamente enumerable (LRE) si existe una máquina de Turing que acepta cualquier cadena del lenguaje y se para:
Si es una palabra del lenguaje () y es un estado final ().
Sin embargo, si no es del lenguaje (), la máquina se parará en un estado no final o entrará en un bucle infinito.
Es decir, los LRE son la clase de lenguajes que aceptan las máquinas de Turing.
Los lenguajes LRC garantizan que la MT que los acepta terminará siempre y nunca entrará en un bucle infinito.
Hay lenguajes que no son LRE. La demostración es compleja, puesto que todos los lenguajes descritos de forma algorítmica son aceptados por MT.
Decidibilidad
Ya hemos visto que una función es computable en un dominio si existe una MT que computa el valor de para todos los argumentos del dominio.
Si el resultado de la computación de un problema es Sí / No, se habla de decidibilidad / indecidibilidad (respectivamente).
Problema de la parada
Sea una MT cualquiera, descrita por la cadena , y sea una cadena de entrada a la máquina .
Una solución al problema de la parada sería una máquina de Turing universal en la que, para cualquier máquina (cualesquiera y ), se ejecuta una computación para determinar si entra en un bucle infinito o no:
- , si aplicada a se para
- , si aplicada a no se para
el es estado final representando la respuesta Sí, se para y de la respuesta No, no se para, para la máquina .
No existe ninguna MT que se comporte como se require para el problema de la parada: es un problema indecidible. De lo contrario, entonces todos los LRE sería LRC.
Complejidad computacional
Para determinar la complejidad computacional de cualquier algoritmo:
- Usaremos máquinas de Turing
- El tamaño del problema será
- Interesa saber cuánto aumenta el tiempo al incrementar
Si cualquier cadena de y con menos símbolos que () es aceptada en movimientos, entonces se dice que la MT acepta en tiempo .
Por tanto, si una computación tiene una complejidad temporal , significa que puede ser resuelta en no más de movimientos de una MT para un tamaño de problema .
Es decir, que una computación o MT tiene complejidad temporal de si acepta o termina en menos de esos movimientos sea cual sea la entrada. Generalmente, no nos interesará el tiempo exacto, pero sí el orden de magnitud.
Desde el punto de vista de la decidibilidad, todas las MT son equivalentes; pero desde el punto de vista de la complejidad no. Por ejemplo, para reconocer el lenguaje :
- MT estándar:
- MT con dos cintas:
Partiendo de expresiones en forma normal conjuntiva: , donde y con variables o sus negaciones.
Dada una expresión , ¿hay alguna asignación de valores a sus variables que haga verdadera?
Algunos ejemplos:
Entonces, la complejidad:
- MT estándar:
- MT no determinista:
Complejidades P y NP
- Un lenguaje pertenece a la clase si hay una MT multicinta determinista que acepta en tiempo .
- Un lenguaje pertenece a la clase si hay una MT multicinta no determinista que acepta en tiempo .
es el conjunto de lenguajes aceptados por una MT determinista en tiempo polinómico.
es el conjunto de lenguajes aceptados por una MT no determinista en tiempo polinómico.
Sabemos que , pero…
Este es un problema del milenio, todavía sin resolver.
Un lenguaje es reducible en tiempo polinómico a otro lenguaje si existe una MT determinista tal que cualquier cadena puede ser transformada en tiempo polinómico en otra cadena de forma que:
- Si es reducible en tiempo polinómico a y , entonces .
- De igual forma, si , entonces .
Es decir, que es posible transformar un problema (o computación, representado como una cadena de un lenguaje) a otro por una MT en tiempo polinómico. Si uno de estos problemas es de la clase o , entonces el otro también lo será, dado que se puede convertir de uno a otro sin un gran coste adicional.
Además, existe un conjunto de problemas , donde todos son reducibles en tiempo polinómico entre sí.