¿Por qué son completos los lenguajes funcionales de Turing?

22

Quizás mi comprensión limitada del tema es incorrecta, pero esto es lo que entiendo hasta ahora:

  • La programación funcional se basa en el cálculo Lambda, formulado por Alonzo Church.

  • La programación imperativa se basa en el modelo de máquina de Turing, realizado por Alan Turing, estudiante de Church.

  • El cálculo Lambda es tan poderoso y capaz como la Máquina de Turing,
    lo que significa que son equivalentes en potencia computacional.

Si la programación funcional se basa en el cálculo de Lambda y no en la máquina de Turing, ¿por qué se describe que algunos (o todos) son completos de Turing, y no Lambda completa o algo así? ¿Es el término "integridad de Turing" especial de alguna manera para las máquinas de Turing, o es solo una palabra?

Por último, si los lenguajes imperativos se basan en la máquina de Turing, y las computadoras son básicamente máquinas de Turing, sin memoria infinita, ¿eso significa que funcionan mejor que los lenguajes de programación funcionales en nuestras PC modernas?

Si ese es el caso, ¿cuál sería el equivalente de una máquina de cálculo lambda?

Sé que esto parece ser 3 preguntas separadas, pero todas están estrechamente relacionadas, y cada una depende de que la pregunta anterior sea una pregunta válida para empezar.

Abdul
fuente
66
No es una respuesta, pero mencionaste que no todas las versiones del cálculo lambda son Turing Complete. El cálculo de Lambda simplemente tipado, y las versiones más fuertes de Coq y Agda basadas en la verificación de terminación, no son Turing Complete (porque tienen problemas de detención decidibles). Los lenguajes fuertemente tipados como Haskell y SML evitan esto al permitir la recurrencia arbitraria con un combinador de punto fijo, un término con tipo (a -> a) -> a.
jmite
Es tan incorrecto decir "definido como Turing completo". ¿Podemos cambiar el título?
Andrej Bauer
@AndrejBauer Gracias por la edición del título, pero tengo curiosidad de saber por qué está mal ( definido como Turning Complete ). ¿Es porque es un adjetivo? ¿Describiría sería una palabra mejor que definir?
Abdul
1
@Abdul Bueno, el problema es la palabra "definido". Si dice que "los lenguajes funcionales se definen como Turing completo", está diciendo que la definición de "lenguaje funcional" o la definición de "Turing completo" establece que los lenguajes funcionales son completos de Turing. De hecho, ninguna de las definiciones lo dice.
Tanner Swett

Respuestas:

20

En pocas palabras :

Lo que caracteriza a los lenguajes de programación imperativos tan cercanos a las máquinas de Turing y a las computadoras habituales, como las PC, (más cerca de las máquinas de acceso aleatorio (RAM) en lugar de las máquinas de Turing) es el concepto de una memoria explícita que se puede modificar para almacenar (resultados intermedios ) Es una vista de autómatas de cómputo, con un concepto de estado (que comprende tanto el control de estado finito como el contenido de memoria) que puede cambiar a medida que avanza el cómputo.

La mayoría de los otros modelos son más abstractos. Aunque pueden expresar el cálculo como una sucesión de pasos de transformación de una estructura original, estas transformaciones se aplican en una especie de universo intemporal de significados matemáticos. Esto puede preservar propiedades, como la transparencia referencial, que pueden simplificar el análisis matemático. Pero está más alejado de los modelos físicos naturales que dependen de la concpet de la memoria.

Por lo tanto, no hay máquinas funcionales naturales, excepto en un sentido más amplio como se explica a continuación, ya que el software no es realmente separable del hardware.

La referencia a Turing como criterio de computabilidad proviene probablemente del hecho de que su modelo, la máquina de Turing, estaba más cerca de esta restricción de realización física, lo que lo convirtió en un modelo de computación más intuitivo.

Consideraciones adicionales :

Hay muchos modelos de computación, que fueron diseñados para capturar de la manera más general posible el concepto de computación. Incluyen máquinas de Turing, en realidad en muchos sabores diferentes, el cálculo lambda (sabores también), sistemas de reescritura semi-Thue, función recursiva parcial, lógica combinatoria.

Todos capturan algunos aspectos de las diversas técnicas utilizadas por los matemáticos para expresar o realizar cálculos. Y la mayoría se han utilizado hasta cierto punto como la base de algún diseño de lenguaje de programación (por ejemplo, Snobol para reescribir sistemas, APL para combinadores, Lisp / Scheme para cálculo lambda) y a menudo se pueden combinar de diversas maneras en lenguajes de programación modernos.

Un resultado importante es que todos estos modelos de computación demostraron ser equivalentes, lo que lleva a la tesis de Church-Turing de que ningún modelo de computación físicamente realizable puede hacer más que cualquiera de estos modelos. Se dice que un modelo de cómputo es Turing completo si se puede demostrar que es equivalente a uno de estos modelos, por lo tanto, equivalente a todos ellos.

El nombre podría haber sido diferente. La elección de la máquina de Turing (TM) como referencia probablemente se deba al hecho de que es probablemente el más simple de estos modelos, imitando de cerca (aunque de manera simplista) la forma en que un humano calcula y bastante fácil de implementar (en una forma limitada limitada) ) como dispositivo físico, hasta tal punto que las máquinas de Turing se han construido con juegos de Lego . La idea básica no requiere sofisticación matemática. Probablemente sea la simplicidad y la realización del modelo lo que le dio esta posición de referencia.

En el momento en que Alan Turing creó su dispositivo informático, otras propuestas estaban sobre la mesa para servir como definición formal de computabilidad, un tema crucial para los fundamentos de las matemáticas (ver Entscheidungsproblem ). Los expertos de la época consideraron la propuesta de Turing como el trabajo conocido más convincente sobre lo que debería ser la calculabilidad (ver Computabilidad y Recursión , RI Soare, 1996, ver sección 3.2). Las diversas propuestas demostraron ser equivalentes, pero la de Turing fue más convincente. [de los comentarios de Yuval Filmus]

Cabe señalar que, desde el punto de vista del hardware, nuestras computadoras no son máquinas de Turing, sino lo que se llama Máquinas de acceso aleatorio (RAM) , que también están completas.

El lenguaje puramente imperativo (lo que sea que eso signifique) son probablemente los formalismos utilizados para los modelos más básicos, como las máquinas de Turing, o el lenguaje ensamblador (omitiendo su codificación binaria) de las computadoras. Ambos son notoriamente ilegibles y muy difíciles de escribir con programas significativos. En realidad, incluso el lenguaje ensamblador tiene algunas características de nivel superior para facilitar un poco la programación, en comparación con el uso directo de las instrucciones de la máquina. Los modelos básicos imperativos están cerrados a los mundos físicos, pero no son muy utilizables.

Esto condujo rápidamente al desarrollo de modelos de cómputo de nivel superior, que comenzaron a mezclar una variedad de técnicas computacionales, como llamadas a subprogramas y funciones, denominación de ubicación de memoria, alcance de nombres, cuantificación y variables ficticias, ya utilizadas de alguna forma en matemática y lógica, e incluso conceptos muy abstractos como la reflexión ( Lisp 1958).

La clasificación de los lenguajes de programación en paradigmas de programación como imperativo, funcional, lógico, orientado a objetos se basa en la preeminencia de algunas de estas técnicas en el diseño del lenguaje y la presencia o ausencia de algunas características informáticas que imponen algunas propiedades para los programas. o fragmentos de programas escritos en el idioma.

Algunos modelos son convenientes para máquinas físicas. Algunos otros son más convenientes para una descripción de algoritmos de alto nivel, que puede depender del tipo de algoritmo que se describirá. Algunos teóricos incluso usan especificación no determinista de algoritmos, e incluso pueden traducirse en términos de programación más convencionales. Pero no hay problema de desajuste, porque desarrollamos una sofisticada tecnología de compilación / interpretación que puede traducir cada modelo a otro según sea necesario (que también es la base de la tesis de Church-Turing).

Ahora, nunca debe mirar a su computadora como hardware en bruto. Contiene circuitos booleanos que realizan un procesamiento muy elemental. Pero gran parte de esto es impulsado por microprogramas dentro de la computadora que nunca conoce. Luego tiene el sistema operativo que hace que su máquina parezca incluso diferente de lo que hace el hardware, además de eso puede tener una máquina virtual que ejecuta código de bytes y luego un lenguaje de alto nivel como Pyva y Jathon o Haskell o OCaml, que se puede compilar en código de bytes.

En cada nivel, ve un modelo de cálculo diferente. Es muy difícil separar el nivel de hardware del nivel de software para asignar un modelo computacional específico a una máquina. Y como todos son intertraducibles, la idea de un modelo de cómputo de hardware definitivo es prácticamente una ilusión.

La máquina de cálculo lambda sí existe: es una computadora que puede reducir las expresiones de cálculo lambda. Anuncio que se hace fácilmente.

Sobre arquitecturas de máquinas especializadas

En realidad, complementando la respuesta de Peter Taylor y siguiendo el entrelazamiento de hardware / software, se han producido máquinas especializadas para adaptarse mejor a un paradigma específico, y se les ha escrito su software básico en un lenguaje de programación basado en ese paradigma.

Éstas incluyen

Fundamentalmente, estas también son estructuras de hardware imprescindibles, pero mitigadas con funciones especiales de hardware o intérpretes microprogramados para adaptarse mejor al paradigma deseado.

En realidad, el hardware especializado para paradigmas específicos no parece haber tenido éxito a largo plazo. La razón es que la tecnología de compilación para implementar cualquier paradigma en el hardware de vainilla se hizo cada vez más efectiva, por lo que el hardware especializado no era tan necesario. Además, el rendimiento del hardware mejoró rápidamente, pero el costo de la mejora (incluida la evolución del software básico) se amortizó más fácilmente en el hardware básico que en el hardware especializado. El hardware especializado no podría competir a largo plazo.

Sin embargo, y aunque no tengo datos precisos sobre esto, sospecharía que estas empresas dejaron algunas ideas que influyeron en la evolución de la arquitectura de máquinas, memorias y conjuntos de instrucciones.

babou
fuente
La elección de la máquina de Turing como referencia, en la medida en que realmente está hecha, está motivada principalmente en la historia: Turing fue el primero en llegar a una definición satisfactoria de computabilidad.
Yuval Filmus
@YuvalFilmus ¿Y por qué era más una "definición satisfactoria de computabilidad"?
babou
Eso es lo que pensó Gödel. Bob Soare tiene algunas palabras que decir sobre el asunto aquí: cs.uchicago.edu/~soare/Publications/compute.ps .
Yuval Filmus
@YuvalFilmus Esto es 46 páginas. Quiero decir que estoy dando algunas razones por las que debería ser más satisfactorio. Pueden ser ingenuos. Si hay uno más convincente que explique el éxito, es una mención explícita.
babou
Mire la Sección 3.2. Hubo definiciones previas de computabilidad pero no fueron convincentes. Turing fue el primero que resultó convincente, al menos para algunas personas clave.
Yuval Filmus
21

Turing-complete es solo un nombre. Puedes llamarlo Abdul-complete si quieres. Los nombres se deciden históricamente y a menudo llevan el nombre de las personas "equivocadas". Es un proceso sociológico que no tiene criterios claros. El nombre no tiene significado más allá de su semántica oficial.

Los lenguajes imperativos no se basan en máquinas de Turing. Se basan en máquinas RAM. Su computadora es una máquina RAM. Las máquinas de Turing son un buen modelo teórico, pero no son un muy buen modelo de computadoras reales.

Los lenguajes de programación basados ​​en otros paradigmas pueden tener mucho éxito, aunque la CPU subyacente no los admita de forma nativa; por ejemplo, las impresoras ejecutan un lenguaje de pila. Hay más en la programación que el código de máquina.

Yuval Filmus
fuente
"Las máquinas de Turing son un buen modelo teórico, pero no son un muy buen modelo de computadoras reales". Excepto por la falta de memoria infinita, ¿cuáles son otras razones por las que no es un buen modelo para computadoras reales? Además, ¿tenía razón al pensar que los lenguajes funcionales se basan en el cálculo lambda?
Abdul
55
λ
11
Los lenguajes imperativos tienden a permitir accesos de matriz en tiempo constante, en C A[x]. Las máquinas de Turing no pueden hacer esto en tiempo constante. Es por eso que incluso en la informática teórica, el tiempo de ejecución de los algoritmos se analiza en el modelo de máquina RAM en lugar de en el modelo de máquina de Turing.
Yuval Filmus
14
En realidad, las máquinas de Turing son una buena computadora real ... excepto que cuando Turing escribió su artículo, "computadora" era una descripción del trabajo para un humano que trabajaba con lápiz y papel. El cabezal de lectura / escritura es un modelo de un bolígrafo, la cinta es un modelo de una pila infinita de hojas de papel (solo córtelas en pequeñas tiras y péguelas), el alfabeto es un modelo de, bueno, nuestro alfabeto , y las transiciones finitas son un modelo de la cantidad limitada de reglas que uno puede mantener en la cabeza.
Jörg W Mittag
3
Esa fue la mejor idea que he tenido sobre por qué demonios eligió la máquina Turing. Siempre me he preguntado "por qué eligió un modelo de computación tan malo". Siempre pensé que si me hubiera dejado inventar la teoría de la computación (que Dios nos ayude; no estaríamos muy lejos), probablemente todavía habría elegido un mejor modelo de computación. Ahora entiendo de dónde venía y tiene mucho más sentido.
Jake
10

Debido a que "Turing-complete" solo significa "puede calcular lo que una máquina de Turing puede calcular".

David Richerby
fuente
Turing-complete también podría ser nombrado en honor a Turing (la persona), a quien se le ocurrió la primera definición filosóficamente satisfactoria de computabilidad; o podría ser nombrado en honor al artículo de Turing en el que describe este concepto.
Yuval Filmus
1
@YuvalFilmus: podría llevarse el nombre de la madre de Alan Turing, pero la afirmación aquí es que no lo es ;-)
Steve Jessop
@YuvalFilmus podría ser (aunque, que yo sepa, no lo es). Pero de dónde viene el término es de importancia secundaria. Lo que importa aquí es lo que significa el término .
David Richerby
2
Esto es corto y dulce, pero quizás demasiado corto. ¿Qué hace una máquina de Turing? Bueno, entre las cosas que "hacen" es leer y escribir cintas, que las expresiones lambda no lo hacen, mejor sería "Los modelos de cómputo completos de Turing permiten calcular todas las funciones computables".
Theodore Norvell
@TheodoreNorvell Creo que tu comentario es similar a lo que estaba pensando. Sabía que el cálculo lambda y la máquina de Turing son equivalentes en potencia, pero diferentes en mecanismo (y ahora aprendí que hay otros), pero me preguntaba si el término "integridad de Turing" era de alguna manera especial para la máquina de Turing, o si solo fuera un nombre.
Abdul
6

Parece que una de sus preguntas aún no ha sido respondida:

Si ese es el caso, ¿cuál sería el equivalente de una máquina de cálculo lambda?

Una máquina Lisp . Hardware diseñado específicamente para adaptarse al modelo de computación LISP. El artículo de Wikipedia habla sobre productos comerciales, pero mi director de estudios en la universidad tenía uno hecho a mano en su oficina.

Peter Taylor
fuente
0

Se demostró que los lenguajes funcionales en forma de cálculo lambda inventados por la Iglesia eran completos. Esta es una prueba matemática real que se puede encontrar en artículos científicos publicados al "reducir" el cálculo lambda a operaciones / cálculos en máquinas Turing. En la época del documento de Turings de 1936 y posteriores, se propusieron / distribuyeron diferentes modelos de cómputo "integrales". se no se dio cuenta de inmediato que todos eran equivalentes. Las pruebas de que eran equivalentes se publicaron aproximadamente a fines de la década de 1930 y 1940 después del documento de Turings.

la máquina de Turing es conceptualmente (pero no funcionalmente) más simple que los otros modelos y esa es probablemente una parte importante de la razón por la cual la integridad de Turing lleva su nombre. Otras ideas, como el cálculo lambda, son más abstractas y comenzaron / se originaron principalmente en la teoría matemática / lógica. Turing propuso una máquina teórica . una "máquina" es literalmente un "dispositivo físico". Es un objeto / construcción conceptual notable que une / unifica dos mundos diferentes, el aplicado y el teórico. le da un nuevo significado abstracto a las entidades físicas, por ejemplo, "tiempo y espacio". No es una mera coincidencia que los matemáticos a veces se refieran a "tecnología", "maquinaria" o "dispositivos" de pruebas. Turing logró fusionar ingeniosamente todo esto en su invención conceptual. su definición es bastante simple, pero su análisis exhibe algunos de los comportamientos emergentes más extraordinarios jamás vistos en la historia del pensamiento científico / matemático. Turing fue el primer científico / matemático en captar gran parte de este significado / poder / potencial.

vzn
fuente
en otras palabras, podría decirse que Turing fue el primero en identificar / "reconocer" la importancia del fenómeno de integridad de Turing y, a su vez, CS "lo reconoce" por este logro monumental mediante el uso del término.
vzn
X