L'inspiration pour cette question est la question (vague) suivante: Quels sont le langage de programmation / les fondements logiques pour avoir une IA qui pourrait raisonner sur son propre code source et le modifier?
Ce n'est pas du tout rigoureux, alors voici ma tentative pour en extraire une question concrète. Il y a deux choses qui m'intéressent:
(A) Un langage de programmation P qui peut représenter et manipuler ses propres programmes comme un programme de type de données (par exemple, comme un AST). (Si vous le souhaitez, un objet de type Program peut être converti en String, qui est le texte d'un programme valide dans ce langage. Ce serait l'opposé de ce que fait un compilateur.)
(B) Une méthode pour raisonner sur ce qu'un programme en langage P fait. Voici deux niveaux auxquels j'y pense:
- Un autre langage Q (avec des capacités de démonstration de théorèmes) qui modélise ce que fait un programme P. Il devrait être capable d'exprimer et de prouver des déclarations comme «le résultat de l'exécution du programme p est foo».
- Une façon de raisonner sur ce qu'un programme p: programme fait dans le langage P lui-même. (Nous prenons donc P = Q ci-dessus.)
Dans quelle mesure quelque chose comme cela a-t-il été mis en œuvre ou quels sont les progrès dans cette direction? Quels sont les obstacles pratiques? À la lumière de l'intention initiale de la question, quelle est la meilleure façon de formaliser le problème?
*
Comme le montrent les réponses (merci!), (A) et (B1) peuvent être effectués séparément, bien qu'il semble que les faire ensemble soit davantage une question de recherche.
Voici quelques-unes de mes premières réflexions sur la question (avertissement: plutôt vague). Voir aussi mes commentaires sur la réponse de Martin Berger.
Je suis intéressé par le langage de programmation modélisant le même langage de programmation, plutôt que par un plus simple (donc P = Q ci-dessus). Ce serait une "preuve de concept" d'un programme capable de "raisonner sur son propre code source". Les langages de programmation typés de manière dépendante peuvent donner des garanties sur les sorties de ses fonctions, mais cela ne compte pas plus comme un "raisonnement sur son propre code source" qu'un "Bonjour tout le monde!" compte comme une quine dans une langue qui imprime automatiquement une chaîne nue --- il doit y avoir une sorte de citation / auto-référence. L'analogue ici a un type de données représentant Program.
Cela semble être un projet assez vaste - plus le langage est simple, plus il est difficile d'exprimer tout ce qu'il contient; plus la langue est compliquée, plus il faut travailler pour modéliser la langue.
Dans l'esprit du théorème de récursivité, un programme peut alors «obtenir» son propre code source et le modifier (c'est-à-dire produire une version modifiée de lui-même). (B2) nous dit alors que le programme devrait être en mesure d'exprimer une garantie sur le programme modifié (cela devrait être capable de récuser, c'est-à-dire qu'il devrait être capable d'exprimer quelque chose sur toutes les modifications futures?).