¿La clase de funciones de recursión primitivas es equivalente a la clase de funciones que Fetus demuestra que termina?

9

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?

Jake
fuente
En Agda vs Coq: siempre leo que el verificador de terminación de Agda es más avanzado y acepta más funciones, la suya es la primera afirmación de lo contrario (esta es una buena regla general cuando se compara Agda con Coq, excepto por la falta de tácticas de Agda: Agda es más investigativo y abierto a extensiones cuya estabilidad está menos establecida). Andreas Abel ha estado trabajando en verificadores de terminación aún más avanzados basados ​​en tipos de tamaño, vea su trabajo en MiniAgda y también este documento .
Blaisorblade
Hay "aceptar más definiciones de funciones" y "tener una clase más grande de funciones computables". Los dos son incomparables. Agda gana en el primer conteo, pero Coq claramente gana en el segundo.
cody
Debo aclarar que no he usado Coq en absoluto y Agda solo un poco. Parecía que, por lo poco que leía, Coq era capaz de definir una clase más amplia de funciones computables, pero no lo sabía, así que dije "Creo que Coq también tiene algunas instalaciones similares, aunque quizás más generales"; "creer" y "quizás" se utilizaron para transmitir que no lo sabía.
Jake

Respuestas:

7

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á:

iter:A(AA)NAiterif0=iiterif(n+1)=f(iterifn)

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:

data T : Set where 
   N : T 
   _⇒_ : T → T → T

data Term : T → Set where 
   zero : Term N
   succ : Term (N ⇒ N)
   k    : {A B : T} → Term (A ⇒ B ⇒ A)
   s    : {A B C : T} → Term ((A ⇒ B ⇒ C) ⇒ (A ⇒ B) ⇒ A ⇒ C)
   r    : {A : T} → Term (A ⇒ (A ⇒ A) ⇒ N ⇒ A)
   _·_  : {A B : T} → Term (A ⇒ B) → Term A → Term B

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:

interp-T : T → Set 
interp-T N       = Nat 
interp-T (A ⇒ B) = (interp-T A) → (interp-T B)

Esto dice que Ndeberí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:

interp-term : {A : T} → Term A → interp-T A
interp-term zero    = 0 
interp-term succ    = \n → n + 1
interp-term k       = \x y → x
interp-term s       = \x y z → x z (y z)
interp-term r       = Data.Nat.fold 
interp-term (f · t) = (interp-term f) (interp-term t)

(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.

Neel Krishnaswami
fuente
Tenga en cuenta que no ha utilizado la eliminación grande en su ejemplo. La gran eliminación en realidad no agrega potencia computacional. La impredecibilidad sí: el sistema F no tiene el primero, pero puede expresar funciones no expresables en el sistema T.
cody
@cody: ¡La función interp-T calcula un conjunto a partir de un término, lo que me parece una gran eliminación! Definitivamente es el caso que las eliminaciones grandes agregan poder: la teoría del tipo Martin-Loef ni siquiera puede derivar inconsistencia de 0 = 1 sin una eliminación grande. (Para ver esto, tenga en cuenta que sin universos / eliminaciones grandes puede borrar todas las dependencias y obtener un término simplemente escrito: esto es lo que Harper y Pfenning hicieron en su prueba de adecuación para LF.)
Neel Krishnaswami
Lo siento: sí, la función interp-T sí utiliza una gran eliminación. También estoy de acuerdo en que probar 0! = 1 sí lo requiere. Sin embargo, definir funciones computables no es lo mismo que probar enunciados matemáticos . Mi respuesta aclara esto un poco. El cálculo puro de construcciones, por ejemplo, no puede probar 0! = 1. Sin embargo, puede definir la función de Ackermann con relativa facilidad.
cody
Esto muestra que Agda tiene un sentido más general de que puede escribir un intérprete para el sistema T, pero no muestra el clima o no. Fetus, un lenguaje que no se escribe de forma dependiente, es más general. ¿Feto puede hacer esto? ¿Agda todavía podría hacer esto si no fuera por una "gran eliminación"?
Jake
1
La documentación de Agda dice que su verificador de terminación usa el algoritmo Fetus. Si tomó T y lo extendió con coincidencia de patrones y definiciones recursivas marcadas por Fetus, no podría escribir un intérprete para T en él. De hecho, no cambiaría en absoluto las funciones computables por T: todas las órdenes de terminación que Fetus calcula están demostrablemente bien fundamentadas en la aritmética de Peano. (Consulte la respuesta de Cody). El algoritmo Fetus le permite escribir más definiciones , sin cambiar el conjunto de funciones que puede calcular. Las grandes eliminaciones de Agda en realidad aumentan el conjunto de funciones.
Neel Krishnaswami
3

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 .

NNFPA2FPAT

PA

T

cody
fuente
¿Cómo puede una clase de funciones que están probablemente terminando (PA ^ 2) ser equivalente a la clase de funciones en el sistema F que no pueden terminar hasta donde yo sé? Además, no entiendo cómo me estás respondiendo la pregunta. ¿Estás diciendo que el sistema T tiene una clase más grande de funciones computables o estás diciendo que el feto es? Creo que hubo un salto en su lógica que esperaba que tuviera más antecedentes de los que realmente tengo. Además, el enlace que proporcionó parece conducir a una página incorrecta que no se procesa correctamente.
Jake
Todas las funciones en el sistema F terminan. Fetus captura una clase más amplia de funciones computables que el sistema T, pero "por accidente", si elimina el polimorfismo, entonces Fetus solo captura exactamente el sistema T. ¿Puede decirme qué enlace no funciona para usted? (y qué navegador está utilizando :)
cody
1

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.

f(a,b)f(a,b1)f(a1,b)

<

(a,b)<(c,d)(a<cbd)(acb<d)
ω2,ω3piiz=p1np2x1p3x2nzxiωω

[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.

John D.
fuente
2
La clase de funciones recursivas primitivas de tipo finito es más general que la clase de funciones recursivas primitivas. Se puede expresar la función de Ackermann, por ejemplo, y puede ser visto en T. sistema de Godel
Jake