Les fonctions récursives primitives sont définies sur les nombres naturels. Cependant, il semble que le concept devrait se généraliser à d'autres types de données, permettant de parler de fonctions récursives primitives qui mappent des listes à des arbres binaires, par exemple. Par analogie, les fonctions récursives partielles sur les nombres naturels se généralisent bien aux fonctions calculables sur n'importe quel type de données, et j'aimerais comprendre comment faire le même type de généralisation pour les fonctions récursives primitives.
Intuitivement, si je devais définir un langage impératif simple qui permettait des opérations de base sur, disons des listes (comme la concaténation, prendre la tête et la queue, la comparaison des éléments) et une forme d'itération qui nécessite de savoir à l'avance combien d'itérations se produiront ( comme itérer sur les éléments d'une liste immuable), alors un tel langage devrait tout au plus être capable de calculer les fonctions récursives primitives sur des listes. Mais comment puis-je comprendre cela formellement, et plus précisément, comment pourrais-je prouver que mon langage calcule toutes les fonctions récursives primitives sur des listes et pas seulement un sous-ensemble d'entre elles?
Pour être clair, je suis intéressé à comprendre les fonctions récursives primitives comme une classe de fonctions bien définies (si elles le sont), plutôt que simplement par le fonctionnement de la récursion primitive elle-même, ce qui semble simple. Je serais intéressé par des pointeurs vers tout ce qui a été écrit sur la récursivité primitive sur des structures de données générales, ou même dans un contexte autre que les nombres naturels.
mise à jour: j'ai peut-être trouvé une réponse, dans un article intitulé Walther Recursion , par McAllester et Arkoudas. (Actes de CADE 1996 ). Il semble contenir une version généralisée de la récursion primitive ainsi que la récursion Walther plus puissante. J'ai l'intention d'écrire une auto-réponse une fois que j'ai digéré cela, mais en attendant, cette note pourrait être utile à d'autres personnes ayant la même question.
la source
Réponses:
En général, dans un langage avec des types de données (comme des listes, des arbres, etc.), il est facile de décrire un langage de fonctions qui se comportent exactement comme nous nous attendons à ce que la récursion primitive se comporte.
Par exemple, si le type de données est et que les constructeurs ont le typeD c1,…,cn
alors le récursif pour le type de sortie aura le typerecOD O
et la sémantique opérationnelle sera:
pour chaque .i
Quelque chose d'une bouche pleine! Au moins pour les nombres naturels, on obtient en effet
comme espéré (notez que le constructeur zéro n'a aucun argument!).
Si maintenant nous fonctions et des projections constantes, et des utilisations arbitraires de pour les types non fonctionnels , alors vous avez exactement une récursion primitive.recOD O
De manière rassurante, si tous les sont également non fonctionnels, le codage Gödel habituel du type de données donne les mêmes fonctions récursives primitives.Tji
Ce serait bien d'avoir une description plus élégante de ce processus. C'est là que la réponse de Carlos intervient: ces types de données peuvent être décrits plus élégamment dans la théorie des catégories comme les algèbres initiales de certains foncteurs, souvent appelés foncteurs polynomiaux . Le récurseur est alors juste (une variante de) le morphisme initial de cette algèbre, parfois appelé catamorphisme par les gens essayant de confondre les choses. Ce morphisme existe par construction de l'algèbre initiale.
Un paramorphisme n'est que la variante particulière que j'ai décrite ci-dessus.
la source
Je posais récemment cette question et j'ai trouvé plusieurs articles intéressants:
Logiques finales présentées par induction : (a) définit une logique qui fournit une notion générique de récursion primitive sur tout type de données satisfaisant certaines exigences (b) prouve que cette logique est une extension conservatrice de l'arithmétique récursive primitive.
La complexité des programmes en boucle : prouve que leur notion de programme en boucle est équivalente aux fonctions récursives primitives.
Programmes logiques pour les ensembles récursifs primitifs : prouve que leur classe de programmes logiques est équivalente aux fonctions récursives primitives.
Une caractérisation théorique des preuves des fonctions d'ensemble récursives primitives : prouve que toutes les fonctions récursives primitives sur un ensemble donné ne sont que celles définissables dans une théorie des ensembles très faible.
la source
Vous pensez peut-être au concept d'un paramorphisme ?
De la programmation fonctionnelle avec des bananes, des lentilles, des enveloppes et des barbelés :
Pour les nombres naturels, un paramorphisme est une fonction de la formeh=(b,⊕)
Par exemple, la fonction factorielle a et .b=1 n⊕m=(n+1)×m
Pour les listes, un paramorphisme serait une fonction de la formeh
la source