Die Inspiration für diese Frage ist die folgende (vage) Frage: Was sind die programmiersprachlichen / logischen Grundlagen für eine KI, die über ihren eigenen Quellcode nachdenken und ihn modifizieren könnte?
Das ist überhaupt nicht streng, also hier ist mein Versuch, eine konkrete Frage daraus zu extrahieren. Es gibt zwei Dinge, die mich interessieren:
(A) Eine Programmiersprache P, die ihre eigenen Programme als Datentyp Programm darstellen und manipulieren kann (zB als AST). (Falls gewünscht, kann ein Objekt vom Typ Programm in einen String konvertiert werden. Dies ist der Text eines gültigen Programms in dieser Sprache. Dies ist das Gegenteil von dem, was ein Compiler tut.)
(B) Eine Methode, um zu überlegen, was ein Programm in der Sprache P macht. Hier sind zwei Ebenen, über die ich nachdenke:
- Eine andere Sprache Q (mit Theoremprüfungsfähigkeiten), die modelliert, was ein P-Programm tut. Es sollte in der Lage sein, Aussagen wie "das Ergebnis der Ausführung von Programm p ist foo" auszudrücken und zu beweisen.
- Eine Möglichkeit zu überlegen, was ein Programm p tut: Programm in der Sprache P selbst. (Also nehmen wir P = Q oben.)
Inwieweit wurde so etwas umgesetzt, oder wie ist der Fortschritt in diese Richtung? Was sind die praktischen Hindernisse? Wie lässt sich das Problem angesichts der ursprünglichen Fragestellung am besten formalisieren?
*
Wie die Antworten zeigen (danke!), Können sowohl (A) als auch (B1) separat durchgeführt werden, obwohl es eher eine Forschungsfrage zu sein scheint, wenn sie zusammen durchgeführt werden.
Hier sind einige meiner ersten Gedanken zu dieser Frage (Warnung: ziemlich vage). Siehe auch meine Kommentare zu Martin Bergers Antwort.
Ich interessiere mich für die Programmiersprache, die dieselbe Programmiersprache modelliert , und nicht für eine einfachere (also P = Q oben). Dies wäre ein "Proof of Concept" für ein Programm, das "über seinen eigenen Quellcode nachdenken kann". Abhängig getippte Programmiersprachen können Garantien für die Ausgabe ihrer Funktionen geben, aber dies gilt nicht mehr als "Begründen des eigenen Quellcodes" als "Hallo Welt!" Zählt als Quine in einer Sprache, die automatisch einen nackten String ausgibt - es muss eine Art Zitat / Selbstreferenz geben. Das Analoge hier ist ein Datentyp, der Program darstellt.
Es scheint ein ziemlich großes Projekt zu sein - je einfacher die Sprache, desto schwieriger ist es, alles darin auszudrücken; je komplizierter die sprache, desto mehr arbeit muss geleistet werden, um die sprache zu modellieren.
Im Geiste des Rekursionssatzes kann ein Programm dann seinen eigenen Quellcode "holen" und ihn modifizieren (dh eine modifizierte Version von sich selbst ausgeben). (B2) sagt uns dann, dass das Programm in der Lage sein sollte, eine Garantie für das geänderte Programm auszudrücken (dies sollte wiederverwendbar sein, dh es sollte in der Lage sein, etwas über alle zukünftigen Änderungen auszudrücken-?).
Antworten:
Ich denke, Sie fragen nach zwei verschiedenen Dingen.
Für analytische Zwecke ist es nützlich, sie getrennt zu halten. Ich werde mich auf Ersteres konzentrieren.
Die Fähigkeit eines Programmiersprachen darzustellen, zu manipulieren (und Lauf) ihre Programme als Daten unter Begriffen wie gehen Meta-Programmierung oder Homoikonizität .
Auf (umständliche) Weise können alle bekannten Programmiersprachen Metaprogramme erstellen, indem sie den Datentyp string zusammen mit der Möglichkeit verwenden, externe Programme (Compiler, Linker usw.) für Strings aufzurufen (z. B. indem sie in die Datei geschrieben werden) System zuerst). Das meinen Sie aber wahrscheinlich nicht. Sie haben wahrscheinlich eine gute Syntax im Sinn. Strings sind keine gute Syntax für die Programmdarstellung, da fast alle Strings keine Programme darstellen, dh der Datentyp "string" enthält eine Menge "Junk", wenn er als Mechanismus für die Programmdarstellung angesehen wird. Erschwerend kommt hinzu, dass die Algebra der Zeichenfolgenoperationen im Wesentlichen keinen Zusammenhang mit der Algebra der Programmkonstruktion hat.
Was Sie wahrscheinlich im Sinn haben, ist etwas viel Schöneres. Zum Beispiel , wenn ein Programm ist, dann ⟨ P ⟩ ist P , sondern als Daten zur Hand zur Manipulation und Analyse. Dies wird oft als Zitat bezeichnet . In der Praxis ist das Zitat unflexibel, daher verwenden wir stattdessen das Quasi-Zitat , eine Verallgemeinerung des Zitats, bei der das Zitat "Lücken" aufweisen kann, in denen Programme ausgeführt werden können, die Daten zum "Füllen" der Lücken bereitstellen. Zum Beispiel ⟨ i fP ⟨ P⟩ P ist ein quasi-Zitat ein bedingtes darstelltdem anstelle einer Bedingungwir ein Loch [ ⋅ ] . Wenn das Programm M auswertetum die Daten ⟨ x > 0 ⟩ , danndas quasi-Zitat ⟨ i f
(Beachten Sie, dass ein normales Programm ist (kein Programm als Daten), das ein in Anführungszeichen gesetztes Programm zurückgibt, dh Programm als Daten.) Damit dies funktioniert, benötigen Sie einen Datentyp, um Programme darzustellen. Typischerweise heißt dieser Datentyp AST (abstract syntax tree), und Sie können (quasi) Anführungszeichen als Abkürzungsmechanismen für ASTs sehen.M
Mehrere Programmiersprachen bieten Quasi-Anführungszeichen und andere Funktionen für die Metaprogrammierung. Es war Lisp mit seiner Makrofunktionalität, das diese Fähigkeit, Programme als Daten zu behandeln, zum Pionier machte. Möglicherweise beruhte die Leistung von Lisp-basierten Makros lange Zeit weitgehend auf Lisps minimalistischer Syntax. Erst mit MetaML (1) wurde gezeigt, dass eine moderne, syntaktisch reiche Sprache zur Metaprogrammierung fähig ist. Seitdem sind MetaOCaml (2) (ein Nachkomme von MetaML, wichtig für seinen Durchbruch bei der noch andauernden Suche nach einer Lösung für das Problem der Typisierung von Programmen als Daten), Template Haskell (3) und Converge (4) (die erste Sprache von MetaML) Ich habe gezeigt, dass eine Vielzahl moderner Programmiersprachen Metaprogramme aufnehmen kann. Es ist wichtig zu erkennen, dass wir nehmen könnenjede Programmiersprache und verwandle sie in eine Meta-Programmiersprache L m p , die L ist, zusammen mit der Fähigkeit, ihre eigenen Programme als Daten darzustellen (und auszuwerten).L Lm p L
In Bezug auf die zweite Dimension werden Argumente zu Programmen als Daten angegeben. Sobald Sie Programme in Daten konvertieren können, handelt es sich um "normale" Daten, die als Daten interpretiert werden können. Sie können jede Art von Beweistechnologie verwenden, z. B. abhängige Typen oder Verträge oder interaktive Theorembeweiser oder automatisierte Werkzeuge, wie Joshua ausgeführt hat. Sie müssen jedoch die Semantik Ihrer Sprache im Argumentationsprozess darstellen. Wenn diese Sprache, wie Sie es wünschen, über Fähigkeiten zur Metaprogrammierung verfügt, können die Dinge etwas kompliziert werden und es wurde nicht viel in diese Richtung gearbeitet, wobei (5) die einzige Programmlogik für diesen Zweck ist. Es gibt auch Curry-Howard-basierte Arbeiten zur Argumentation über Meta-Programmierung (6, 7, 8). Beachten Sie, dass diese logikbasierten Ansätze, und der typbasierte Ansatz (2) kann tatsächlich Eigenschaften ausdrücken, die für alle zukünftigen Metaprogrammierungsstufen gelten. Abgesehen von (2) wurde keines dieser Papiere umgesetzt.
Zusammenfassend lässt sich sagen, dass das, wonach Sie gefragt haben, implementiert wurde, aber recht subtil ist und es noch offene Fragen gibt, insbesondere im Zusammenhang mit Typen und rationalisiertem Denken.
W. Taha. Mehrstufige Programmierung: Theorie und Anwendungen .
W. Taha und MF Nielsen. Umgebungsklassifikatoren .
T. Sheard und S. Peyton Jones. Template-Metaprogrammierung für Haskell .
L. Tratt. Metaprogrammierung zur Kompilierungszeit in einer dynamisch typisierten OO-Sprache .
M. Berger, L. Tratt, Programmlogik für homogene Metaprogrammierung .
R. Davies, F. Pfenning, Eine Modalanalyse der Stufenberechnung .
R. Davies, Ein zeitlogischer Ansatz zur Bindungszeitanalyse .
T. Tsukada, A. Igarashi. Eine logische Grundlage für Umgebungsklassifizierer .
quelle
Nein, es gibt kein aktuelles System, das alle vier Schritte in Ihrem System ausführt. Wenn Sie ein System entwerfen möchten, ist eine der ersten Anforderungen die homoikonische Sprache. Zumindest möchten Sie, dass Ihre Kernprogrammiersprache so klein wie möglich ist, damit sie funktioniert, wenn Sie das System betreten und beginnen, es selbst interpretieren zu lassen. Sie möchten also einen Metacircular-Interpreter, der Pionierarbeit geleistet hat. Andere Sprachen haben es auch getan, aber es gibt eine enorme Menge vorhandener Forschung über Lispeln.
Der erste Schritt, wenn Sie dies tun möchten, ist eine homoikonische Sprache wie Lisp oder ein Framework, in dem Sie über ein laufendes Programm nachdenken können. Lisp wird hierfür nur aus dem Grund verwendet, dass Sie einen Metacircular-Interpreter in der Sprache definieren oder Ihren Code einfach als Daten behandeln können. Das Wichtigste ist, den Code als Daten zu behandeln. Es wird diskutiert, was Homoiconic im c2-Wiki bedeutet.
In Lisp ist Ihr "Programm" -Datentyp beispielsweise ein gültiges Lisp-Programm. Sie übergeben die lisp-Programme an einen Interpreter und dieser berechnet etwas. Es wird vom Interpreter abgelehnt, wenn Sie kein gültiges "Programm" programmieren.
Daher erfüllt eine homoikonische Sprache drei Ihrer Anforderungen. Sie können sogar die Idee eines formalen Programms in Lisp definieren.
Können Sie lisp inside lisp modellieren? Ja, dies wird häufig hauptsächlich als Übung am Ende eines Lisp-Programmierbuchs durchgeführt, um Ihre Fähigkeiten zu testen. SICP
Zur Zeit ist die vierte Ausgabe eine Forschungsfrage und unten habe ich festgestellt, dass versucht wird, diese Frage zu beantworten.
Ich würde sagen, dass es viele Arten von Programmen gibt, die dies versuchen. Nachfolgend finden Sie alle mir bekannten Programme.
JSLint ist ein Beispiel für statische Analysatoren, die Maschinencode oder eine andere Sprache verwenden und explizit nach Fehlern suchen. Dann fordert es einen Programmierer auf, dies zu korrigieren.
Coq ist eine Umgebung, in der Sie Proofs mithilfe einer Programmiersprache angeben können. Es gibt auch Taktiken, mit denen Sie das Problem lösen können. Trotzdem erwartet dies, dass ein Mensch die Arbeit erledigt. Coq arbeitet mit abhängigen Typen und ist daher sehr typentheoretisch. Es ist sehr beliebt bei Informatikern und Leuten, die an der Homotopietypentheorie arbeiten.
ACL2 hingegen ist ein automatisierter Theorembeweiser. Dieses System prüft Aussagen, die auf etwas basieren, das Sie programmieren.
ACL2 und Coq haben ein Software-Plugin, das ihr System mit einem maschinellen Lernsystem verbindet . Was zum Trainieren dieser Systeme verwendet wird, sind zuvor geschriebene Programme. Nach meinem Verständnis fügen diese Systeme ein weiteres Merkmal hinzu, bei dem Sie nicht nur Ihre Taktik, sondern auch Theoreme vorgeschlagen haben, die bei der Beweisentwicklung helfen.
Im Folgenden finden Sie eine grundlegende Beschreibung Ihrer Frage.
quelle
In der Antwort von @ user217281728 heißt es , dass es eine Art von Maschinen gibt, die mehr mit Inferenz und KI zu tun haben , nämlich Gödel Machines
Die zitierte Veröffentlichung von Jürgen Schmidhuber über "Goedel-Maschinen: Selbstreferenzielle universelle Problemlöser, die nachweislich optimale Selbstverbesserungen bewirken" (2006), arXiv: cs / 0309048v5
Die Art und Weise, wie die Maschine arbeitet, um Meta-Lernen zu implementieren , besteht aus zwei Phasen:
Da die Maschine ihre eigene Quelle ändert, ist sie selbstreferenziell, dh sie hat die Eigenschaft der Selbstmodifikation (siehe auch hier ).
In diesem Sinne kann es den Lernalgorithmus selbst im strengen Sinne modifizieren (als Beweis für optimale Selbstmodifikationen). Es gibt die Probleme mit Selbstreferenz und Unentscheidbarkeit, die in diesem Fall die Form annehmen:
Andere Sprachen (und ihre zugeordneten Interpreter-Maschinen), die die Eigenschaft der Selbstmodifikation haben, sind beispielsweise LISP .
In LISP sind Code und Daten austauschbar, oder der Quellcode AST ist als Daten im LISP-Programm verfügbar und kann als Daten geändert werden. Andererseits können Daten für einige Quellcodes als AST angesehen werden.
aktualisieren
Es gibt auch andere Maschinen , wie beispielsweise Selbstprogrammiermaschinen , die Selbstreferenz , Selbstreproduktion und Selbstprogrammierung kombinieren .
Ein interessanter Aspekt der obigen Ausführungen ist, dass die Selbstreferenz überhaupt nicht problematisch ist , sondern ein notwendiges Element in Automaten zur Selbstreproduktion / Selbstprogrammierung ist .
Weitere Einzelheiten (und weitere Veröffentlichungen) finden Sie in JP Moulin, CR Biologies 329 (2006).
abstrakt
quelle
Dieser Artikel von Jürgen Schmidthuber könnte Sie interessieren:
http://arxiv.org/pdf/cs/0309048.pdf
quelle