Una máquina de Turing es un modelo matemático de computación que describe una máquina abstracta [1] que manipula símbolos en una tira de cinta de acuerdo con una tabla de reglas. [2] A pesar de la simplicidad del modelo, es capaz de implementar cualquier algoritmo informático . [3]
La máquina funciona con una cinta de memoria infinita [4] dividida en celdas discretas [5] , cada una de las cuales puede contener un único símbolo extraído de un conjunto finito de símbolos llamado el alfabeto de la máquina. Tiene una "cabeza" que, en cualquier punto de la operación de la máquina, se posiciona sobre una de estas celdas, y un "estado" seleccionado de un conjunto finito de estados. En cada paso de su operación, la cabeza lee el símbolo en su celda. Luego, basándose en el símbolo y el estado actual de la máquina, la máquina escribe un símbolo en la misma celda y mueve la cabeza un paso hacia la izquierda o hacia la derecha [6] , o detiene el cálculo. La elección de qué símbolo de reemplazo escribir, en qué dirección mover la cabeza y si detenerse se basa en una tabla finita que especifica qué hacer para cada combinación del estado actual y el símbolo que se lee. Como un programa de computadora real, es posible que una máquina de Turing entre en un bucle infinito que nunca se detendrá.
La máquina de Turing fue inventada en 1936 por Alan Turing , [7] [8] quien la llamó una "a-machine" (máquina automática). [9] Fue el asesor doctoral de Turing, Alonzo Church , quien más tarde acuñó el término "máquina de Turing" en una reseña. [10] Con este modelo, Turing pudo responder negativamente a dos preguntas:
De esta manera, al proporcionar una descripción matemática de un dispositivo muy simple capaz de realizar cálculos arbitrarios, pudo demostrar propiedades de la computación en general y, en particular, la incomputabilidad del Entscheidungsproblem ('problema de decisión'). [13]
Las máquinas de Turing demostraron la existencia de limitaciones fundamentales en el poder del cálculo mecánico. [14] Si bien pueden expresar cálculos arbitrarios, su diseño minimalista las hace demasiado lentas para el cálculo en la práctica: las computadoras del mundo real se basan en diseños diferentes que, a diferencia de las máquinas de Turing, utilizan memoria de acceso aleatorio .
La completitud de Turing es la capacidad de un modelo computacional o un sistema de instrucciones para simular una máquina de Turing. Un lenguaje de programación que es completo en términos de Turing es teóricamente capaz de expresar todas las tareas que pueden realizar las computadoras; casi todos los lenguajes de programación son completos en términos de Turing si se ignoran las limitaciones de la memoria finita.
Una máquina de Turing es un modelo idealizado de una unidad central de procesamiento (CPU) que controla toda la manipulación de datos que realiza una computadora. La máquina canónica utiliza una memoria secuencial para almacenar datos. Normalmente, la memoria secuencial se representa como una cinta de longitud infinita en la que la máquina puede realizar operaciones de lectura y escritura.
En el contexto de la teoría del lenguaje formal , una máquina de Turing ( autómata ) es capaz de enumerar un subconjunto arbitrario de cadenas válidas de un alfabeto . Un conjunto de cadenas que se pueden enumerar de esta manera se denomina lenguaje enumerable recursivamente . La máquina de Turing se puede definir de forma equivalente como un modelo que reconoce cadenas de entrada válidas, en lugar de enumerar cadenas de salida.
Dada una máquina de Turing M y una cadena arbitraria s , generalmente no es posible decidir si M producirá eventualmente s . Esto se debe al hecho de que el problema de detención es irresoluble, lo que tiene implicaciones importantes para los límites teóricos de la computación.
La máquina de Turing es capaz de procesar una gramática sin restricciones , lo que implica además que es capaz de evaluar de forma robusta la lógica de primer orden de un número infinito de maneras. Esto se demuestra de forma famosa mediante el cálculo lambda .
Una máquina de Turing que es capaz de simular cualquier otra máquina de Turing se llama máquina de Turing universal (UTM, o simplemente una máquina universal). Otro formalismo matemático, el cálculo lambda , con una naturaleza "universal" similar fue introducido por Alonzo Church . El trabajo de Church se entrelazó con el de Turing para formar la base de la tesis de Church-Turing . Esta tesis afirma que las máquinas de Turing, el cálculo lambda y otros formalismos similares de computación efectivamente capturan la noción informal de métodos efectivos en lógica y matemáticas y, por lo tanto, proporcionan un modelo a través del cual uno puede razonar sobre un algoritmo o "procedimiento mecánico" de una manera matemáticamente precisa sin estar atado a ningún formalismo en particular. El estudio de las propiedades abstractas de las máquinas de Turing ha producido muchos conocimientos sobre la ciencia informática , la teoría de la computabilidad y la teoría de la complejidad .
En su ensayo de 1948, "Maquinaria inteligente", Turing escribió que su máquina consta de:
...una capacidad de memoria ilimitada obtenida en forma de una cinta infinita marcada en cuadrados, en cada uno de los cuales se puede imprimir un símbolo. En cualquier momento hay un símbolo en la máquina; se llama el símbolo escaneado. La máquina puede alterar el símbolo escaneado, y su comportamiento está determinado en parte por ese símbolo, pero los símbolos en la cinta en otros lugares no afectan el comportamiento de la máquina. Sin embargo, la cinta se puede mover de un lado a otro a través de la máquina, siendo esta una de las operaciones elementales de la máquina. Cualquier símbolo en la cinta puede, por lo tanto, tener una entrada. [15]
— Turing 1948, pág. 3 [16]
La máquina de Turing modela matemáticamente una máquina que opera mecánicamente sobre una cinta. En esta cinta hay símbolos que la máquina puede leer y escribir, uno a la vez, utilizando un cabezal de cinta. El funcionamiento está completamente determinado por un conjunto finito de instrucciones elementales como "en el estado 42, si el símbolo visto es 0, escribe un 1; si el símbolo visto es 1, cambia al estado 17; en el estado 17, si el símbolo visto es 0, escribe un 1 y cambia al estado 6", etc. En el artículo original (" Sobre los números computables, con una aplicación al problema de la endoscopia ", ver también las referencias más abajo), Turing no imagina un mecanismo, sino una persona a la que llama "computadora", que ejecuta estas reglas mecánicas deterministas de manera servil (o como dice Turing, "de manera desganada").
Más explícitamente, una máquina de Turing consta de:
En los modelos de 4 tuplas, borrar o escribir un símbolo (a j1 ) y mover el cabezal hacia la izquierda o hacia la derecha (d k ) se especifican como instrucciones separadas. La tabla le indica a la máquina que (ia) borre o escriba un símbolo o (ib) mueva el cabezal hacia la izquierda o hacia la derecha, y luego (ii) asuma el mismo estado o uno nuevo según lo prescrito, pero no ambas acciones (ia) y (ib) en la misma instrucción. En algunos modelos, si no hay ninguna entrada en la tabla para la combinación actual de símbolo y estado, entonces la máquina se detendrá; otros modelos requieren que se completen todas las entradas.
Cada parte de la máquina (es decir, su estado, colecciones de símbolos y cinta utilizada en un momento dado) y sus acciones (como imprimir, borrar y mover la cinta) son finitas , discretas y distinguibles ; es la cantidad ilimitada de cinta y tiempo de ejecución lo que le otorga una cantidad ilimitada de espacio de almacenamiento .
Siguiendo a Hopcroft y Ullman (1979, p. 148), una máquina de Turing (de una cinta) se puede definir formalmente como una tupla de 7 donde
Una variante relativamente poco común permite "ningún desplazamiento", digamos N, como tercer elemento del conjunto de direcciones .
La tupla de 7 para el castor ocupado de 3 estados se ve así (vea más sobre este castor ocupado en ejemplos de máquinas de Turing ):
Inicialmente todas las celdas de la cinta están marcadas con .
En palabras de van Emde Boas (1990), p. 6: "El objeto de teoría de conjuntos [su descripción formal de siete tuplas similar a la anterior] proporciona sólo información parcial sobre cómo se comportará la máquina y cómo serán sus cálculos".
Por ejemplo,
Las definiciones en la literatura a veces difieren ligeramente, para hacer que los argumentos o las pruebas sean más fáciles o más claras, pero esto siempre se hace de tal manera que la máquina resultante tenga la misma potencia computacional. Por ejemplo, el conjunto podría cambiarse de a , donde N ("Ninguno" o "Sin operación") permitiría que la máquina permaneciera en la misma celda de la cinta en lugar de moverse hacia la izquierda o la derecha. Esto no aumentaría la potencia computacional de la máquina.
La convención más común representa cada "instrucción de Turing" en una "tabla de Turing" mediante una de nueve 5-tuplas, según la convención de Turing/Davis (Turing (1936) en The Undecidable , pág. 126-127 y Davis (2000) pág. 152):
Otros autores (Minsky (1967) p. 119, Hopcroft y Ullman (1979) p. 158, Stone (1972) p. 9) adoptan una convención diferente, con el nuevo estado q m listado inmediatamente después del símbolo escaneado S j :
En el resto de este artículo se utilizará la "definición 1" (la convención de Turing/Davis).
En la siguiente tabla, el modelo original de Turing permitía solo las tres primeras líneas, que él llamó N1, N2, N3 (cf. Turing en The Undecidable , p. 126). Permitió el borrado del "cuadrado escaneado" nombrando un símbolo 0 S 0 = "borrar" o "en blanco", etc. Sin embargo, no permitió la no impresión, por lo que cada línea de instrucción incluye "imprimir símbolo S k " o "borrar" (cf. nota al pie 12 en Post (1947), The Undecidable , p. 300). Las abreviaturas son de Turing ( The Undecidable , p. 119). Después del artículo original de Turing en 1936-1937, los modelos de máquina han permitido los nueve tipos posibles de cinco-tuplas:
Cualquier tabla de Turing (lista de instrucciones) se puede construir a partir de las nueve 5-tuplas anteriores. Por razones técnicas, normalmente se puede prescindir de las tres instrucciones no imprimibles o "N" (4, 5, 6). Para ver ejemplos, consulte Ejemplos de máquinas de Turing .
Con menor frecuencia se encuentran el uso de 4-tuplas: estas representan una atomización adicional de las instrucciones de Turing (cf. Post (1947), Boolos y Jeffrey (1974, 1999), Davis-Sigal-Weyuker (1994)); consulte también más en Máquina Post–Turing .
La palabra "estado" utilizada en el contexto de las máquinas de Turing puede ser una fuente de confusión, ya que puede significar dos cosas. La mayoría de los comentaristas posteriores a Turing han utilizado "estado" para referirse al nombre o designador de la instrucción actual que se debe ejecutar, es decir, el contenido del registro de estado. Pero Turing (1936) hizo una clara distinción entre un registro de lo que llamó la "configuración m" de la máquina y el "estado de progreso" de la máquina (o persona) a través del cómputo, es decir, el estado actual del sistema total. Lo que Turing llamó "la fórmula de estado" incluye tanto la instrucción actual como todos los símbolos de la cinta:
De este modo, el estado de progreso del cálculo en cualquier etapa está completamente determinado por la nota de instrucciones y los símbolos en la cinta. Es decir, el estado del sistema puede describirse mediante una única expresión (secuencia de símbolos) que consiste en los símbolos en la cinta seguidos de Δ (que se supone que no aparece en ningún otro lugar) y luego por la nota de instrucciones. Esta expresión se denomina "fórmula de estado".
— Lo indecidible , págs. 139-140, énfasis añadido
En un artículo anterior, Turing llevó esto aún más lejos: da un ejemplo en el que colocó un símbolo de la "configuración m" actual (la etiqueta de la instrucción) debajo del cuadrado escaneado, junto con todos los símbolos de la cinta ( The Undecidable , p. 121); a esto lo llama "la configuración completa " ( The Undecidable , p. 118). Para imprimir la "configuración completa" en una línea, coloca la etiqueta de estado/configuración m a la izquierda del símbolo escaneado.
Una variante de esto se ve en Kleene (1952), donde Kleene muestra cómo escribir el número de Gödel de la "situación" de una máquina: coloca el símbolo de "configuración m" q 4 sobre el cuadrado escaneado aproximadamente en el centro de los 6 cuadrados no en blanco en la cinta (ver la figura de la cinta de Turing en este artículo) y lo pone a la derecha del cuadrado escaneado. Pero Kleene se refiere a "q 4 " en sí mismo como "el estado de la máquina" (Kleene, p. 374-375). Hopcroft y Ullman llaman a esta composición la "descripción instantánea" y siguen la convención de Turing de poner el "estado actual" (etiqueta de instrucción, configuración m) a la izquierda del símbolo escaneado (p. 149), es decir, la descripción instantánea es la composición de los símbolos no en blanco a la izquierda, el estado de la máquina, el símbolo actual escaneado por el cabezal y los símbolos no en blanco a la derecha.
Ejemplo: estado total de un castor ocupado de 3 estados y 2 símbolos después de 3 "movimientos" (tomado del ejemplo "ejecutar" en la figura siguiente):
Esto significa: después de tres movimientos la cinta tiene... 000110000... en ella, el cabezal está escaneando el 1 más a la derecha, y el estado es A. Los espacios en blanco (en este caso representados por "0") pueden ser parte del estado total como se muestra aquí: B 01; la cinta tiene un solo 1 en ella, pero el cabezal está escaneando el 0 ("espacio en blanco") a su izquierda y el estado es B.
"Estado" en el contexto de las máquinas de Turing debe aclararse en cuanto a qué se está describiendo: la instrucción actual, o la lista de símbolos en la cinta junto con la instrucción actual, o la lista de símbolos en la cinta junto con la instrucción actual colocada a la izquierda del símbolo escaneado o a la derecha del símbolo escaneado.
El biógrafo de Turing, Andrew Hodges (1983: 107), ha señalado y analizado esta confusión.
A la derecha: la tabla anterior expresada como un diagrama de "transición de estados".
Por lo general, es mejor dejar las tablas grandes como tablas (Booth, p. 74). Se pueden simular más fácilmente por computadora en forma tabular (Booth, p. 74). Sin embargo, ciertos conceptos (por ejemplo, máquinas con estados de "reinicio" y máquinas con patrones repetitivos (cf. Hill y Peterson, p. 244ff)) se pueden ver más fácilmente cuando se ven como un dibujo.
Si un dibujo representa una mejora con respecto a su tabla, es algo que debe decidir el lector en el contexto particular.
El lector debe tener en cuenta nuevamente que dichos diagramas representan una instantánea de su tabla congelada en el tiempo, no el curso ("trayectoria") de un cálculo a través del tiempo y el espacio. Si bien cada vez que la atareada máquina castor "funciona" siempre seguirá la misma trayectoria de estado, esto no es cierto para la máquina "copiadora" a la que se le pueden proporcionar "parámetros" de entrada variables.
El diagrama "progreso del cómputo" muestra el progreso del "estado" (instrucción) del castor atareado de tres estados a través de su cómputo desde el principio hasta el final. En el extremo derecho se encuentra la "configuración completa" de Turing ("situación" de Kleene, "descripción instantánea" de Hopcroft-Ullman) en cada paso. Si la máquina se detuviera y se borrara el "registro de estado" y la cinta entera, estas "configuraciones" podrían usarse para reavivar un cómputo en cualquier parte de su progreso (cf. Turing (1936) The Undecidable , pp. 139-140).
Se puede demostrar que muchas máquinas que podrían tener una capacidad computacional mayor que una simple máquina universal de Turing no tienen más potencia (Hopcroft y Ullman, pág. 159; cf. Minsky (1967)). Tal vez calculen más rápido o utilicen menos memoria, o su conjunto de instrucciones sea menor, pero no pueden calcular con mayor potencia (es decir, más funciones matemáticas). (La tesis de Church-Turing plantea la hipótesis de que esto es cierto para cualquier tipo de máquina: cualquier cosa que pueda ser "calculada" puede ser calculada por alguna máquina de Turing.)
Una máquina de Turing es equivalente a un autómata de pila única (PDA, por sus siglas en inglés) que se ha vuelto más flexible y conciso al relajar el requisito de último en entrar, primero en salir (LIFO, por sus siglas en inglés) de su pila. Además, una máquina de Turing también es equivalente a un PDA de dos pilas con semántica LIFO estándar, al usar una pila para modelar la cinta a la izquierda de la cabeza y la otra pila para la cinta a la derecha.
En el otro extremo, algunos modelos muy simples resultan ser equivalentes a Turing , es decir, tienen el mismo poder computacional que el modelo de máquina de Turing.
Los modelos equivalentes comunes son la máquina de Turing multicinta , la máquina de Turing multipista , las máquinas con entrada y salida y la máquina de Turing no determinista (NDTM), en oposición a la máquina de Turing determinista (DTM), para la cual la tabla de acciones tiene como máximo una entrada para cada combinación de símbolo y estado.
Las máquinas de Turing de solo lectura y movimiento hacia la derecha son equivalentes a los DFA (así como a los NFA mediante conversión utilizando el algoritmo de conversión de NFA a DFA ).
Para fines prácticos y didácticos, la máquina de registros equivalentes puede utilizarse como lenguaje de programación ensamblador habitual .
Una pregunta relevante es si el modelo computacional representado por lenguajes de programación concretos es equivalente a Turing o no. Mientras que el cálculo de una computadora real se basa en estados finitos y por lo tanto no es capaz de simular una máquina de Turing, los lenguajes de programación en sí mismos no necesariamente tienen esta limitación. Kirner et al., 2009 han demostrado que entre los lenguajes de programación de propósito general algunos son Turing completos mientras que otros no lo son. Por ejemplo, ANSI C no es Turing completo, ya que todas las instancias de ANSI C (diferentes instancias son posibles ya que el estándar deja deliberadamente cierto comportamiento sin definir por razones de legado) implican una memoria de espacio finito. Esto se debe a que el tamaño de los tipos de datos de referencia de memoria, llamados punteros , es accesible dentro del lenguaje. Sin embargo, otros lenguajes de programación como Pascal no tienen esta característica, lo que les permite ser Turing completos en principio. Es simplemente Turing completo en principio, ya que se permite que la asignación de memoria en un lenguaje de programación falle, lo que significa que el lenguaje de programación puede ser Turing completo cuando ignora las asignaciones de memoria fallidas, pero los programas compilados ejecutables en una computadora real no pueden.
Al principio de su artículo (1936), Turing hace una distinción entre una "máquina automática" (su "movimiento... completamente determinado por la configuración") y una "máquina de elección":
...cuyo movimiento está determinado sólo parcialmente por la configuración... Cuando una máquina de este tipo alcanza una de estas configuraciones ambiguas, no puede continuar hasta que un operador externo haya realizado una elección arbitraria. Este sería el caso si estuviéramos utilizando máquinas para tratar con sistemas axiomáticos.
— Lo indecidible , pág. 118
Turing (1936) no da más detalles, excepto en una nota a pie de página en la que describe cómo utilizar una máquina a para "encontrar todas las fórmulas demostrables del cálculo [de Hilbert]" en lugar de utilizar una máquina de elección. "Supone que las elecciones son siempre entre dos posibilidades 0 y 1. Cada prueba estará determinada entonces por una secuencia de elecciones i 1 , i 2 , ..., i n (i 1 = 0 o 1, i 2 = 0 o 1, ..., i n = 0 o 1), y por lo tanto el número 2 n + i 1 2 n-1 + i 2 2 n-2 + ... + i n determina completamente la prueba. La máquina automática lleva a cabo sucesivamente la prueba 1, la prueba 2, la prueba 3, ... " (Nota a pie de página ‡, The Undecidable , p. 138)
Esta es, de hecho, la técnica mediante la cual una máquina de Turing determinista (es decir, a-) puede utilizarse para imitar la acción de una máquina de Turing no determinista ; Turing resolvió el asunto en una nota a pie de página y parece descartarlo para mayor consideración.
Una máquina oráculo o máquina-o es una máquina-a de Turing que pausa su cálculo en el estado " o " mientras, para completar su cálculo, "espera la decisión" del "oráculo", una entidad no especificada por Turing "aparte de decir que no puede ser una máquina" (Turing (1939), Lo indecidible , p. 166-168).
Como escribió Turing en Lo indecidible , p. 128 (cursiva añadida):
Es posible inventar una única máquina que sirva para calcular cualquier secuencia computable. Si a esta máquina U se le suministra una cinta en cuyo comienzo está escrita la cadena de quíntuplos separados por punto y coma de alguna máquina de cálculo M , entonces U calculará la misma secuencia que M .
Este hallazgo hoy se da por sentado, pero en su momento (1936) se consideró asombroso. [ cita requerida ] El modelo de computación que Turing llamó su "máquina universal" - " U " para abreviar - es considerado por algunos (cf. Davis (2000)) como el avance teórico fundamental que condujo a la noción de la computadora con programa almacenado .
El artículo de Turing... contiene, en esencia, la invención de la computadora moderna y algunas de las técnicas de programación que la acompañaron.
— Minsky (1967), pág. 104
En términos de complejidad computacional , una máquina universal de Turing de múltiples cintas sólo necesita ser más lenta en un factor logarítmico en comparación con las máquinas que simula. Este resultado fue obtenido en 1966 por FC Hennie y RE Stearns . (Arora y Barak, 2009, teorema 1.9)
Las máquinas de Turing son más potentes que otros tipos de autómatas, como las máquinas de estados finitos y los autómatas de empuje . Según la tesis de Church-Turing , son tan potentes como las máquinas reales y pueden ejecutar cualquier operación que un programa real pueda ejecutar. Lo que se pasa por alto en esta afirmación es que, como una máquina real solo puede tener un número finito de configuraciones , no es más que una máquina de estados finitos, mientras que una máquina de Turing tiene una cantidad ilimitada de espacio de almacenamiento disponible para sus cálculos.
Hay varias maneras de explicar por qué las máquinas de Turing son modelos útiles de computadoras reales:
Una limitación de las máquinas de Turing es que no modelan bien las fortalezas de un arreglo particular. Por ejemplo, las computadoras modernas con programa almacenado son en realidad instancias de una forma más específica de máquina abstracta conocida como la máquina de programa almacenado de acceso aleatorio o modelo de máquina RASP. Al igual que la máquina universal de Turing, la RASP almacena su "programa" en una "memoria" externa a las "instrucciones" de su máquina de estados finitos. A diferencia de la máquina universal de Turing, la RASP tiene un número infinito de "registros" distinguibles, numerados pero ilimitados: "celdas" de memoria que pueden contener cualquier número entero (cf. Elgot y Robinson (1964), Hartmanis (1971), y en particular Cook-Rechow (1973); referencias en random-access machine ). La máquina de estados finitos de la RASP está equipada con la capacidad de direccionamiento indirecto (por ejemplo, el contenido de un registro puede usarse como una dirección para especificar otro registro); por lo tanto, el "programa" de la RASP puede direccionar cualquier registro en la secuencia de registros. El resultado de esta distinción es que existen optimizaciones computacionales que se pueden realizar en función de los índices de memoria, que no son posibles en una máquina de Turing general; por lo tanto, cuando se utilizan máquinas de Turing como base para limitar los tiempos de ejecución, se puede demostrar un "límite inferior falso" en los tiempos de ejecución de ciertos algoritmos (debido al supuesto de simplificación falsa de una máquina de Turing). Un ejemplo de esto es la búsqueda binaria , un algoritmo que se puede demostrar que funciona más rápidamente cuando se utiliza el modelo de cálculo RASP en lugar del modelo de máquina de Turing.
En los primeros tiempos de la informática, el uso de las computadoras se limitaba generalmente al procesamiento por lotes , es decir, tareas no interactivas, cada una de las cuales generaba datos de salida a partir de datos de entrada dados. La teoría de la computabilidad, que estudia la computabilidad de las funciones desde las entradas hasta las salidas, y para la cual se inventaron las máquinas de Turing, refleja esta práctica.
Desde la década de 1970, el uso interactivo de las computadoras se ha vuelto mucho más común. En principio, es posible modelar esto haciendo que un agente externo lea la cinta y escriba en ella al mismo tiempo que una máquina de Turing, pero esto rara vez coincide con la forma en que ocurre realmente la interacción; por lo tanto, al describir la interactividad, generalmente se prefieren alternativas como los autómatas de E/S .
El modelo aritmético de cálculo difiere del modelo de Turing en dos aspectos: [20] : 32
Algunos algoritmos se ejecutan en tiempo polinómico en un modelo pero no en el otro. Por ejemplo:
Sin embargo, si un algoritmo se ejecuta en tiempo polinomial en el modelo aritmético y, además, la longitud binaria de todos los números involucrados es polinomial en la longitud de la entrada, entonces siempre es tiempo polinomial en el modelo de Turing. Se dice que un algoritmo de este tipo se ejecuta en tiempo fuertemente polinomial .
Robin Gandy (1919-1995), alumno de Alan Turing (1912-1954) y su amigo de toda la vida, rastrea el linaje de la noción de "máquina calculadora" hasta Charles Babbage (circa 1834) y, de hecho, propone la "Tesis de Babbage":
Que todo el desarrollo y las operaciones de análisis ahora pueden ser ejecutados por máquinas .
— (cursiva en Babbage, citado por Gandy, p. 54)
El análisis de Gandy de la máquina analítica de Babbage describe las siguientes cinco operaciones (cf. p. 52-53):
Gandy afirma que "las funciones que pueden calcularse mediante (1), (2) y (4) son precisamente aquellas que son computables mediante el método de Turing " (p. 53). Cita otras propuestas de "máquinas calculadoras universales", incluidas las de Percy Ludgate (1909), Leonardo Torres Quevedo (1914), [21] [22] Maurice d'Ocagne (1922), Louis Couffignal (1933), Vannevar Bush (1936), Howard Aiken (1937). Sin embargo:
… el énfasis está puesto en programar una secuencia iterable fija de operaciones aritméticas. No se reconoce la importancia fundamental de la iteración condicional y de la transferencia condicional para una teoría general de las máquinas de cálculo…
— Gandy pág. 55
En relación con los problemas de Hilbert planteados por el famoso matemático David Hilbert en 1900, un aspecto del problema n.° 10 había estado dando vueltas durante casi 30 años antes de que se formulara con precisión. La expresión original de Hilbert para el n.° 10 es la siguiente:
10. Determinación de la solubilidad de una ecuación diofántica . Dada una ecuación diofántica con cualquier número de incógnitas y con coeficientes enteros racionales: Idear un proceso según el cual se pueda determinar en un número finito de operaciones si la ecuación es resoluble en números enteros racionales. El Entscheidungsproblem [problema de decisión para lógica de primer orden ] se resuelve cuando conocemos un procedimiento que permite que cualquier expresión lógica dada decida mediante un número finito de operaciones su validez o satisfacibilidad... El Entscheidungsproblem debe considerarse el principal problema de la lógica matemática.
— citado, con esta traducción y el original en alemán, en Dershowitz y Gurevich, 2008
En 1922, esta noción de " problema de entscheidung " se había desarrollado un poco y H. Behmann afirmó que
...la forma más general del Entscheidungsproblem [es] la siguiente:
Se requiere una prescripción bastante definida y de aplicación general que permita decidir en un número finito de pasos la verdad o falsedad de una afirmación puramente lógica dada...
— Gandy p. 57, citando a Behmann
Behmann señala que... el problema general es equivalente al problema de decidir qué proposiciones matemáticas son verdaderas.
— ibíd.
Si uno fuera capaz de resolver el Entscheidungsproblem entonces tendría un "procedimiento para resolver muchos (o incluso todos) los problemas matemáticos".
— ibíd. , pág. 92
En el congreso internacional de matemáticos de 1928, Hilbert "formuló sus preguntas con bastante precisión. En primer lugar, ¿las matemáticas eran completas ?... En segundo lugar, ¿las matemáticas eran consistentes ?... Y en tercer lugar, ¿las matemáticas eran decidibles ?" (Hodges, pág. 91; Hawking, pág. 1121). Las dos primeras preguntas fueron respondidas en 1930 por Kurt Gödel en la misma reunión en la que Hilbert pronunció su discurso de retiro (para gran disgusto de Hilbert); la tercera -el Entscheidungsproblem- tuvo que esperar hasta mediados de los años treinta.
El problema era que una respuesta requería primero una definición precisa de "prescripción general aplicable definida", que el profesor de Princeton Alonzo Church llegaría a llamar " calculabilidad efectiva ", y en 1928 no existía tal definición. Pero durante los siguientes 6-7 años Emil Post desarrolló su definición de un trabajador que se mueve de una habitación a otra escribiendo y borrando marcas según una lista de instrucciones (Post 1936), como lo hicieron Church y sus dos estudiantes Stephen Kleene y JB Rosser mediante el uso del cálculo lambda de Church y la teoría de la recursión de Gödel (1934). El artículo de Church (publicado el 15 de abril de 1936) demostró que el Entscheidungsproblem era de hecho "indecidible" [23] y se adelantó a Turing por casi un año (el artículo de Turing presentado el 28 de mayo de 1936, publicado en enero de 1937). Mientras tanto, Emil Post presentó un breve artículo en el otoño de 1936, por lo que Turing al menos tenía prioridad sobre Post. Mientras Church evaluaba el artículo de Turing, Turing tuvo tiempo de estudiarlo y agregar un apéndice donde esbozaba una prueba de que el cálculo lambda de Church y sus máquinas calcularían las mismas funciones.
Pero lo que Church había hecho era algo bastante diferente, y en cierto sentido más débil. ... la construcción de Turing era más directa y proporcionaba un argumento a partir de los primeros principios, cerrando la brecha en la demostración de Church.
— Hodges pág. 112
Y Post sólo había propuesto una definición de calculabilidad y criticado la "definición" de Church, pero no había probado nada.
En la primavera de 1935, Turing, como joven estudiante de maestría en el King's College, Cambridge , aceptó el desafío; había sido estimulado por las conferencias del lógico MHA Newman "y había aprendido de ellas sobre el trabajo de Gödel y el Entscheidungsproblem ... Newman usó la palabra 'mecánico' ... En su obituario de Turing de 1955, Newman escribe:
A la pregunta "¿qué es un proceso "mecánico"?", Turing respondió con la típica frase "algo que puede realizar una máquina" y se embarcó en la muy agradable tarea de analizar el concepto general de máquina de computación.
— Gandy, pág. 74
Gandy afirma que:
Supongo, pero no lo sé, que Turing, desde el comienzo de su trabajo, tuvo como objetivo probar la indecidibilidad del Entscheidungsproblem. Me dijo que la "idea principal" del artículo se le ocurrió cuando estaba tumbado en los prados de Grantchester en el verano de 1935. La "idea principal" podría haber sido su análisis de la computación o su descubrimiento de que existía una máquina universal y, por tanto, un argumento diagonal para demostrar la insolubilidad.
— ibíd. , pág. 76
Aunque Gandy creía que la afirmación de Newman anterior era "engañosa", no todos comparten esta opinión. Turing siempre había tenido interés por las máquinas: "Alan había soñado con inventar máquinas de escribir cuando era niño; [su madre] la señora Turing tenía una máquina de escribir; y bien podría haber empezado por preguntarse qué significaba llamar "mecánica" a una máquina de escribir" (Hodges, pág. 96). Mientras cursaba su doctorado en Princeton, Turing construyó un multiplicador de lógica booleana (véase más abajo). Su tesis doctoral, titulada " Sistemas de lógica basados en ordinales ", contiene la siguiente definición de "una función computable":
Se ha afirmado anteriormente que «una función es efectivamente calculable si sus valores pueden hallarse mediante algún proceso puramente mecánico». Podemos tomar esta afirmación en sentido literal, entendiendo por proceso puramente mecánico aquel que podría ser llevado a cabo por una máquina. Es posible dar una descripción matemática, en cierta forma normal, de las estructuras de estas máquinas. El desarrollo de estas ideas conduce a la definición del autor de una función computable y a una identificación de la computabilidad con la calculabilidad efectiva. No es difícil, aunque algo laborioso, demostrar que estas tres definiciones [la tercera es el cálculo λ] son equivalentes.
— Turing (1939) en Lo indecidible , pág. 160
Alan Turing inventó la "máquina a" (máquina automática) en 1936. [7] Turing presentó su artículo el 31 de mayo de 1936 a la London Mathematical Society para sus Actas (cf. Hodges 1983:112), pero se publicó a principios de 1937 y las separatas estuvieron disponibles en febrero de 1937 (cf. Hodges 1983:129). Fue el asesor doctoral de Turing, Alonzo Church , quien más tarde acuñó el término "máquina de Turing" en una revisión. [10] Con este modelo, Turing pudo responder negativamente a dos preguntas:
De esta manera, al proporcionar una descripción matemática de un dispositivo muy simple capaz de realizar cálculos arbitrarios, pudo demostrar propiedades de la computación en general y, en particular, la incomputabilidad del Entscheidungsproblem ('problema de decisión'). [13]
Cuando Turing regresó al Reino Unido, se convirtió en el responsable conjunto de descifrar los códigos secretos alemanes creados por las máquinas de cifrado llamadas "Enigma"; también participó en el diseño de la ACE ( Automatic Computing Engine ), "la propuesta de la ACE [de Turing] era efectivamente autónoma, y sus raíces no se encontraban en la EDVAC [iniciativa de los EE. UU.], sino en su propia máquina universal" (Hodges, p. 318). Todavía continúan los debates sobre el origen y la naturaleza de lo que Kleene (1952) denominó la tesis de Turing . Pero lo que Turing demostró con su modelo de máquina computacional aparece en su artículo " Sobre los números computables, con una aplicación al problema de la entscheidung " (1937):
[que] el problema de determinación de Hilbert no puede tener solución... Propongo, por tanto, demostrar que no puede haber un proceso general para determinar si una fórmula dada U del cálculo funcional K es demostrable, es decir, que no puede haber ninguna máquina que, suministrada con cualquiera de estas fórmulas U, diga eventualmente si U es demostrable.
— del artículo de Turing reproducido en The Undecidable , pág. 145
El ejemplo de Turing (su segunda prueba): si uno pide un procedimiento general que nos diga: "¿Esta máquina alguna vez imprime 0?", la pregunta es "indecidible".
En 1937, mientras trabajaba en su tesis doctoral en Princeton, Turing construyó un multiplicador digital (lógica booleana) desde cero, fabricando sus propios relés electromecánicos (Hodges p. 138). "La tarea de Alan era incorporar el diseño lógico de una máquina de Turing en una red de interruptores operados por relés..." (Hodges p. 138). Si bien Turing puede haber sido inicialmente curioso y experimental, se estaba realizando un trabajo bastante serio en la misma dirección en Alemania ( Konrad Zuse (1938)), y en los Estados Unidos ( Howard Aiken ) y George Stibitz (1937); los frutos de sus trabajos fueron utilizados tanto por los ejércitos del Eje como por los Aliados en la Segunda Guerra Mundial (cf. Hodges p. 298-299). A principios y mediados de la década de 1950, Hao Wang y Marvin Minsky redujeron la máquina de Turing a una forma más simple (un precursor de la máquina Post-Turing de Martin Davis ); Al mismo tiempo, los investigadores europeos reducían la novedosa computadora electrónica a un objeto teórico similar a una computadora, equivalente a lo que ahora se denominaba una "máquina de Turing". A fines de la década de 1950 y principios de la de 1960, los desarrollos coincidentemente paralelos de Melzak y Lambek (1961), Minsky (1961) y Shepherdson y Sturgis (1961) llevaron el trabajo europeo más allá y redujeron la máquina de Turing a un modelo abstracto más amigable y similar a una computadora, llamado la máquina contadora ; Elgot y Robinson (1964), Hartmanis (1971), Cook y Reckhow (1973) llevaron este trabajo aún más lejos con los modelos de máquina de registro y máquina de acceso aleatorio , pero básicamente todos son simplemente máquinas de Turing de múltiples cintas con un conjunto de instrucciones de tipo aritmético.
En la actualidad, las máquinas contadoras, registradoras y de acceso aleatorio y su antecesora, la máquina de Turing, siguen siendo los modelos preferidos por los teóricos que investigan cuestiones de la teoría de la computación . En particular, la teoría de la complejidad computacional hace uso de la máquina de Turing:
Dependiendo de los objetos que uno desea manipular en los cálculos (números como enteros no negativos o cadenas alfanuméricas), dos modelos han obtenido una posición dominante en la teoría de la complejidad basada en máquinas:
la máquina de Turing multicinta fuera de línea ..., que representa el modelo estándar para la computación orientada a cadenas, y la máquina de acceso aleatorio (RAM) introducida por Cook y Reckhow..., que modela la computadora idealizada de estilo Von Neumann.
—Van Emde Boas 1990:4
Sólo en el área relacionada con el análisis de algoritmos, este papel lo asume el modelo RAM.
—Van Emde Boas 1990:16