Programminversionsalgorithmen für Programme höherer Ordnung

10

Der Begriff Programminversion hat mehrere Bedeutungsschattierungen, wurde aber wahrscheinlich mit J. McCarthys 1956er Arbeit The Inversion of Functions Defined by Turing Machines im Kontext der KI begonnen. Inzwischen wurden viele Zusammenhänge zwischen Programminversion und anderen Bereichen entdeckt, z. B. reversible Programmierung (physikalisch und logisch), Teilbewertung, Verifizierung, bidirektionale Programmierung, Logikprogrammierung und maschinelles Lernen.

Was ist Programminversion? In erster Näherung ist es ungefähr so: Wenn ein Programm Argumente vom Typ und Ergebnisse vom Typ zurückgibt, erzeugen Sie ein Programm , das "irgendwie" die Umkehrung von . Ich bin hier absichtlich vage, da das Konzept auf verschiedene Weise geklärt werden kann (und wird): z. B. muss injektiv sein? Sollte alle oder nur einige so dass ?A B P - 1 P P P - 1 ( b ) a P ( a ) = bP:ABABP1PPP1(b)aP(a)=b

Es gibt generische Möglichkeiten, ein Programm zu invertieren, z. B. die Diagonalisierung, wie bereits von McCarthy ausgeführt, oder die teilweise Bewertung, aber sie sind in der Regel nicht effizient. Außerdem scheinen sich die meisten mir bekannten Arbeiten zur Programminversion nicht mit vollständigen Programmiersprachen höherer Ordnung (dh -calculi) zu befassen.λ

Referenzanfrage. Was ist der Stand der Technik bei expliziten Algorithmen zur Programminversion von -calculi (ohne Einschränkung der höheren Orderness)?λ

Martin Berger
quelle

Antworten:

5

Es gab nicht viel Arbeit in diesem Raum, aber welche Arbeit es gibt, ist ziemlich interessant.

  1. Torben Mogensen hat an diesem Problem gearbeitet. Hier sind zwei Papiere von ihm.

    Das erste Papier enthält einen Algorithmus für Funktionsprogramme erster Ordnung und das zweite erweitert ihn auf Funktionen höherer Ordnung. Die genaue Charakterisierung, wann dieser Algorithmus erfolgreich sein wird, bleibt der zukünftigen Arbeit überlassen.

  2. Tetsuo Yokoyama, Holger Bock Axelsen und Robert Glück.

    Dies beschreibt die RFun-Programmiersprache, die Funktionsprogramme erster Ordnung invertiert, jedoch Einschränkungen hinsichtlich Injektivität und Rückwärtsdeterminismus erzwingt, die sicherstellen, dass die Rückwärtsauswertung so schnell wie vorwärts ist. (Sie haben eine Reihe anderer Artikel zu diesem Thema geschrieben, die ich nur schwer bekommen konnte.)

  3. Stefan Bohne und Baltasar Trancón Widemann.

    Dies ist ein wirklich ordentliches Papier! Es wird festgestellt, dass (a) Sie eine Kategorie erstellen können, in der die Morphismen Funktionen sind, die mit ihrer Umkehrung gepaart sind (für jeden bestimmten Begriff der Umkehrung, den Sie verwenden), und (b) diese Kategorie eine kompakte Dolchstruktur aufweist. Dies bedeutet, dass Sie ein Programm mit einer leicht funky linearen Disziplin schreiben und dann die Vorwärts- und Rückwärtsinterpretationen aus der Semantik ablesen können.

    Sie geben eine funktionale Sprache mit einer ziemlich wilden Syntax: Nahezu willkürliche Ausdrücke können als Muster verwendet werden, und Reversibilität macht es sinnvoll.

  4. Francesco Tiezzia, Nobuko Yoshida

    Ich habe diesen Artikel nicht gelesen, sondern erst entdeckt, als ich nach den anderen Zeitungen gegoogelt habe. Angesichts der Autoren und des Themas vermute ich, dass dies genau das Richtige für Sie ist!

Neel Krishnaswami
quelle
Vielen Dank. (2, 3, 4) führen keine Programminversion durch, sondern entwerfen Programmiersprachen, in denen Programme per Definition reversibel / invertierbar sind. Dies ist ein eng verwandtes, aber anderes Problem. Tatsächlich ist mir nicht ganz klar, wie diese Probleme zusammenhängen. Ich hatte vorher keine Halbinversion gesehen, vielleicht löst es das Problem bereits, da die Inversion ein Randfall der Halbinversion zu sein scheint? Übrigens geht Mogensens zweites Papier nur bis zur 2. Ordnung.
Martin Berger
@ MartinBerger: Ich denke, die Beziehung hängt davon ab, wofür Sie die Programminversion verwenden möchten! Ich habe mich für das Problem interessiert, weil ich mich mit Typinferenz befasst habe (wenn Sie Funktionen auf Typebene haben, ist es nützlich, diese Funktionen invertieren zu können, um Quantifiziererinstanziierungen herauszufinden), und daher war das Einschränken der Sprache kein Showstopper für mich. Was versuchst du zu machen?
Neel Krishnaswami
Im Moment interessiert mich das allgemeine, abstrakte Problem. Mein Interesse an Programmumkehrung kommt von der Programmüberprüfung. Und ich konnte nirgendwo etwas finden, das einfach einen Lambda-Begriff (von PCF say oder STLC) nimmt und ihn invertiert. Liegt es daran, dass ich nicht am richtigen Ort suche?
Martin Berger