Imagine que tiene una máquina y una tira de papel infinitamente larga que se divide en cajas de una longitud determinada. Nuestra máquina es capaz de un par de cosas. Puede leer símbolos dentro de un cuadro, puede escribir símbolos dentro de un cuadro, tiene una memoria limitada y puede mover, en un momento dado, un cuadro a la izquierda o un cuadro a la derecha. La máquina funciona de acuerdo con una tabla de comportamiento: dado lo que hay en la tira de papel y lo que hay en la memoria de la máquina, sabrá lo que debe hacerse a continuación y lo hará.
Este pequeño experimento mental se llama “máquina de Turing”. Lo que llamamos computadoras son realmente solo implementaciones prácticas de máquinas Turing que no involucran trozos de papel infinitamente largos. Como resultado, hay varios otros sistemas que son equivalentes a las máquinas de Turing: el cálculo lambda de Alonzo Church es uno de los más famosos. Entonces, lo que sea que pueda hacer con una máquina de Turing, puede hacerlo con una máquina que implemente el cálculo lambda y viceversa.
Hay muchos, muchos problemas que puede resolver con las máquinas de Turing y sus equivalentes. Sin embargo, resulta que hay algunos problemas que no puede resolver. Uno de los problemas más famosos que no puede resolver con una máquina de Turing es el problema de detención. El problema de detención es el siguiente: se le da un algoritmo arbitrario y una entrada. Proporcione un algoritmo (llamémoslo H) que determinará si el algoritmo que le han dado alguna vez deja de ejecutarse dada la entrada que le han dado.
Para algunos pares de algoritmo-entrada, esto es trivial. Por ejemplo (usando Python aquí):
- ¿Cómo deriva un programador la lógica de cualquier programa?
- ¿Qué son los árboles de prueba?
- ¿La lógica y las matemáticas se mantienen en todos los universos posibles?
- Cómo calcular el día correspondiente a la fecha de cualquier año
- ¿Cuál es el mejor truco para resolver preguntas de razonamiento lógico?
def stops(x): return x + 2 >>> stops(0)
Esto deja de ejecutarse claramente cuando escupe un valor de 2. H(stops, 0)
proporciona claramente un valor de “VERDADERO”.
Similar:
def does_not_stop(x): while True: x += 2 return 2 >>> does_not_stop(0)
Por inspección, podemos descubrir que este algoritmo se atascará en un bucle infinito, por lo que H(does_not_stop, 0)
es “FALSE”.
Sin embargo, resulta que no todos los algoritmos son tan fáciles de descifrar, y no es como si pudieras descubrir si un algoritmo nunca deja de ejecutarse al intentar ejecutarlo (solo puedes demostrar que lleva mucho, mucho tiempo) ejecutar), por lo que el problema de detención no se puede resolver utilizando una máquina Turing.
Por lo tanto, llegamos al concepto de “hipercomputación”: la idea de que existen modelos de computación que no son equivalentes a las máquinas de Turing que pueden resolver problemas que están más allá de las máquinas de Turing. Hay una variedad de tales modelos; sin embargo, si alguno de ellos puede implementarse es otro asunto completamente diferente.