La integridad de Turing dice una cosa y solo una cosa: un modelo de cómputo es completo de Turing, si cualquier cálculo que pueda ser modelado por una máquina de Turing también puede ser modelado por ese modelo.
Entonces, ¿cuáles son los cálculos que puede modelar una máquina de Turing? Bueno, ante todo, Alan Turing y todos sus colegas solo estaban interesados en las funciones de los números naturales. Entonces, la máquina de Turing (y el cálculo λ, el cálculo del combinador SK, las funciones recursivas μ, ...) solo hablan sobre la computabilidad de las funciones en números naturales. Si no está hablando de una función en números naturales, entonces el concepto de integridad de Turing ni siquiera tiene sentido, simplemente no es aplicable.
Sin embargo, tenga en cuenta que podemos codificar muchas cosas interesantes como números naturales. Podemos codificar cadenas como números naturales, podemos codificar gráficos como números naturales, podemos codificar booleanos como números naturales. ¡Podemos codificar Máquinas de Turing como números naturales, lo que nos permite crear Máquinas de Turing que hablen de Máquinas de Turing!
Y, por supuesto, no todas las funciones en números naturales son computables. Una máquina de Turing solo puede calcular algunas funciones en números naturales, el cálculo λ solo puede calcular algunas funciones en números naturales, el cálculo del combinador SK solo puede calcular algunas funciones en números naturales, ... Sorprendentemente (o no), resulta que cada modelo de computación (que en realidad es realizable en nuestro universo físico) puede computar las mismas funciones en números naturales (al menos para todos los modelos que hemos encontrado hasta ahora). [Nota: obviamente, hay modelos de computación más débiles , pero aún no hemos encontrado uno que sea más fuerte, excepto algunos que obviamente son incompatibles con nuestro universo físico, como los modelos que usan números reales o viajes en el tiempo.]
Este hecho, que después de un largo tiempo de búsqueda de muchos modelos diferentes, encontramos, cada vez, que pueden calcular exactamente las mismas funciones, es la base de la Tesis de Turing de la Iglesia, que dice (aproximadamente) que todos Los modelos de computación son igualmente poderosos y todos ellos capturan la noción "ideal" de lo que significa ser "computable". (También hay un segundo aspecto más filosófico de la CTT, a saber, que un humano que sigue un algoritmo también puede calcular exactamente las mismas funciones que una TM puede calcular y nada más).
Sin embargo , nada de esto dice nada sobre
- qué tan eficientes son los distintos modelos
- qué tan convenientes son para usar
- qué más pueden hacer además de calcular funciones en los números naturales
Y ahí es precisamente donde entran en juego las diferencias entre los diferentes modelos de computación (y lenguajes de programación).
Como ejemplo de rendimiento diferente, tanto una máquina de acceso aleatorio como una máquina de Turing pueden copiar una matriz. Pero, una RAM necesita para hacer eso, mientras que un TM necesita , ya que necesita omitir los elementos de la matriz para copiar cada elemento , y hay elementos para copiar.O(sizearray)O(size2array)sizearraysizearray
Como ejemplo para una conveniencia diferente, puede comparar el código escrito en un lenguaje de muy alto nivel, el código escrito en ensamblador y la descripción de un TM para resolver el mismo problema.
Y su interruptor de luz es un ejemplo del tercer tipo de diferencia, cosas que algunos modelos pueden hacer que no son funciones en números naturales y, por lo tanto, no tienen nada que ver con la integridad de Turing.
Para responder a sus preguntas específicas:
¿Pero puede algún programa escrito en un lenguaje completo de Turing ser reescrito en otro?
No. Solo si el programa calcula una función computable de Turing en números naturales. E incluso entonces, podría necesitar una codificación compleja. Por ejemplo, el cálculo λ ni siquiera tiene números naturales, deben codificarse utilizando funciones (porque las funciones son lo único que tiene el cálculo λ).
Esta codificación de la entrada y la salida puede ser muy compleja, al igual que expresar el algoritmo. Entonces, si bien es cierto que cualquier programa puede reescribirse, el programa reescrito puede ser mucho más complejo, mucho más grande, usar mucha más memoria y ser mucho más lento.
¿Qué sucede si mi Asamblea tiene un código de operación LIGHTBUTTON? Físicamente no puedo emular ese idioma en un sistema (idioma) sin una bombilla.
Una bombilla no es una función computable de Turing en números naturales. Realmente, una bombilla no es ni una función ni un cálculo. Encender y apagar una bombilla es un efecto secundario de E / S. Las máquinas de Turing no modelan los efectos secundarios de E / S, y Turing-completo no es relevante para ellos.
En números reales arbitrarios.
La integridad de Turing solo se ocupa de funciones computables en números naturales, no se ocupa de números reales.
La integridad de Turing simplemente no es muy interesante cuando se trata de preguntas como la suya por dos razones:
- No es un obstáculo muy alto. Todo lo que necesita es
IF
, GOTO
, WHILE
, y una variable único entero (suponiendo que la variable puede contener arbitrariamente grandes números enteros). O recursión. Montones, montones y montones de cosas es completo de Turing. El juego de cartas Magic: The Gathering está completo. CSS3 es Turing completo. El sendmail
archivo de configuración es Turing completo. El Intel x86 MMU es Turing completo. La MOV
instrucción Intel x86 es completa de Turing. Las animaciones de PowerPoint son Turing-complete. Excel (sin secuencias de comandos, solo con fórmulas) es Turing-complete. El protocolo de enrutamiento BGP es Turing completo. sed
está Turing completo. Las mod_rewrite
reglas de Apache son Turing-complete. Google para " (accidental o sorprendentemente) turing completo"para encontrar otros ejemplos interesantes. Si casi todo es Turing-complete, ser Turing-complete deja de ser una propiedad interesante.
- En realidad no es necesario ser útil. Muchas cosas útiles no son completas para Turing. CSS antes de la versión 3 no es Turing completo (y el hecho de que CSS3 es en realidad no es utilizado por nadie). SQL antes de 1999 no estaba completo de Turing, sin embargo, fue tremendamente útil incluso entonces. El lenguaje de programación C sin bibliotecas adicionales no parece ser Turing completo . Los lenguajes de tipo dependiente son, más o menos por definición, no completos de Turing, sin embargo, puede escribir sistemas operativos, servidores web y juegos en ellos.
Edwin Brady, el autor de Idris, usa el término "Tetris-complete" para hablar sobre algunos de estos aspectos. Estar Tetris completo no está rigurosamente definido (aparte del obvio "se puede usar para implementar Tetris"), pero abarca cosas como ser lo suficientemente alto y expresivo como para poder escribir un juego sin volverse loco, ser capaz de interactuar con el mundo exterior (entrada y salida), ser capaz de expresar efectos secundarios, ser capaz de escribir un bucle de eventos, ser capaz de expresar programación reactiva, asíncrona y concurrente, ser capaz de interactuar con el sistema operativo, ser capaz de para interactuar con bibliotecas extranjeras (en otras palabras: poder llamar y ser llamado por código C) y así sucesivamente. Esas son características mucho más interesantes de un lenguaje de programación de propósito general que la integridad de Turing.
Puede encontrar interesante mi respuesta a la pregunta que ha vinculado , que toca algunos de los mismos puntos aunque responda una pregunta diferente.