Écriture de la fonction récursive universelle [fermé]

9

Existe-t-il une courte construction explicite d'une fonction récursive universelle ? Toutes les définitions que j'ai vues impliquent la numérotation des machines Turing d'une manière ou d'une autre, ce qui est possible mais semble difficile et ingérable à écrire dans un langage de programmation de niveau supérieur (comme Python, Haskell, etc.)

sdcvvc
la source
La question a été initialement posée à SO , semble plus appropriée ici.
sdcvvc
1
Ma compréhension est que ce que fait une fonction récursive universelle, c'est exactement de donner une numérotation des fonctions récursives (ou de manière équivalente des machines de Turing) afin que le résultat puisse être calculé à partir de l'index d'une fonction récursive et de l'entrée. Par conséquent, «une fonction récursive universelle sans numéroter les machines de Turing» ne me semble pas plausible.
Tsuyoshi Ito du
3
Pas au niveau de la recherche. Tout interprète pour un langage complet de Turing est une fonction récursive universelle.
Warren Schudy

Réponses:

13

Sûr. Écrivez des routines qui calculent chacune des fonctions récursives primitives de Godel et écrivez une routine pour un opérateur de recherche illimité. L'ensemble des fonctions que vous pouvez calculer de cette manière est équivalent à l'ensemble des fonctions que les machines de Turing peuvent calculer. Plus d'informations ici .

L'inconvénient est que toute contribution à votre programme universel devrait être encadrée en termes de ces opérations simples. Bien sûr, c'est à cela que servent les compilateurs.

Aaron Sterling
la source
10

Tout interprète pour n'importe quelle langue complète de Turing est une fonction récursive universelle. Il existe des interpréteurs pour les langages de haut niveau comme C ++ ou Python.

gg

Kaveh
la source
Un interpréteur pour Turing Machines (ou Register Machines, ou fonctions récursives) est également une fonction récursive universelle, et il n'est pas difficile de les mettre en œuvre. Je les ai implémentés en C ++ il y a quelques années, et je suis sûr que ce serait encore plus simple en Python. Utilisez Google, il existe de nombreux simulateurs gratuits sur Internet, et certains d'entre eux sont même open-source.
Kaveh
8

Une fonction universelle upeut être écrite assez facilement dans un langage de type Haskell (pas d'effets secondaires, fonctions d'ordre supérieur), à savoir:

u f x = f x

La fonction uest universelle parce qu'elle accepte (la description) d' un programme fet d' une bande d'entrée x, et vous indique le résultat de l' exécution fsur x.

Bien que cette réponse ne soit pas entièrement sérieuse, elle montre qu'un compilateur ou un interpréteur pour un langage de type Haskell contient déjà toutes les parties de construction nécessaires à une fonction universelle. La morale de l'histoire est qu'il vaut mieux passer du temps à étudier le fonctionnement des compilateurs et des interprètes que de s'inquiéter de la mise en œuvre d'une fonction universelle en termes de machines de Turing.

Andrej Bauer
la source
Cependant, uprend une fonction - je l'appellerais une fonction d'ordre supérieur. Je voudrais uprendre un entier ou un type de données algébrique régulier. Je ne force aucun modèle de calcul spécifique, tant que l'argument to uest tangible - par exemple, il peut être sérialisé depuis / vers une chaîne.
sdcvvc
Sur une machine réelle (une fois le code compilé) uprend une fermeture, qui est une séquence finie d'octets. Même dans le théorème utm habituel, l'entier qui uprend représente une fonction.
Andrej Bauer
5

Consultez également cet article de John Tromp, utilisant la logique combinatoire. Une version antérieure, apparemment plus disponible, était encore plus nette.

Yuval Filmus
la source