Quelqu'un at-il réellement créé un système qui écrit des programmes informatiques à partir de spécifications?

17

Quelqu'un a-t-il déjà écrit un système (logiciel ou explication détaillée sur papier avec des exemples simples) qui génère des programmes informatiques? J'entre et il crée un programme qui répertorie les nombres premiers inférieurs à 10. P r i m e ( x ) est simplement défini comme 1 < x APrjeme(X)X<dixPrjeme(X) professeurs disent qu'ils le peuvent mais personne ne donne d'exemples complets réels.

1<XUNEs.t.1<UNEUNE<XX=UNE×B, avec UNE,BN
cody
la source
13
Vous voulez dire, vous savez, un compilateur pour un langage de programmation à usage général?
Sasho Nikolov
1
Salut - bienvenue dans cstheory! Malheureusement, votre question n'est pas une question de niveau de recherche en informatique théorique et est hors sujet sur ce site.
En fait, c'est une bonne question, au sommet de la recherche actuelle, et très prometteuse. Cependant, il est souvent très difficile de spécifier précisément ce que vous voulez. Si vous parvenez à le spécifier, alors vous avez besoin d'un système qui prouvera que cela a du sens, qu'il est faisable, et cela nécessitera une preuve mathématique. De cette preuve, un programme le faisant peut être extrait. Mais la recherche pour automatiser la preuve et l'extraction du programme en est encore à ses balbutiements, mais progresse bien. Vous pouvez regarder par exemple Coq sur wikipedia.- - - cc @LevReyzin
babou
2
Voici un livre correspondant à votre question. Il y en a d'autres. Ce n'est pas simple à comprendre. La foule Coq et Isabelle (un autre système de ce type) comprend des utilisateurs SE qui pourraient vous donner plus d'informations et d'exemples si la question n'était pas close. Je l'ai trouvé en recherchant sur le Web: exemple de synthèse de programme coq.
babou
2
Le domaine de l'informatique qui saisit ce que je demande s'appelle la synthèse de programmes et est un domaine de recherche actif.
Huck Bennett

Réponses:

11

Il s'agit d'un sujet de recherche très actif, très prometteur, bien que l'automatisation complète de la génération de programmes ait probablement des limites intrinsèques (mais les êtres humains sont-ils meilleurs?). Mais l'idée est toujours très utile pour aider considérablement à la création de programmes en mécanisant de nombreuses étapes, et en vérifiant automatiquement l'exactitude de la génération du programme.

Elle est fortement liée à un résultat en logique, appelé la correspondance de Curry-Howard (ou isomorphisme), qui montre que les programmes informatiques et les preuves mathématiques sont très similaires.

L'idée est donc que le système prendra votre spécification de programme comme un théorème à prouver. Dans le cas de votre exemple, ce serait quelque chose comme (officieusement): "il y a un ensemble de tous les nombres premiers inférieurs à 10".

Ensuite, vous tenterez de prouver ce théorème, et les systèmes existants vous aideront à faire la preuve, à automatiser certaines parties, éventuellement la preuve entière, et à vous assurer de ne jamais faire d'erreurs.

De cette preuve, on peut ensuite extraire un programme qui calcule réellement la liste souhaitée des nombres premiers qui avaient été initialement spécifiés.

Plusieurs systèmes ont été développés dans le passé pour élucider ces idées. L'un des plus connus était LCF de Robin Milner , qui a créé le langage ML à cet effet. L'un des systèmes actuellement les plus avancés est Coq .

Il existe des exemples entièrement élaborés, certains assez complexes. Vous pouvez en trouver dans l' article suivant , bien qu'il ne s'agisse en aucun cas d'une lecture simple et nécessite des connaissances avancées de Logic.

babou
la source
9

La réponse wag: Oui, mais au moment de la rédaction, pour la plupart des programmes non triviaux, les spécifications semblent être aussi difficiles à écrire et à déboguer que les programmes.

Plus sérieusement, la réponse de babou est bonne, mais je vais également suggérer de vérifier la zone des types dépendants. Il y a un assez bon livre utilisant Coq (avertissement complet: écrit par un de mes amis), mais il y a aussi Epigram, Agda et Idris. Isabelle / HOL vaut également le détour.

Tout cela est basé sur le calcul des constructions. Si vous voulez connaître la base théorique, recherchez la théorie des types de Martin-Löf. Il y a d'excellentes présentations.

Pseudonyme
la source
Je suis entièrement d'accord sur les spécifications (et aussi sur le reste de votre réponse, mais vous le savez mieux que moi). Tout vrai programmeur sait à quel point il est difficile de spécifier complètement ce qu'un programme doit faire. C'est un enjeu majeur en génie logiciel. Et cela se traduit également ici, même si les problèmes abordés sont plus mathématiques en général. Cependant, je ne voulais pas paraître trop décourageant (surtout compte tenu de l'histoire de cette question, illustrée par le premier commentaire).
babou
4

Commençant ici dans une tangente, les générateurs de programmes (c'est-à-dire les systèmes qui ont donné une description de haut niveau de quelque chose dans un langage spécial) existent depuis toujours. Tout compilateur en fait partie, tout comme l'un des nombreux générateurs d'analyseurs. À l'époque, les systèmes appelés «langues de troisième génération», qui généraient (la plupart du) le code d'une application métier typique, étant donné une description de haut niveau et un catalogue de données disponibles, étaient populaires.

vonbrand
la source
1

La programmation logique et, plus généralement, la programmation déclarative prennent comme prémisse exactement ce que vous proposez: à savoir, à partir d'une spécification logique, renvoyer un résultat satisfaisant à cette spécification.

Un domaine qui semble répondre spécifiquement à l'exemple des "nombres premiers inférieurs à 10" que vous donnez est la programmation par contraintes qui essaie de trouver des solutions aux problèmes impliquant certaines contraintes, y compris des contraintes entières comme celles que vous avez données.

Vous voudrez peut-être essayer ECLiPSe pour une implémentation spécifique (open source) d'un tel système.

cody
la source
Serait-il exact de dire que le paradigme logique / contrainte est plus de spécifier des réponses que de spécifier des programmes. Bien sûr, vous pourriez dire qu'une spécification incomplète est un programme. Mais d'une manière ou d'une autre, je ne suis pas sûr que ce soit le même jeu que la synthèse de programmes. Il est vrai cependant qu'il répond à l'exemple, car l'exemple était très simple. Je ne veux pas dire que la programmation des contraintes est uniquement pour des problèmes simples.
babou