Tenga en cuenta que, aunque sé programar, soy un principiante en la teoría de CS.
De acuerdo con esta respuesta
La integridad de Turing es un concepto abstracto de computabilidad. Si un idioma es completo de Turing, entonces es capaz de hacer cualquier cálculo que cualquier otro lenguaje completo de Turing puede hacer.
Y cualquier programa escrito en cualquier idioma completo de Turing puede reescribirse en otro .
Okay. Esto tiene sentido. Puedo traducir (compilar) C en ensamblaje (¡y lo hago todos los días!), Y puedo traducir ensamblar en C (puede escribir una máquina virtual en C). Y lo mismo se aplica a cualquier otro idioma: puede compilar cualquier idioma en ensamblador y luego ejecutarlo en una máquina virtual escrita en otro idioma.
¿Pero puede algún programa escrito en un lenguaje completo de Turing ser reescrito en otro?
¿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.
Okay. Entonces dirá que, dado que estamos tratando con la teoría de la computadora , no estamos discutiendo las limitaciones del dispositivo físico.
Pero, ¿qué pasa con un dispositivo que no tiene multiplicación? ¿división? A lo mejor de mi conocimiento (aunque esto es más una pregunta para matemáticas. SE), uno no puede emular la multiplicación (y definitivamente no la división) con suma y resta [1].
Entonces, ¿cómo un "lenguaje completo de turing" (que puede sumar, restar y saltar) emularía otro idioma que pueda sumar, restar, multiplicar y saltar?
EDITAR
[1] En números reales arbitrarios.
Respuestas:
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
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) sizearray sizearray
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:
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.
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.
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:
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. Elsendmail
archivo de configuración es Turing completo. El Intel x86 MMU es Turing completo. LaMOV
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. Lasmod_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.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.
fuente
Por supuesto, puede implementar la multiplicación con suma y resta:
El hecho de que probablemente no haría eso no lo hace menos posible.
La división es apenas más difícil:
¿Y cómo crees que la multiplicación y la división se realizan realmente en los circuitos de la CPU? Sugerencia: no es una tabla de búsqueda enorme. Es más eficiente que lo anterior, ya que también se usa el desplazamiento de bits, pero se implementa fundamentalmente en términos de suma y resta.
fuente
Ninguna máquina física (realmente existente) está o puede estar completa en Turing, porque la integridad de Turing requiere almacenamiento infinito y el universo no es infinito.
De esto se deduce que la respuesta afirmativa a si dos máquinas abstractas son equivalentes no ayuda a responder la pregunta de si dos aproximaciones físicas de esas máquinas son equivalentes.
Por lo tanto, la equivalencia de Turing de los modelos abstractos de (por ejemplo) dos idiomas no significa que cada uno pueda calcular todo lo que el otro puede calcular en la práctica. Uno puede encontrarse con limitaciones físicas antes que el otro.
fuente
Se podría aplicar la multiplicación y división como adición repetida y la resta, respectivamente, observando que y .m / n = 1 + ( m - n ) / nnm=n+n(m−1) m/n=1+(m−n)/n
De hecho, las operaciones "sumar 1", "restar 1" y "salto condicional si un registro especificado es cero" son suficientes para hacer que un modelo computacional sea Turing completo (ver la máquina de 2 contadores como referencia para un modelo computacional completo de Turing muy mínimo).
También es posible implementarlos de una manera que conserve la complejidad computacional. En primer lugar, observe que la multiplicación por es "libre" ( ). Usando la multiplicación por , el bucle y la resta, podemos implementar fácilmente el algoritmo euclidiano para la división por dos. Con la multiplicación y división por dos, podemos implementar el algoritmo ruso para la multiplicación, observando que y . Con la multiplicación arbitraria, finalmente podemos implementar el algoritmo euclidiano completo para la división.2 n = n + n 2 m × 2 n = 2 m × n m × ( 2 n + 1 ) = m + 2 m × n2 2n=n+n 2 m×2n=2m×n m×(2n+1)=m+2m×n
fuente
tl; dr : las máquinas de Turing son solo una descripción lógica básica para el funcionamiento de un sistema lógico general. Pueden hacer la mayoría de las cosas que podemos describir, incluyendo llamar a códigos de operación especializados y operaciones matemáticas construidas.
En un modelo de Turing, los símbolos como un
LIGHTBUTTON
código de operación son solo cadenas en cualquier alfabeto que use la computadora de Turing.Entonces, la máquina Turing sería responsable de producir la cadena
"LIGHTBUTTON"
, o algún valor entero que corresponda a ese código de operación; si una entidad externa actúa o no, no es asunto de la computadora Turing.Los programas C tienen la misma limitación. Esto es, un programa en C solo puede llamar al código de operación
LIGHTBUTTON
, sin embargo si la CPU realmente realiza o no una operación asociada con ese código de operación depende de la CPU.Sí, una máquina de Turing podría hacer esas cosas, incluso en números reales, en la medida en que cualquier lógica descriptiva por humanos podría hacerlo. La máquina de Turing podría ser tan simple como una automatización celular de la Regla 110 .
El truco es construir un sistema lógico a partir de cualquier física que la máquina tenga naturalmente. Por ejemplo, las CPU convencionales pueden multiplicar y dividir porque tienen una unidad lógica aritmética (ALU) . Pero los ALU no son mágicos; son simplemente puertas lógicas simples . Y esas puertas lógicas están hechas de transistores . Y esos transistores están hechos de arena dopada .
Entonces, para obtener un dispositivo completo de Turing para hacer matemáticas, solo tengo que programarlo de esa manera.
fuente
Si la entrada al programa es una secuencia de bits arbitrariamente larga y la salida también es una secuencia de bits arbitrariamente larga, entonces SÍ. Suponiendo que tiene el tiempo y la energía para reescribirlo, y que no le importa el rendimiento, y que tiene suficiente memoria física para ambas implementaciones.
Las consideraciones prácticas que significan que dos idiomas completos de Turing no son intercambiables incluyen:
admiten diferentes tipos de entrada y salida (por ejemplo, acceso a bases de datos SQL)
tienen diferentes bibliotecas de tipos de datos (por ejemplo, soporte para cadenas Unicode)
Proporcionan diferentes paradigmas de programación optimizados para diferentes tareas (por ejemplo, objetos, subprocesos, corutinas, funciones de primera clase)
Proporcionan diferentes bibliotecas de funciones (por ejemplo, análisis y serialización XML)
fuente
No. La integridad de Turing no tiene nada que ver con los programas , se trata de funciones matemáticas (o algoritmos ). Cualquier algoritmo, cualquier cálculo , puede hacerlo en C, puede hacerlo en cualquier otro lenguaje completo de Turing (esto debería ser obvio). Pero la integridad de Turing en realidad no dice que pueda hacer E / S, en absoluto. No habla del hardware en absoluto. Solo los cálculos.
Puede extender un lenguaje completo de Turing con cualquier operación de hardware que desee (técnicamente, así es
fputc
y cómofgetc
funciona en C). Si toma dos idiomas completos de Turing y los extiende con operaciones idénticas específicas de hardware, entonces permanecen intercambiables. Por lo tanto, su lenguaje ensamblador conLIGHTBULB
operación es más poderoso que Turing-complete; se podría decir que se ha terminado TuringLIGHTBULB
. Para hacer que cualquier otro idioma sea idéntico al mismo, también debe completarse TuringLIGHTBULB
; la forma más fácil de hacerlo es agregarle unaLIGHTBULB
primitiva / instrucción / función / etc.Esta es la razón por la cual las implementaciones de C generalmente admiten ensamblador en línea o documentan una forma de llamar a funciones escritas en ensamblador, y por qué las implementaciones de otros lenguajes generalmente proporcionan una forma de llamar a funciones escritas en C.
fuente