Hat jemand tatsächlich ein System erstellt, das Computerprogramme anhand der Spezifikation schreibt?

17

Hat jemand jemals ein System geschrieben (Software oder detaillierte Erklärung auf Papier mit einfachen Beispielen), das Computerprogramme generiert? Ich gebe und es wird ein Programm erstellt, das die Primzahlen kleiner als 10 auflistet. ist einfach definiert als Professoren sagen, dass sie es können, aber niemand gibt tatsächliche vollständige Beispiele.Prime(x)x<10Prime(x)

1<xAs.t.1<AA<xx=A×B, with A,BN
Cody
quelle
13
Sie meinen, wie Sie wissen, einen Compiler für eine Allzweck-Programmiersprache?
Sasho Nikolov
1
Hallo - willkommen bei cstheory! Leider handelt es sich bei Ihrer Frage nicht um eine Frage auf Forschungsniveau in der theoretischen Informatik, und sie ist auf dieser Website nicht zum Thema.
Tatsächlich ist dies eine gute Frage, die auf dem neuesten Stand der Forschung steht und sehr vielversprechend ist. Es ist jedoch oft sehr schwierig, genau anzugeben, was Sie wollen. Wenn Sie es schaffen, es zu spezifizieren, dann brauchen Sie ein System, das beweist, dass es sinnvoll ist, dass es machbar ist und das einen mathematischen Beweis erfordert. Aus diesem Beweis kann ein Programm extrahiert werden, das es ausführt. Die Forschung zur Automatisierung des Proofs und der Programmextraktion steckt jedoch noch in den Kinderschuhen, macht jedoch gute Fortschritte. Sie können zum Beispiel bei Coq auf wikipedia.- - - cc @LevReyzin
babou
2
Hier ist ein Buch , das Ihrer Frage entspricht. Da sind andere. Es ist nicht einfach zu verstehen. Die Menge von Coq und Isabelle (ein anderes solches System) umfasst SE-Benutzer, die Ihnen weitere Informationen und Beispiele geben könnten, wenn die Frage nicht geschlossen wäre. Ich habe es gefunden, indem ich im Web nach: coq-Beispielsynthesizer gesucht habe.
Babou
2
Der Bereich der Informatik, der das erfasst, wonach ich frage, heißt Programmsynthese und ist ein aktiver Forschungsbereich.
Huck Bennett

Antworten:

11

Dies ist ein sehr aktives Forschungsthema, das vielversprechend ist, obwohl die vollständige Automatisierung der Programmerstellung wahrscheinlich intrinsische Einschränkungen aufweist (aber sind Menschen besser?). Die Idee ist jedoch nach wie vor sehr nützlich, um die Programmerstellung erheblich zu unterstützen, indem viele Schritte mechanisiert und die Richtigkeit der Programmerstellung automatisch überprüft werden.

Es hängt stark mit einem Ergebnis in der Logik zusammen, das als Curry-Howard-Korrespondenz (oder Isomorphismus) bezeichnet wird und zeigt, dass Computerprogramme und mathematische Beweise sehr ähnlich sind.

Die Idee ist also, dass das System Ihre Programmspezifikation als zu beweisenden Satz verwendet. Im Fall Ihres Beispiels wäre es ungefähr (informell): "Es gibt eine Menge aller Primzahlen, die kleiner als 10 sind".

Dann werden Sie versuchen, diesen Satz zu beweisen, und bestehende Systeme werden Sie dabei unterstützen, den Beweis zu führen, einige Teile, möglicherweise den gesamten Beweis, zu automatisieren und sicherzustellen, dass Sie niemals Fehler machen.

Aus diesem Beweis kann man dann ein Programm extrahieren, das tatsächlich die gewünschte Liste von Primzahlen berechnet, die ursprünglich spezifiziert worden waren.

In der Vergangenheit wurden mehrere Systeme entwickelt, um diese Ideen zu erläutern. Eines der bekannteren war LCF von Robin Milner , der die Sprache ML zu diesem Zweck kreierte . Eines der derzeit fortschrittlichsten Systeme ist Coq .

Es gibt Beispiele, die zum Teil recht komplex sind. Möglicherweise finden Sie einige in dem folgenden Artikel , obwohl dies in keiner Weise eine einfache Lektüre ist und fortgeschrittene Kenntnisse der Logik voraussetzt.

babou
quelle
9

Die wag Antwort: Ja, aber zum Zeitpunkt des Schreibens scheinen die Spezifikationen für die meisten nicht-trivialen Programme genauso schwer zu schreiben und zu debuggen wie die Programme.

Im Ernst, Babous Antwort ist gut, aber ich werde auch vorschlagen, den Bereich der abhängigen Typen zu untersuchen. Es gibt ein ziemlich gutes Buch mit Coq (vollständiger Haftungsausschluss: von einem Freund von mir geschrieben), aber es gibt auch Epigram, Agda und Idris. Isabelle / HOL ist auch einen Besuch wert.

Diese basieren alle auf der Konstruktionsrechnung. Wenn Sie die theoretischen Grundlagen kennenlernen möchten, schlagen Sie die Martin-Löf-Typentheorie nach. Es gibt einige großartige Einführungen.

Pseudonym
quelle
Ich stimme den Spezifikationen voll und ganz zu (und auch dem Rest Ihrer Antwort, aber Sie wissen es besser als ich). Jeder echte Programmierer weiß, wie schwierig es ist, genau anzugeben, was ein Programm tun soll. Es ist ein Hauptproblem in der Softwareentwicklung. Und das übersetzt sich auch hier, obwohl die angesprochenen Probleme im Allgemeinen mathematischer sind. Ich wollte jedoch nicht zu entmutigend klingen (vor allem in Anbetracht der Geschichte dieser Frage, die durch den ersten Kommentar veranschaulicht wird).
Babou
4

In dieser Hinsicht gibt es Programmgeneratoren (dh Systeme, die etwas auf hoher Ebene in einer bestimmten Sprache beschreiben) schon seit Ewigkeiten. Jeder Compiler ist einer davon, genau wie jeder der vielen Parser-Generatoren. Früher waren Systeme mit der Bezeichnung "Sprachen der dritten Generation" beliebt, die (den größten Teil) des Codes einer typischen Geschäftsanwendung mit einer allgemeinen Beschreibung und einem Katalog verfügbarer Daten generierten.

vonbrand
quelle
1

Bei der Logikprogrammierung und allgemein bei der deklarativen Programmierung wird genau das vorausgesetzt, was Sie vorschlagen: Geben Sie aus einer logischen Spezifikation ein Ergebnis zurück, das diese Spezifikation erfüllt.

Ein Bereich, der sich speziell mit dem von Ihnen angegebenen Beispiel "Primzahlen unter 10" zu befassen scheint, ist die Einschränkungsprogrammierung, die versucht, Lösungen für Probleme zu finden, die bestimmte Einschränkungen beinhalten, einschließlich ganzzahliger Einschränkungen, wie die, die Sie angegeben haben.

Möglicherweise möchten Sie ECLiPSe für eine bestimmte (Open Source-) Implementierung eines solchen Systems ausprobieren .

Cody
quelle
Wäre es richtig zu sagen, dass das Logik- / Beschränkungsparadigma mehr darin besteht, Antworten als Programme anzugeben. Natürlich könnte man sagen, dass eine unvollständige Spezifikation ein Programm ist. Aber irgendwie bin ich mir nicht sicher, ob es das gleiche Spiel wie die Programmsynthese ist. Es ist jedoch wahr, dass es das Beispiel beantwortet, da das Beispiel sehr einfach war. Ich will damit nicht sagen, dass die Programmierung von Einschränkungen nur für einfache Probleme gedacht ist.
Babou