¿Existen criterios mínimos para que un lenguaje de programación sea Turing completo?


55

¿Existe un conjunto de construcciones de lenguaje de programación en un lenguaje de programación para que pueda considerarse Turing Complete?

Por lo que puedo decir de Wikipedia , el lenguaje debe admitir la recursividad o, al parecer, debe poder ejecutarse sin detenerse. ¿Es esto todo lo que hay que hacer?


66
Quizás su pregunta debería ser "¿Hay un conjunto mínimo de construcciones de programación ...?", Porque como está redactado, la respuesta es "Todos los computables".
Dave Clarke


@DaveClarke, gracias, lo he actualizado. Me parece que su comentario plantea un poco la pregunta, aunque supongo que es porque mi idioma es pobre. Quise preguntar si hay o no algunas operaciones que si un lenguaje pudiera computar, serían equivalentes.
Khanzor

Respuestas:


45

Siempre pensé que las funciones recursivas lograron . Esto es lo que define todo el conjunto de funciones computables; Es el conjunto más pequeño de funciones que contienen resp. cerrado contra:μ

  1. La constante función0
  2. La función sucesora
  3. Seleccionar parámetros
  4. Composición de la función
  5. Recursion primitiva
  6. El operador (busque la más pequeña de tal manera que ...)xμx

Verifique el enlace de arriba para más detalles; ves que es un lenguaje de programación muy compacto. También es horrible programarlo, no hay almuerzo gratis. Si deja caer cualquiera de esos, perderá toda la potencia, por lo que es un conjunto mínimo de axiomas.

Puede traducirlos literalmente en elementos sintácticos básicos para los programas WHILE , a saber

  1. El constante 0
  2. Incremento _ + 1
  3. Acceso variable x
  4. Programa / concatenación de declaraciones _; _
  5. Bucles de cuenta regresiva for ( x to 0 ) do _ end
  6. Mientras bucles while ( x != 0 ) do _ end

1
Creo que es obvio que no puedes descartar la quinta regla en el idioma. Dado que el whilebucle en 6 se compara con la constante cero, las variables solo pueden incrementarse mediante la regla 2 y no hay constantes negativas para comenzar (regla 1), el whilebucle en 6 no se ingresa (x = 0) o es infinito ( x> 0, y el cuerpo del bucle no puede disminuirlo).
MSalters

1
@MSalters Creo que tienes razón; para la simulación que parece haber tenido en mente, necesitamos _ - 1y no puedo pensar en una forma de implementar eso sin for. Gracias por atrapar eso! (¿Qué es "mejor", incluyendo _ - 1o for? Hmm.)
Raphael

20

¿Existe un conjunto de cálculos que deben ser ejecutables en un lenguaje de programación para que se considere Turing completo?

Sí, para que Turing se considere completo, un lenguaje de programación debe ser capaz de realizar cualquier cálculo que pueda realizar una máquina de Turing. Por lo tanto, como requisito mínimo se podría decir, debe poder implementar una máquina Turing universal, o un intérprete para cualquier otro lenguaje completo de Turing, en él.

Por lo que puedo decir de Wikipedia, el lenguaje debe admitir la recursividad o, al parecer, debe poder ejecutarse sin detenerse. ¿Es esto todo lo que hay que hacer?

No. Por ejemplo, un lenguaje donde la única operación permitida es la recursión (es decir, la única función posible que puede escribir es f(x) = f(x)que no está completada por Turing porque todo lo que puede escribir en él son programas que nunca terminan. Como dije antes, un lenguaje completo de Turing necesita poder implementar cualquier cálculo que pueda realizar una máquina de Turing. Claramente, eso no es suficiente.

Además, un lenguaje no tiene que soportar la recursividad en la forma en que estás pensando. Solo una forma irrestricta de expresar bucles. Eso podría ser recurrencia, pero también podría ser un bucle while o ir a. Un lenguaje que no tiene funciones en absoluto puede ser Turing completo. Y nuevamente, los bucles o las funciones recursivas no son una condición suficiente. Aún necesita una forma de ejecutar código diferente según una condición y una forma de calcular nuevos valores a partir de los antiguos (de lo contrario, todos los bucles / recursiones serían infinitos o no se ejecutarían en absoluto).


En cuanto a si hay un conjunto mínimo de operaciones necesarias y suficientes, de modo que cualquier lenguaje que admita estas operaciones esté completo y cualquier lenguaje que no lo sea: No, no lo hay (a menos que defina "operación" de forma tan vaga) , que deja de tener sentido):

Por ejemplo, como ya dije, hay lenguajes completos de Turing que no admiten funciones recursivas (o ninguna función). Esos todavía pueden estar completos en Turing si tienen una gotodeclaración o un whilebucle (y una forma de almacenar cantidades arbitrarias de datos). Sin embargo, un lenguaje con funciones recursivas no necesita whileni gotoser Turing completo. Por gotolo tanto , no estaría en el conjunto de operaciones suficientes necesarias, pero hay idiomas que ya no se completarán si se eliminan goto. Por lo tanto, no existe tal conjunto.


La única parte de la que no estoy seguro es su respuesta al conjunto mínimo de operaciones necesarias. Parece limitar su definición de operaciones a estructuras de control, lo que parece tener un alcance mucho más estrecho de lo solicitado, y más allá de su propio requisito de no definirlas "tan vagamente, que [pierdan] sentido".
Joshua Drake

@ JoshuaDrake No estoy seguro de lo que quieres decir. No estoy limitando las operaciones para controlar las estructuras. Es solo que no hablo de ninguna operación que no sea estructuras de control en mi contraejemplo porque no son relevantes para el ejemplo. De hecho, menciono "una forma de almacenar cantidades arbitrarias de datos", que difícilmente es una estructura de control.
sepp2k

Usted señala que algunos idiomas son compatibles con Turing Completeness gotopero que otros no lo hacen, aparentemente afirmando que debido a que algunos lo usan y otros no, eso gotono puede ser parte de un conjunto de operaciones requeridas para la integridad de Turing. Mi punto es que gotoes simplemente una forma sintáctica de implementar una operación particular más genérica, como un salto. Por lo tanto, creo que si simplemente se abstrae de estructuras de control específicas, se acercará a un conjunto de operaciones que al menos apuntarán hacia la Compleción de Turing.
Joshua Drake el

@JoshuaDrake No creo que usar "saltar" en lugar de ir a goto nos lleve al punto en el que podamos definir un conjunto de operaciones suficiente y necesario. Probablemente sea cierto que cada idioma necesitaría algún tipo de operación de salto (y si solo se trata de llamadas a funciones), pero no creo que pueda realizar más operaciones para que sea suficiente. Por ejemplo, el cálculo lambda tiene dos operaciones: aplicación (es decir, nuestra operación de salto) y abstracción (es decir, creación de funciones) ...
sepp2k

1
@ JoshuaDrake No creo que el artículo esté tratando de afirmar que cualquier lenguaje completo de Turing necesita tener esas operaciones. Especialmente porque restringe específicamente esa declaración a los lenguajes de procedimiento. Excepto por una forma de goto (es decir, aplicación de función), el cálculo Lambda no tiene ninguna de esas cosas. Creo que "mínimo" aquí solo significa que en un lenguaje que solo tiene esas características, no puede eliminar ninguna de ellas sin perder la integridad de Turing. No es que no haya otro conjunto mínimo de operaciones que también sea suficiente para la integridad de Turing.
sepp2k

14

Hay varias instrucciones individuales que conducen a los idiomas completos de Turing. El ejemplo típico es "restar y ramificar si es cero". Estos son bien conocidos en el contexto de la programación en lenguaje ensamblador. Vea el artículo de Wikipedia para más detalles.

Esto lleva a una caracterización: un lenguaje es Turing completo si y solo si es capaz de simular las operaciones de buscar y almacenar enteros en la memoria y realizar la operación "restar y ramificar si cero" en ellos.


13

Esta no es una respuesta general a su pregunta, pero según el teorema de programación estructurada , todo lo que se necesita es la capacidad de hacer selección (por ejemplo, ifen C / C ++) y repetición (por ejemplo, whileen C / C ++). Editar: como señaló Dave Clarke en los comentarios, el teorema de programación estructurada también requiere secuencia. Inicialmente no enumeré esto, dado que daba por sentado que el lector entendería que también eran necesarios bloques básicos de otras instrucciones, como las mencionadas más adelante para leer y escribir en el almacén de memoria, etc. Por supuesto, es mejor ser explícito; también necesitas poder hacer estas cosas.

Dado que ambos pueden implementarse utilizando una instrucción de salto condicional (por ejemplo, JNZen x86), eso también es suficiente para la equivalencia de Turing.

Tenga en cuenta que se requieren otras cosas, es decir, la capacidad de escribir un número ilimitado de símbolos (por ejemplo, bits ... 0 o 1) en algún tipo de almacén de memoria externa. En ese sentido, las computadoras reales no son equivalentes a Turing, ya que ninguna de ellas tiene una cantidad infinita de almacenamiento. Sin embargo, el modelo de Turing sigue siendo útil, ya que la cantidad de memoria suele ser enorme, y aunque cualquier problema que una computadora real pueda resolver puede resolverse mediante un autómata finito determinista, usar ese modelo de cálculo no es particularmente útil (ya que número de estados sería ridículamente enorme).

Tenga en cuenta que esto no está necesariamente en desacuerdo con la respuesta de sepp2k; Esta es una forma diferente de pensar sobre la misma pregunta.

EDITAR:

Tenga en cuenta también que realmente no necesita ambos ify whileen C / C ++. Puede simular ifusando whilelo siguiente:

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

El siguiente código siempre es equivalente:

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

Bueno ... la construcción debería funcionar y ser posible si tienes cuidado, eso es. Tenga en cuenta también que si tiene funciones recursivas, eventualmente necesita selección también; Como las funciones recursivas sin selección realmente no pueden implementar casos base, cualquier función recursiva daría como resultado una recursión infinita.

EDITAR:

Además, con respecto a su pregunta sobre si la capacidad de escribir un programa que no se detenga es suficiente para la equivalencia de Turing, la respuesta es no; Es necesario, pero no suficiente. Podemos resolver el problema de detención de programas escritos en un lenguaje que no puede expresar programas que no se detienen; la respuesta es "el programa se detiene" para todas las instancias. Sin embargo, podemos definir un idioma donde la única instrucción hace que la máquina entre en un bucle infinito ... tal lenguaje no es equivalente a Turing.


13

Los combinadores y donde, y son suficientes para expresar cualquier término lambda (cerrado), por lo tanto, cualquier función computable. Vea esta página de Wikipedia para más detalles.K ( S x y z ) = ( x z ( y z ) ) ( K x y ) = xSK(S x y z)=(x z (y z))(K x y)=x

De hecho, el término lambda es una base suficiente para expresar todos los términos lambda. Ver más adelante en la misma página de Wikipedia .X=λx.((x S) K)


5

Las construcciones del lenguaje son intercambiables.

No hay un criterio mínimo establecido sobre qué construcciones debe proporcionar de forma nativa un lenguaje de programación. Si proporciona algunas construcciones extrañas que de alguna manera pueden ser complicadas para expresar un sistema completo de Turing, entonces aparentemente esas construcciones son "tan adecuadas" como cualquier otra.

Para probar esto, un lenguaje que proporciona solo una operación de "resta y ramificación si cero" es Turing completo; existen lenguajes completos de Turing que no proporcionan una construcción separada "restar y ramificar si cero", por lo tanto, no hay una construcción o un conjunto de construcciones que sea obligatorio.

Los efectos de cualquier construcción de lenguaje TP-completo pueden ser emulados por las construcciones de cualquier otro lenguaje TP-completo.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.