stringtranslate.com

Completitud de Turing

En la teoría de la computabilidad , se dice que un sistema de reglas de manipulación de datos (como un modelo de computación , un conjunto de instrucciones de computadora , un lenguaje de programación o un autómata celular ) es Turing-completo o computacionalmente universal si se puede usar para simular cualquier máquina de Turing [ cita requerida ] (ideada por el matemático y científico informático inglés Alan Turing ). Esto significa que este sistema es capaz de reconocer o decodificar otros conjuntos de reglas de manipulación de datos. La completitud de Turing se usa como una forma de expresar el poder de dicho conjunto de reglas de manipulación de datos. Virtualmente todos los lenguajes de programación actuales son Turing-completos. [a]

Un concepto relacionado es el de equivalencia de Turing  : dos computadoras P y Q se consideran equivalentes si P puede simular Q y Q puede simular P. [ cita requerida ] La tesis de Church-Turing conjetura que cualquier función cuyos valores puedan ser calculados por un algoritmo puede ser calculada por una máquina de Turing y, por lo tanto, que si cualquier computadora del mundo real puede simular una máquina de Turing, es equivalente de Turing a una máquina de Turing. Una máquina de Turing universal puede usarse para simular cualquier máquina de Turing y, por extensión, los aspectos puramente computacionales de cualquier posible computadora del mundo real. [ cita requerida ]

Para demostrar que algo es Turing-completo, basta con demostrar que puede utilizarse para simular algún sistema Turing-completo. Ningún sistema físico puede tener memoria infinita, pero si se ignora la limitación de la memoria finita, la mayoría de los lenguajes de programación son Turing-completos. [ cita requerida ]

Uso no matemático

En el lenguaje coloquial , los términos "Turing completo" y "Turing equivalente" se utilizan para indicar que cualquier ordenador o lenguaje informático de uso general del mundo real puede simular aproximadamente los aspectos computacionales de cualquier otro ordenador o lenguaje informático de uso general del mundo real. En la vida real, esto conduce a los conceptos prácticos de virtualización y emulación informática . [ cita requerida ]

Los ordenadores reales construidos hasta ahora pueden analizarse funcionalmente como una máquina de Turing de una sola cinta (que utiliza una "cinta" como memoria); por lo tanto, las matemáticas asociadas pueden aplicarse abstrayendo su funcionamiento lo suficiente. Sin embargo, los ordenadores reales tienen recursos físicos limitados, por lo que solo son autómatas lineales completos. En contraste, la abstracción de un ordenador universal se define como un dispositivo con un conjunto de instrucciones Turing-completo, memoria infinita y tiempo disponible infinito. [ cita requerida ]

Definiciones formales

En la teoría de la computabilidad , se utilizan varios términos estrechamente relacionados para describir la potencia computacional de un sistema computacional (como una máquina abstracta o un lenguaje de programación ):

Completitud de Turing
Un sistema computacional que puede calcular todas las funciones computables por Turing se denomina Turing-completo (o Turing-poderoso). Alternativamente, un sistema de este tipo es aquel que puede simular una máquina de Turing universal .
Equivalencia de Turing
Un sistema Turing-completo se denomina Turing-equivalente si cada función que puede calcular también es Turing-computable; es decir, calcula exactamente la misma clase de funciones que las máquinas de Turing . Alternativamente, un sistema Turing-equivalente es aquel que puede simular, y ser simulado por, una máquina de Turing universal. (Todos los sistemas Turing-completos físicamente implementables conocidos son Turing-equivalentes, lo que añade apoyo a la tesis de Church-Turing . [ cita requerida ] )
Universalidad (computacional)
Un sistema se denomina universal con respecto a una clase de sistemas si puede calcular todas las funciones que pueden calcular los sistemas de esa clase (o puede simular cada uno de esos sistemas). Normalmente, el término "universalidad" se utiliza tácitamente con respecto a una clase de sistemas Turing-completos. El término "débilmente universal" se utiliza a veces para distinguir un sistema (por ejemplo, un autómata celular ) cuya universalidad se logra únicamente modificando la definición estándar de máquina de Turing de modo que incluya flujos de entrada con una cantidad infinita de 1.

Historia

La completitud de Turing es importante porque cada diseño del mundo real para un dispositivo informático puede ser simulado por una máquina de Turing universal . La tesis de Church-Turing afirma que se trata de una ley de las matemáticas: una máquina de Turing universal puede, en principio, realizar cualquier cálculo que cualquier otro ordenador programable pueda. Esto no dice nada sobre el esfuerzo necesario para escribir el programa , ni sobre el tiempo que puede llevar a la máquina realizar el cálculo, ni sobre las capacidades que pueda poseer la máquina que no tengan nada que ver con la computación.

La máquina analítica de Charles Babbage (década de 1830) habría sido la primera máquina Turing-completa si se hubiera construido en la época en que fue diseñada. Babbage apreciaba que la máquina era capaz de grandes hazañas de cálculo, incluido el razonamiento lógico primitivo, pero no apreciaba que ninguna otra máquina pudiera hacerlo mejor. [ cita requerida ] Desde la década de 1830 hasta la de 1940, se construyeron y mejoraron máquinas calculadoras mecánicas como sumadores y multiplicadores, pero no podían realizar una bifurcación condicional y, por lo tanto, no eran Turing-completas.

A finales del siglo XIX, Leopold Kronecker formuló nociones de computabilidad, definiendo funciones recursivas primitivas . Estas funciones pueden calcularse mediante cálculos de memoria, pero no son suficientes para crear una computadora universal, porque las instrucciones que las calculan no permiten un bucle infinito. A principios del siglo XX, David Hilbert dirigió un programa para axiomatizar todas las matemáticas con axiomas precisos y reglas lógicas precisas de deducción que pudieran ser realizadas por una máquina. Pronto quedó claro que un pequeño conjunto de reglas de deducción es suficiente para producir las consecuencias de cualquier conjunto de axiomas. Kurt Gödel demostró en 1930 que estas reglas eran suficientes para producir todos los teoremas.

La noción real de computación fue aislada poco después, comenzando con el teorema de incompletitud de Gödel . Este teorema mostró que los sistemas axiomáticos estaban limitados al razonar sobre el cálculo que deduce sus teoremas. Church y Turing demostraron independientemente que el Entscheidungsproblem (problema de decisión) de Hilbert era irresoluble, [2] identificando así el núcleo computacional del teorema de incompletitud. Este trabajo, junto con el trabajo de Gödel sobre funciones recursivas generales , estableció que hay conjuntos de instrucciones simples, que, cuando se juntan, son capaces de producir cualquier cálculo. El trabajo de Gödel mostró que la noción de computación es esencialmente única.

En 1941, Konrad Zuse completó la computadora Z3 . Zuse no estaba familiarizado con el trabajo de Turing sobre computabilidad en ese momento. En particular, la Z3 carecía de funciones dedicadas a un salto condicional, lo que impedía que fuera completa en términos de Turing. Sin embargo, en 1998, Rojas demostró que la Z3 es capaz de simular saltos condicionales y, por lo tanto, en teoría, completa en términos de Turing. Para hacer esto, su programa en cinta tendría que ser lo suficientemente largo como para ejecutar cada ruta posible a través de ambos lados de cada rama. [3]

El primer ordenador capaz de realizar ramificaciones condicionales en la práctica, y por tanto de realizar operaciones de Turing completas en la práctica, fue el ENIAC en 1946. El ordenador Z4 de Zuse estuvo operativo en 1945, pero no admitió ramificaciones condicionales hasta 1950. [4]

Teoría de la computabilidad

La teoría de la computabilidad utiliza modelos de computación para analizar problemas y determinar si son computables y bajo qué circunstancias. El primer resultado de la teoría de la computabilidad es que existen problemas para los cuales es imposible predecir qué hará un sistema (completo en el sentido de Turing) en un período de tiempo arbitrariamente largo.

El ejemplo clásico es el problema de la detención : crear un algoritmo que tome como entrada un programa en un lenguaje Turing-completo y algunos datos que se le van a suministrar , y determinar si el programa, que opera sobre la entrada, se detendrá eventualmente o continuará para siempre. Es trivial crear un algoritmo que pueda hacer esto para algunas entradas, pero es imposible hacerlo en general. Para cualquier característica de la salida final del programa, es imposible determinar si esta característica se mantendrá.

Esta imposibilidad plantea problemas a la hora de analizar programas informáticos del mundo real. Por ejemplo, no se puede crear una herramienta que proteja por completo a los programadores de escribir bucles infinitos o que proteja a los usuarios de proporcionar datos que causarían bucles infinitos.

En cambio, se puede limitar un programa para que se ejecute solo durante un período fijo de tiempo ( timeout ) o limitar el poder de las instrucciones de control de flujo (por ejemplo, proporcionando solo bucles que iteren sobre los elementos de una matriz existente). Sin embargo, otro teorema muestra que hay problemas solucionables por lenguajes Turing-completos que no pueden ser resueltos por ningún lenguaje con solo capacidades finitas de bucles (es decir, lenguajes que garantizan que cada programa eventualmente terminará en una parada). Por lo tanto, cualquier lenguaje de este tipo no es Turing-completo. Por ejemplo, un lenguaje en el que se garantiza que los programas se completen y se detengan no puede calcular la función computable producida por el argumento diagonal de Cantor en todas las funciones computables en ese lenguaje.

Oráculos de Turing

Una computadora con acceso a una cinta infinita de datos puede ser más poderosa que una máquina de Turing: por ejemplo, la cinta podría contener la solución al problema de detención o algún otro problema indecidible según Turing. Una cinta infinita de datos de este tipo se llama oráculo de Turing . Incluso un oráculo de Turing con datos aleatorios no es computable ( con probabilidad 1 ), ya que solo hay una cantidad contable de cálculos, pero una cantidad incontable de oráculos. Por lo tanto, una computadora con un oráculo de Turing aleatorio puede calcular cosas que una máquina de Turing no puede.

Física digital

Todas las leyes conocidas de la física tienen consecuencias que se pueden calcular mediante una serie de aproximaciones en una computadora digital. Una hipótesis llamada física digital afirma que esto no es casualidad, ya que el universo mismo se puede calcular en una máquina de Turing universal. Esto implicaría que no se puede construir físicamente una computadora más potente que una máquina de Turing universal. [5]

Ejemplos

Los sistemas computacionales (álgebras, cálculos) que se consideran sistemas Turing-completos son aquellos destinados al estudio de la informática teórica . Su objetivo es que sean lo más simples posible, de modo que resulte más fácil comprender los límites de la computación. A continuación se presentan algunos:

La mayoría de los lenguajes de programación (sus modelos abstractos, tal vez con algunas construcciones particulares que suponen que se omite la memoria finita), convencionales y no convencionales, son Turing-completos. Esto incluye:

Algunos sistemas de reescritura son Turing-completos.

La completitud de Turing es una declaración abstracta de capacidad, en lugar de una prescripción de características específicas del lenguaje utilizadas para implementar esa capacidad. Las características utilizadas para lograr la completitud de Turing pueden ser bastante diferentes; los sistemas Fortran utilizarían construcciones de bucle o posiblemente incluso declaraciones goto para lograr la repetición; Haskell y Prolog, que carecen de bucles casi por completo, utilizarían recursión . La mayoría de los lenguajes de programación describen cálculos en arquitecturas de von Neumann , que tienen memoria (RAM y registro) y una unidad de control. Estos dos elementos hacen que esta arquitectura sea Turing-completa. Incluso los lenguajes funcionales puros son Turing-completos. [8] [9]

La completitud de Turing en SQL declarativo se implementa a través de expresiones de tabla comunes recursivas . No es sorprendente que las extensiones procedimentales de SQL ( PLSQL , etc.) también sean Turing-completas. Esto ilustra una razón por la que los lenguajes no Turing-completos relativamente potentes son raros: cuanto más potente es el lenguaje inicialmente, más complejas son las tareas a las que se aplica y más pronto su falta de completitud se percibe como un inconveniente, lo que fomenta su extensión hasta que es Turing-completo.

El cálculo lambda no tipificado es Turing-completo, pero muchos cálculos lambda tipificados, incluido el Sistema F , no lo son. El valor de los sistemas tipificados se basa en su capacidad para representar la mayoría de los programas informáticos típicos y detectar más errores.

La regla 110 y el Juego de la Vida de Conway , ambos autómatas celulares , son Turing-completos.

Completitud de Turing no intencionada

Algunos programas y videojuegos son Turing-completos por accidente, es decir, no por diseño.

Software:

Juegos:

Redes sociales:

Lenguajes computacionales:

Biología:

Lenguajes no Turing-completos

Existen muchos lenguajes computacionales que no son Turing-completos. Un ejemplo de ello es el conjunto de lenguajes regulares , que se generan mediante expresiones regulares y que son reconocidos por autómatas finitos . Una extensión más potente, pero aún no Turing-completa de los autómatas finitos, es la categoría de autómatas de inserción y gramáticas libres de contexto , que se utilizan comúnmente para generar árboles de análisis en una etapa inicial de la compilación de programas . Otros ejemplos incluyen algunas de las primeras versiones de los lenguajes de sombreado de píxeles integrados en las extensiones Direct3D y OpenGL . [ cita requerida ]

En lenguajes de programación funcional total , como Charity y Epigram , todas las funciones son totales y deben terminar. Charity utiliza un sistema de tipos y construcciones de control basadas en la teoría de categorías , mientras que Epigram utiliza tipos dependientes . El lenguaje LOOP está diseñado para que calcule solo las funciones que son recursivas primitivas . Todas estas calculan subconjuntos propios de las funciones computables totales, ya que el conjunto completo de funciones computables totales no es computablemente enumerable . Además, dado que todas las funciones en estos lenguajes son totales, los algoritmos para conjuntos recursivamente enumerables no se pueden escribir en estos lenguajes, a diferencia de las máquinas de Turing.

Aunque el cálculo lambda (sin tipificar) es Turing-completo, el cálculo lambda simplemente tipificado no lo es.

Véase también

Notas al pie

  1. ^ Podría decirse que la computación completa de Turing es el único paradigma de la teoría que sustenta la ciencia de la computación... Se ha argumentado que, en la actualidad, el paradigma dominante de la ciencia de la computación puede caracterizarse teóricamente como computación completa, que abarca los lenguajes de programación generales, y prácticamente como pensamiento computacional, que abarca las metodologías de programación generales. [1]

Referencias

  1. ^ Michaelson, Greg (14 de febrero de 2020). "Paradigmas de programación, completitud de Turing y pensamiento computacional". El arte, la ciencia y la ingeniería de la programación . 4 (3). arXiv : 2002.06178 . doi :10.22152/programming-journal.org/2020/4/4.
  2. ^ Hodges, Andrew (1992) [1983], Alan Turing: El enigma , Londres: Burnett Books, pág. 111, ISBN 0-04-510060-8
  3. ^ Rojas, Raul (1998). "Cómo hacer del Z3 de Zuse un ordenador universal". Anales de la Historia de la Computación . 20 (3): 51–54. doi :10.1109/85.707574.
  4. ^ Rojas, Raúl (1 de febrero de 2014). "Konrad Zuse und der bedingte Sprung" [Konrad Zuse y el salto condicional]. Informatik-Spektrum (en alemán). 37 (1): 50–53. doi :10.1007/s00287-013-0717-9. ISSN  0170-6012. S2CID  1086397.
  5. ^ Schmidhuber, Jürgen (1997), Freksa, Christian; Jantzen, Matthias; Valk, Rüdiger (eds.), "La visión de un científico informático sobre la vida, el universo y todo", Fundamentos de la informática: potencial, teoría y cognición , Lecture Notes in Computer Science, vol. 1337, Berlín, Heidelberg: Springer, págs. 201–208, arXiv : quant-ph/9904050 , doi :10.1007/bfb0052088, ISBN 978-3-540-69640-7, S2CID  17830241 , consultado el 23 de mayo de 2022
  6. ^ Dfetter; Breinbaas (8 de agosto de 2011). «Sistema de etiquetas cíclicas». Wiki de PostgreSQL . Consultado el 10 de septiembre de 2014 .
  7. ^ Lyons, Bob (30 de marzo de 2001). "Máquina de Turing universal en XSLT". Soluciones de integración B2B de Unidex . Archivado desde el original el 17 de julio de 2011. Consultado el 5 de julio de 2010 .
  8. ^ Boyer, Robert S.; Moore, J. Strother (mayo de 1983). Una prueba mecánica de la completitud de Turing de Pure Lisp (PDF) (informe técnico). Instituto de Ciencias de la Computación, Universidad de Texas en Austin. 37. Archivado (PDF) desde el original el 22 de septiembre de 2017.
  9. ^ Rauber, Thomas; Rünger, Gudula (2013). Programación paralela: para sistemas multinúcleo y en clúster (2.ª ed.). Springer. ISBN 9783642378010.
  10. ^ "Anuncio de LAMBDA: Convierta las fórmulas de Excel en funciones personalizadas". TECHCOMMUNITY.MICROSOFT.COM . 3 de diciembre de 2020 . Consultado el 8 de diciembre de 2020 .
  11. ^ Cedotal, Andrew (16 de abril de 2010). «Un hombre usa el juego de computadora más difícil del mundo para crear… una máquina de Turing funcional». The Mary Sue . Archivado desde el original el 27 de junio de 2015. Consultado el 2 de junio de 2015 .
  12. ^ Plunkett, Luke (16 de julio de 2019). «Cities: Skylines Map se convierte en un ordenador alimentado por caca». Kotaku . Consultado el 16 de julio de 2019 .
  13. ^ Caldwell, Brendan (20 de noviembre de 2017). «Un jugador de Opus Magnum fabrica una computadora alquímica». Rock Paper Shotgun . Consultado el 23 de septiembre de 2019 .
  14. ^ Crider, Michael. «Este procesador de 8 bits integrado en Minecraft puede ejecutar sus propios juegos». PCWorld . Consultado el 21 de julio de 2022 .
  15. ^ Churchill, Alex; Biderman, Stella; Herrick, Austin (2020). Magic: The Gathering es Turing Complete (PDF) . Décima Conferencia Internacional sobre Diversión con Algoritmos.
  16. ^ Ouellette, Jennifer (23 de junio de 2019). «Es posible construir una máquina de Turing en Magic: The Gathering». Ars Technica . Consultado el 12 de marzo de 2023 .
  17. ^ Kaye, Richard (31 de mayo de 2007). «Infinitas versiones del buscaminas son Turing completo» (PDF) . Archivado desde el original (PDF) el 3 de agosto de 2016. Consultado el 8 de julio de 2016 .
  18. ^ "Hilo de Twitter de Habbo sobre la implementación de una máquina de Turing dentro del juego". 9 de noviembre de 2020. Consultado el 11 de noviembre de 2020 .
  19. ^ Meyers, Scott (Scott Douglas) (2005). Effective C++: 55 maneras específicas de mejorar sus programas y diseños (3.ª ed.). Upper Saddle River, NJ: Addison-Wesley. ISBN 0321334876.OCLC 60425273  .
  20. ^ Ganador del 27.° IOCCC Carlini, Nicolas; Barresi, Antonio; Payer, Mathias; Wagner, David; Gross, Thomas R. (agosto de 2015). "Control-flow flexing: on the effectiveness of control-flow integrity". Actas del 24.° Simposio de la Conferencia USENIX sobre Seguridad . págs. 161–176. ISBN
     9781931971232.
  21. ^ Dabler, Ryan (23 de septiembre de 2021). "TypeScript y completitud de Turing". ITNEXT . LINKIT . Consultado el 12 de noviembre de 2022 .
  22. ^ Dolan, Stephen. «mov is Turing-complete» (PDF) . stedolan.net . Archivado desde el original (PDF) el 14 de febrero de 2021. Consultado el 9 de mayo de 2019 .
  23. ^ Williams, Al (21 de marzo de 2021). "Una instrucción para gobernarlos a todos: el compilador de C emite solo MOV". Hackaday . Consultado el 23 de octubre de 2023 .
  24. ^ Break Me00 The MoVfuscator Convirtiendo a mov en una pesadilla de RE aplastante para el alma Christopher Domas , recuperado el 5 de noviembre de 2022
  25. ^ Shah, Shalin; Wee, Jasmine; Song, Tianqi; Ceze, Luis; Strauss, Karin ; Chen, Yuan-Jyue; Reif, John (4 de mayo de 2020). "Uso de la polimerasa desplazante de hebras para programar redes de reacciones químicas". Revista de la Sociedad Química Estadounidense . 142 (21): 9587–9593. doi :10.1021/jacs.0c02240. ISSN  0002-7863. PMID  32364723. S2CID  218504535.
  26. ^ Chen, Yuan-Jyue; Dalchau, Neil; Srinivas, Niranjan; Phillips, Andrew; Cardelli, Luca; Soloveichik, David; Seelig, Georg (octubre de 2013). "Controladores químicos programables hechos de ADN". Nature Nanotechnology . 8 (10): 755–762. Bibcode :2013NatNa...8..755C. doi :10.1038/nnano.2013.189. ISSN  1748-3395. PMC 4150546 . PMID  24077029. 
  27. ^ Srinivas, Niranjan; Parkin, James; Seelig, Georg; Winfree, Erik; Soloveichik, David (15 de diciembre de 2017). "Sistemas dinámicos de ácidos nucleicos libres de enzimas". Science . 358 (6369): eaal2052. doi : 10.1126/science.aal2052 . ISSN  0036-8075. PMID  29242317.
  28. ^ Soloveichik, David; Seelig, Georg; Winfree, Erik (23 de marzo de 2010). "El ADN como sustrato universal para la cinética química". Actas de la Academia Nacional de Ciencias . 107 (12): 5393–5398. Bibcode :2010PNAS..107.5393S. doi : 10.1073/pnas.0909380107 . ISSN  0027-8424. PMC 2851759 . PMID  20203007. 
  29. ^ Shapiro, Ehud (7 de diciembre de 1999). "Una máquina de Turing mecánica: modelo para una computadora biomolecular". Interface Focus . 2 (4). Instituto de Ciencias Weizmann : 497–503. doi :10.1098/rsfs.2011.0118. PMC 3363030 . PMID  22649583. Archivado desde el original el 3 de enero de 2009 . Consultado el 13 de agosto de 2009 . 

Lectura adicional

Enlaces externos