Las funciones recursivas primitivas se definen sobre los números naturales. Sin embargo, parece que el concepto debería generalizarse a otros tipos de datos, permitiéndole hablar sobre funciones recursivas primitivas que mapean listas a árboles binarios, por ejemplo. Por analogía, las funciones recursivas parciales sobre los números naturales se generalizan muy bien a las funciones computables en cualquier tipo de datos, y me gustaría entender cómo hacer el mismo tipo de generalización para las funciones recursivas primitivas.
Intuitivamente, si tuviera que definir un lenguaje imperativo simple que permitiera operaciones básicas en, digamos listas (como concatenación, toma de cabeza y cola, comparación de elementos) y una forma de iteración que requiere saber de antemano cuántas iteraciones ocurrirán ( como iterar sobre los elementos en una lista inmutable), entonces dicho lenguaje debería ser capaz de calcular las funciones recursivas primitivas sobre listas. Pero, ¿cómo puedo entender esto formalmente y, más específicamente, cómo probaría que mi lenguaje computa todas las funciones recursivas primitivas sobre listas y no solo un subconjunto de ellas?
Para ser claros, estoy interesado en entender las funciones recursivas primitivas como una clase bien definida de funciones (si es que lo son), en lugar de solo en la operación de la recursividad primitiva en sí, lo que parece sencillo. Me interesarían los punteros a todo lo que se haya escrito sobre recursividad primitiva sobre estructuras de datos generales, o incluso en cualquier contexto que no sean los números naturales.
Actualización: es posible que haya encontrado una respuesta, en un artículo llamado Walther Recursion , por McAllester y Arkoudas. (Actas de CADE 1996 ). Esto parece contener una versión generalizada de la recursividad primitiva, así como la recursión de Walther más poderosa. Tengo la intención de escribir una respuesta propia una vez que haya digerido esto, pero mientras tanto, esta nota podría ser útil para otros con la misma pregunta.
fuente
Respuestas:
En general, en un lenguaje con tipos de datos (como listas, árboles, etc.) es fácil describir un lenguaje de funciones que se comportan exactamente como esperamos que se comporte la recursividad primitiva.
Por ejemplo, si el tipo de datos es , y los constructores tienen tipoD c1,…,cn
entonces el recursor para el tipo de salida tendrá el tiporecOD O
y la semántica operativa será:
para cada .i
Algo de una boca llena! Al menos para los números naturales, de hecho obtenemos
como se esperaba (¡tenga en cuenta que el constructor cero tiene cero argumentos!).
Si ahora permitimos proyecciones y funciones constantes, y permitimos usos arbitrarios de para los tipos sin función , entonces tiene exactamente una recursividad primitiva.recOD O
De manera tranquilizadora, si todos los s son funcionales, entonces la codificación Gödel habitual del tipo de datos proporciona las mismas funciones recursivas primitivas.Tji
Sin embargo, sería bueno tener una descripción más elegante de este proceso. Esa es la respuesta de Carlos: estos tipos de datos pueden describirse de manera más elegante en la teoría de categorías como las álgebras iniciales de ciertos functores, a menudo llamados functores polinomiales . El recursor es entonces (una variante de) el morfismo inicial de este álgebra, a veces llamado catamorfismo por personas que intentan confundir las cosas. Este morfismo existe por la construcción del álgebra inicial.
Un paramorfismo es solo la variante particular que describí anteriormente.
fuente
Hace poco hice esta misma pregunta y encontré varios artículos de interés:
Lógica Finitaria Inductivamente Presentada : (a) define una lógica que proporciona una noción genérica de recursividad primitiva sobre cualquier tipo de datos que satisfaga ciertos requisitos (b) demuestra que esta lógica es una extensión conservadora de la aritmética recursiva primitiva.
La complejidad de los programas de bucle : demuestra que su noción de programa de bucle es equivalente a las funciones recursivas primitivas.
Programas lógicos para conjuntos recursivos primitivos : demuestra que su clase de programas lógicos es equivalente a funciones recursivas primitivas.
Una caracterización teórica de prueba de las funciones recursivas primitivas de conjuntos : demuestra que todas las funciones recursivas primitivas sobre un conjunto dado son solo aquellas definibles en una teoría de conjuntos muy débil.
fuente
¿Quizás estás pensando en el concepto de un paramorfismo ?
Desde la programación funcional con plátanos, lentes, sobres y alambre de púas :
Para los números naturales, un paramorfismo es una función de la formah=(b,⊕)
Por ejemplo, la función factorial tiene y .b=1 n⊕m=(n+1)×m
Para las listas, un paramorfismo sería una función de la formah
fuente