Feto, si no has oído hablar de él, puedes leerlo aquí . Utiliza un sistema de 'matrices de llamadas' y 'gráficos de llamadas' para encontrar todos los 'comportamientos de recursividad' de llamadas recursivas en una función. Para mostrar que una función termina, muestra que todos los comportamientos de recursividad de las llamadas recursivas realizadas a una función obedecen a un cierto "orden lexicográfico". Su verificador de terminación permite todas las funciones recursivas primitivas y funciones como la función de Ackermann. Básicamente permite la recursividad primitiva de múltiples argumentos. Esto también es básicamente el comprobador de terminación de Agda; Creo que Coq también tiene algunas instalaciones similares, aunque quizás más generales.
De la lectura del documento "Programación funcional total" por DA Turner . Explica que su lenguaje propuesto sería capaz de expresar todos los "funcionales recursivos primitivos" como se ve en el Sistema T estudiado por Godel. Continúa diciendo que este sistema "se sabe que incluye todas las funciones recursivas cuya totalidad se puede demostrar en la lógica de primer orden".
¿Dosis feto permite todos los funcionales recursivos primitivos? Si es así, ¿permite funciones que no son funciones primitivas recursivas? ¿Se puede proporcionar una cita para la respuesta a esto? (esto no es realmente necesario ya que solo estoy interesado; es solo que sería bueno leer un poco sobre el tema)
Pregunta extra: los funcionales recursivos primitivos tienen una definición muy concisa en términos de combinadores: S y K (que no pueden expresar los combinadores de punto fijo), cero, la función sucesora y la función de iteración; Eso es. ¿Hay otros lenguajes más generales que tengan una definición tan concisa y en la que terminen todas las expresiones?
Respuestas:
Sí, el verificador Fetus puede verificar todo en Goedel's T. Puede mostrar esto usando el verificador para mostrar que el operador de iteración en T está terminando. Por ejemplo, la siguiente definición funcionará:
Esto es muy fácil de verificar para el verificador de fetos (o la mayoría de cualquier otro verificador de terminación), porque es una definición obviamente estructuralmente recursiva.
Agda y Coq permiten probar la terminación de funciones que van mucho más allá de lo que es demostrablemente total en la aritmética de primer orden. La característica que permite esto es que permiten definir tipos por recursividad en los datos, lo que se denomina "eliminación grande". (En la teoría de conjuntos ZF, el esquema de reemplazo del axioma sirve aproximadamente para el mismo propósito).
¡Un ejemplo fácil de algo que va más allá de T es la consistencia de la propia T de Goedel! Podemos dar la sintaxis como un tipo de datos:
Tenga en cuenta que la dependencia de tipo nos permite definir un tipo de datos de términos que contienen solo los términos bien tipados de T. Luego podemos dar una función de interpretación para los tipos:
Esto dice que
N
deberían ser los números naturales de Agda, y la flecha de T debería interpretarse como el espacio de la función de Agda. Esta es una eliminación "grande", porque definimos un conjunto por recursividad en la estructura del tipo de datos T.Luego podemos definir una función de interpretación, mostrando que cada término de T de Goedel puede ser interpretado por un término de Agda:
(No tengo Agda en esta máquina, por lo que sin duda faltan algunas importaciones, declaraciones de fijación y errores tipográficos. La reparación es un ejercicio para el lector, que también puede ser editor, si lo desea).
No sé cuál es la fuerza de consistencia de Agda, pero Benjamin Werner ha demostrado que el cálculo de las construcciones inductivas (cálculo del núcleo de Coq) es equiconsistente con ZFC más muchos cardenales inaccesibles.
fuente
Como aclaración, debo señalar que Fetus fue desarrollado por Andreas Abel , quien también desarrolló el verificador de terminación original para Agda , y desde entonces trabajó en técnicas de terminación más avanzadas .
fuente
Si por funciones recursivas primitivas te refieres a funciones recursivas primitivas y sabes que Fetus contiene la función Ackermann, entonces Fetus no coincide con la clase de funciones pr ya que la función Ackermann no es primitiva recursiva. Esto fue demostrado por Ackermann y más tarde Rosza Peter dio una prueba simplificada en " Konstruktion nichtrekursiver Funktionen " 1935 (por desgracia, hasta donde yo sé).
Si busca clases más grandes de funciones recursivas que garanticen la terminación que podrían coincidir con la clase de funciones capturadas por Fetus, entonces podría interesarle algún otro trabajo de Rosza Peter.
[editar] Las funciones recursivas primitivas no son lo mismo que las funciones recursivas primitivas como se señala en el comentario a continuación. Sin embargo, creo que uno podría transferir el concepto de recursión transfinita a funcionales. Sin embargo, no está claro si todavía es más potente con una configuración funcional.
fuente