Le fœtus, si vous n'en avez pas entendu parler, peut être lu ici . Il utilise un système de «matrices d'appel» et de «graphiques d'appel» pour trouver tous les «comportements de récursivité» des appels récursifs dans une fonction. Pour montrer qu'une fonction se termine, cela montre que tous les comportements de récursivité des appels récursifs faits à une fonction obéissent à un certain «ordre lexicographique». Son vérificateur de terminaison permet toutes les fonctions récursives primitives et les fonctions telles que la fonction Ackermann. Fondamentalement, il permet une récursion primitive multi-arguments. C'est aussi fondamentalement le vérificateur de terminaison d'Agda; Je crois que Coq a des installations similaires aussi bien que peut-être plus générales.
De la lecture de l'article "Programmation fonctionnelle totale" par DA Turner . Il explique que le langage qu'il propose proposerait d'exprimer tous les "fonctionnels récursifs primitifs" comme on le voit dans le système T étudié par Godel. Il poursuit en disant que ce système est "connu pour inclure toutes les fonctions récursives dont la totalité peut être prouvée dans une logique de premier ordre".
Dose Foetus autorise toutes les fonctions récursives primitives? Si oui, autorise-t-il des fonctions qui ne sont pas des fonctionnelles récursives primitives? Une citation peut-elle être fournie pour la réponse à cela? (ce n'est pas vraiment nécessaire car je suis juste intéressé; c'est juste qu'une lecture conjugale sur le sujet serait bien)
Question bonus: les fonctionnelles récursives primitives ont une définition très concise en termes de combinateurs: typées S et K (qui ne peuvent pas exprimer les combinateurs à virgule fixe), zéro, la fonction successeur et la fonction d'itération; c'est ça. Existe-t-il d'autres langues plus générales qui ont une définition aussi concise et dans lesquelles toutes les expressions se terminent?
Réponses:
Oui, le vérificateur de fœtus peut tout vérifier dans T. de Goedel. Vous pouvez le montrer en utilisant le vérificateur pour montrer que l'opérateur d'itération dans T se termine. Par exemple, la définition suivante fonctionnera:
Ceci est très facile à vérifier pour le vérificateur de fœtus (ou la plupart des autres vérificateurs de terminaison), car il s'agit d'une définition manifestement structurellement récursive.
Agda et Coq permettent toutes deux de prouver la terminaison de fonctions qui vont bien au-delà de ce qui est prouvablement total en arithmétique de premier ordre. La caractéristique qui permet cela est qu'ils permettent de définir des types par récursivité sur les données, ce qui est appelé "grande élimination". (Dans la théorie des ensembles ZF, le schéma de remplacement des axiomes sert à peu près le même objectif.)
Un exemple simple de quelque chose qui va au-delà de T est la cohérence du T de Goedel lui-même! Nous pouvons donner la syntaxe comme type de données:
Notez que la dépendance de type nous permet de définir un type de données de termes contenant uniquement les termes bien typés de T. Nous pouvons alors donner une fonction d'interprétation pour les types:
Cela signifie que cela
N
devrait être les nombres naturels Agda, et la flèche de T devrait être interprétée comme l'espace de fonction Agda. Il s'agit d'une "grande" élimination, car nous définissons un ensemble par récursivité sur la structure du type de données T.On peut alors définir une fonction d'interprétation, montrant que chaque terme du T de Goedel peut être interprété par un terme Agda:
(Je n'ai pas Agda sur cette machine, il y a donc sans doute des importations manquantes, des déclarations de fixité et des fautes de frappe. La correction est un exercice pour le lecteur, qui peut également être éditeur, s'il le souhaite.)
Je ne sais pas quelle est la force de cohérence d'Agda, mais Benjamin Werner a montré que le calcul des constructions inductives (calcul du noyau de Coq) est équitablement compatible avec ZFC plus un nombre incalculable de cardinaux inaccessibles.
la source
À titre de clarification, je dois noter que Fetus est développé par Andreas Abel , qui a également développé le vérificateur de terminaison original pour Agda , et a travaillé sur des techniques de terminaison plus avancées depuis.
la source
Si par fonctionnelles récursives primitives vous entendez des fonctions récursives primitives et que vous savez que le fœtus contient la fonction Ackermann, alors le fœtus ne coïncide pas avec la classe des fonctions pr car la fonction Ackermann n'est pas récursive primitive. Cela a été démontré par Ackermann et plus tard une preuve simplifiée a été donnée par Rosza Peter dans " Konstruktion nichtrekursiver Funktionen " 1935 (malheureusement seulement en allemand pour autant que je sache).
Si vous recherchez de plus grandes classes de fonctions récursives dont la terminaison est garantie et qui pourraient coïncider avec la classe de fonctions capturées par le fœtus, un autre travail de Rosza Peter pourrait vous intéresser.
[modifier] Les fonctions récursives primitives ne sont pas les mêmes que les fonctions récursives primitives comme indiqué dans le commentaire ci-dessous. Pourtant, je pense que l'on pourrait transférer le concept de récursion transfinie aux fonctionnelles. Cependant, il n'est pas clair s'il est toujours plus puissant par rapport à un paramètre fonctionnel.
la source