Definición de funciones recursivas primitivas sobre tipos de datos generales

9

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.

Nathaniel
fuente
1
No me queda claro qué es exactamente lo que estás buscando. Parece que solo estás tratando de encontrar tipos W , pero puede que no sea así.
Andrej Bauer
3
Probablemente sea útil tener en cuenta que los tipos de datos "ordinarios" (en forma de árbol) pueden codificarse de forma bastante directa en números naturales, y luego las funciones de PR sobre los naturales son una representación bastante buena de lo que puede desear. Alternativamente, puede utilizar el Sistema T de Gödel extendido a los tipos de datos estrictamente positivos de primer orden con los recurrentes "habituales".
cody
1
Puede restringir los tipos de salida de los eliminadores para que sean tipos básicos si desea eliminar esta "característica".
cody
1
Todavía me parece que lo que estás buscando es una forma de tipos W restringidos. Algo así como los tipos W con ramificación finita y los recursores limitados a la eliminación en otros tipos W restringidos.
Andrej Bauer
1
La conferencia CADE 1996 visita aquí: dblp.org/db/conf/cade/cade96
John Fisher

Respuestas:

5

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 tipoDc1,,cn

ci:T1iT2iTk1iDD

entonces el recursor para el tipo de salida tendrá el tiporecDOO

recDO:(T11Tk11DDOO)DO

y la semántica operativa será:

recDO f1  fn (ci t1tki d1dm)fi t1tki (recDO f1 fn d1)(recDO f1fn dm)

para cada .i

Algo de una boca llena! Al menos para los números naturales, de hecho obtenemos

recNO:(NOO)ONO

recNO f0 f1 0f1 0
y
recNO f0 f1 (S n)f0 n (recNO f0 f1 n)

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

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


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.

cody
fuente
Me temo que esto está algo más allá de mí. ¿Por qué esperábamos obtener como el tipo de firma? ¿Eso significa automáticamente que representa la recursividad primitiva? (Me cuesta imaginar cómo podría leerse eso solo del tipo de una función). Estoy familiarizado con la teoría de tipos en la medida en que puedo programar en Haskell, pero no estoy familiarizado con el formalismo que usted ' Lo estoy usando aquí. ¿Dónde puedo ir a leer suficientes antecedentes para entender lo que escribiste? recNO:(NOO)ONO
Nathaniel
El tipo de deduce del esquema más general anterior. Representa la recursividad primitiva porque la semántica operativa representa la operación de recursión a partir de la definición de funciones de relaciones públicas. Sin embargo, no he explicado la semántica operativa, así que ampliaré mi comentario. recN
cody
No tengo referencias elementales de antemano, aunque supongo que estas diapositivas dan una buena introducción suave, y el capítulo 3 de la tesis de Ralph Mattes entra en grandes detalles técnicos, aunque permite tipos inductivos no de "primer orden".
cody
2

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.

Stephen Skeirik
fuente
0

¿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,)

h0=bh(n+1)=n(hn)

Por ejemplo, la función factorial tiene y .b=1nm=(n+1)×m

Para las listas, un paramorfismo sería una función de la formah

hnil=bh(consab)=a(b,hb)
usuario76284
fuente