¿Qué funciones no puede calcular el Sistema F?


28

En este artículo de Wikipedia sobre la integridad de Turing establece que:

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 mecanografiados se basa en su capacidad para representar la mayoría de los programas informáticos típicos y detectar más errores.

¿Cuál es un ejemplo de una función computable total que no es computable por el sistema F ?

Además, dado que hindley-milner es:

Una restricción del sistema F

por el hecho de que:

la verificación de tipos es indecidible para una variante de estilo Curry del Sistema F, es decir, una que carece de anotaciones de escritura explícitas.

¿Significa esto que el cálculo lambda subyacente a los sistemas de tipo hindley-milner tampoco está completo?

Si esto es cierto, dado que Haskell está claramente completo y sabemos que su base es el cálculo lambda y el sistema de tipo hindley-milner, ¿qué características que no están presentes en el cálculo lambda se agregan para completar el proceso Haskell?



Un ejemplo de la característica que hace que Haskell se complete es la interfaz de código nativo.
Trismegistos

@ Cody gracias por tu comentario. No estoy familiarizado con el sistema T. ¿Estoy en lo cierto al suponer que es el sistema T mencionado aquí ? ¿Cómo se compara y contrasta el sistema T con el sistema F?
Mike HR

NOTA: al buscar en Google system T vs. system F, encontré algo que responde a mi pregunta final que se reformula aquí como: ¿Cómo agregó Haskell la integridad de Turing al Sistema F
Mike HR

1
Creo que @Trismegistos plantea una cuestión filosófica interesante: ¿qué es exactamente Haskell, dónde están sus límites?
Martin Berger

Respuestas:


45

El sistema es bastante expresivo. Como demostrado por Girard aquí , las funciones de tipo NN (donde N se define para ser X . X ( X X ) X ) son exactamente las funciones definibles ( NN ) en segundo orden Heyting aritmética H A 2 . Tenga en cuenta que esto es lo mismo que las funciones definibles en Peano Aritmética de segundo orden .FNNnorteX. X(XX)XnortenorteHUNA2

Probablemente desee comprobar las pruebas y los tipos como una referencia más legible. Tenga en cuenta que esto significa que se pueden escribir muchos programas en el sistema F, desde la función de Ackermann hasta los intérpretes para el sistema Gödel . En cuanto a cualquier lenguaje de programación total (con algunas condiciones leves), el sistema F no puede implementar un autointerpretador , es decir, una función e v a l : NN que toma como entrada un código para un término t del sistema F y devuelve un (código para a) forma normal para tTFmivunal:nortenortetFt. La prueba implica una variante del truco de diagonalización utilizado para la indecidibilidad del problema de detención. Andrej lo explica muy bien aquí .

Para responder a sus otras preguntas: El cálculo subyacente de los lenguajes Hindley-Milner (HM) tampoco está completo en Turing. De hecho, es significativamente más débil que el sistema F , más cercano en expresividad al cálculo λ simplemente tipado .λF λ

Haskell es de hecho Turing completo. La característica más distintiva que permite esto (aunque hay otras) es la presencia de una recursión sin restricciones : la definición de cualquier programa (función) puede referirse al programa en sí. Esto es similar a la adición de un combinador , como se hace en la definición de PCF que simplemente se tipea pero conserva la integridad de Turing con el combinador Y.YY

Tenga en cuenta que hay otras características que hacen que Haskell Turing sea completo, pero generalmente no se consideran parte del lenguaje central, por ejemplo, referencias a funciones, tipos de datos sin restricciones, etc.


1
Wow, esta es una respuesta increíble y responde todo perfectamente. ¡Gracias!
Mike HR

"En cuanto a cualquier lenguaje de programación total ..." Esto no es del todo correcto. Según tengo entendido, hay algunos autointerpretadores para los idiomas totales que funcionan al excluir los programas que no terminan como mal escritos. Ver este documento
jmite

@jmite como se dijo, mi reclamo es correcto. Ese documento se menciona en la discusión vinculada, y Andrej tiene algunas observaciones de seguimiento en su blog: math.andrej.com/2016/01/04/…
cody

11

Es un tanto engañoso decir que el sistema de mecanografía de Haskell es "el sistema de tipo hinley-milner". Los tipos de Haskell son mucho más poderosos, incluidos, entre otros, los tipos de tipo superior. De hecho, el sistema de escritura es tan poderoso que puede incrustar lenguajes de programación completos de Turing en el sistema de escritura, consulte aquí . Esta no es la única razón del poder de Haskell, Cody ha mencionado algunos otros.


Gracias. mi principal exposición a hindley-milner ha sido a través de haskell, así que supongo que podría haber asumido que los tipos de clase superior eran parte de ello. ¿Hindley-milner se refiere simplemente a la inferencia de tipos (por lo tanto, el algoritmo W más probable)? ¿O es algo más? Entiendo que hay una base matemática en el cálculo lambda, solo estoy tratando de entender dónde están los límites lógicos entre el poderoso sistema de tipo de Haskell y cuál sería una implementación mínima de un "sistema de tipo hindley-milner".
Mike HR

Nota: si alguien está interesado en el poder del sistema de tipo haskell, recomendaría el video de Edward Kmett sobre hask , que profundiza (profundamente) en la teoría de categorías utilizando el sistema de tipo haskell.
Mike HR

1
λW
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.