Ich bin Anfänger und arbeite an Methoden zum Nachweis der Programmäquivalenz. Ich habe einige Artikel über das Definieren logischer Beziehungen oder Simulationen gelesen, um zu beweisen, dass zwei Programme gleichwertig sind. Aber ich bin ziemlich verwirrt über diese beiden Techniken.
Ich weiß nur, dass logische Beziehungen induktiv definiert werden, während Simulationen auf Coinduktion basieren. Warum sind sie so definiert? Was sind ihre Vor- und Nachteile? Welches sollte ich in verschiedenen Situationen wählen?
lo.logic
pl.programming-languages
logical-relations
parametricity
Hongjin Liang
quelle
quelle
Antworten:
Ich habe eine Antwort auf diese Frage, die möglicherweise neu ist. Tatsächlich denke ich die letzten 6 Monate immer noch darüber nach und es wurde noch nicht in Zeitungen darüber geschrieben.
Die allgemeine These lautet, dass Prinzipien des relationalen Denkens wie "logische Beziehungen", "Simulationen" und sogar "Invarianten" Manifestationen der Datenabstraktion oder des Versteckens von Informationen sind. Wo sich Informationen verstecken, tauchen diese Prinzipien auf.
Die ersten, die es entdeckten, waren Automatentheoretiker. Automaten haben versteckten Zustand. Sie benötigen relationale Überlegungen, um über deren Gleichwertigkeit zu sprechen. Automaten-Theoretiker kämpften eine Weile mit Homomorphismen, gaben auf und kamen auf den Begriff "relationale Abdeckung", eine Form von Simulationsbeziehungen.
Milner nahm die Idee in einem wenig bekannten, aber sehr grundlegenden Papier „genannt Ein algebraischer Begriff der Simulation zwischen den Programmen “ im Jahr 1971 Hoare es kannte und benutzte es mit „in der kommenden up Nachweis der Korrektheit von Datendarstellungen “ im Jahr 1972 (aber verwendet Abstraktionsfunktionen statt Beziehungen, weil er sie für "einfacher" hielt). Später widerrief er die Behauptung der Einfachheit und verwendete wieder Relationen in " Verfeinerung der Daten ". Reynolds verwendete relationale Argumentation in " Craft of Programming"", Kapitel 5 (1981). Er dachte, Beziehungen seien natürlicher und allgemeiner als Abstraktionsfunktionen. Wenn Sie zurückgehen und dieses Kapitel lesen, finden Sie relationale Parametrizitätsideen, die darauf warten, entdeckt zu werden. Sicher, zwei Jahre später. Reynolds veröffentlichte "Types, Abstraction and parametric polymorphism" (1983).
Es sieht so aus, als hätten all diese Ideen nichts mit Typen zu tun, aber sie tun es wirklich. Zustandsbehaftete Sprachen und Modelle verfügen über eine integrierte Datenabstraktion. Sie müssen keinen "abstrakten Datentyp" definieren, um Informationen auszublenden. Sie deklarieren einfach eine lokale Variable und verbergen sie. Wir können es in den ersten Wochen den Erstsemestern in Java-Klassen beibringen. Kein Schweiß.
Funktionale Sprachen und Modelle hingegen müssen ihre Informationen über Typen verbergen . In Funktionsmodellen ist keine Datenabstraktion integriert. Wir müssen es explizit hinzufügen , auf, mit oder ∃ . Wenn Sie also eine zustandsbehaftete Sprache in eine funktionale Sprache übersetzen, werden Sie feststellen, dass der gesamte lokale Zustand in Typvariablen übersetzt wird. Für eine explizite Beschreibung, wie dies funktioniert, siehe meine Arbeit " Objekte und Klassen in Algol-ähnlichen Sprachen ", aber die Ideen stammen wirklich von Reynolds 1981 ("Die Essenz von Algol"). Wir verstehen diese klassischen Ideen jetzt besser.∀ ∃
Nehmen Sie zwei Maschinen und M ' , die Sie als gleichwertig beweisen möchten. Milner 1971 sagt, definieren Sie eine Beziehung zwischen den Zuständen von M und M ' und zeigen Sie, dass die beiden Maschinen die Beziehung beibehalten. Reynolds 'Parametrizität besagt, dass die Zustände der Maschinen zu den Typen X gehörenM M′ M M′ X und . Definieren Sie eine Beziehung R zwischen ihnen. Wenn die Maschinen vom Typ F ( X ) und F ( X ′ ) sind , parametrisiert durch die Typen ihrer Zustände, dann prüfen Sie, ob die beiden Maschinen durch die Beziehung F verbunden sindX′ R F(X) F(X′) . F(R)
Also, Simulationen und relationale Parametrizität sind im Wesentlichen die gleiche Idee . Es ist nicht nur eine oberflächliche Ähnlichkeit. Ersteres ist für zustandsbehaftete Sprachen gedacht, in denen eine integrierte Datenabstraktion vorhanden ist. Letzteres gilt für zustandslose Sprachen, bei denen die Datenabstraktion über Typvariablen erfolgt.
Was ist dann mit logischen Beziehungen? An der Oberfläche scheinen logische Beziehungen eine allgemeinere Idee zu sein. Während in der Parametrizität die Beziehung zwischen Typvariablen innerhalb desselben Modells beschrieben wird, scheinen logische Beziehungen Typen über verschiedene Modelle hinweg zu verknüpfen. (Dave Clarke hat eine brillante Darstellung davon geschrieben.) Aber ich habe das Gefühl (und es muss noch gezeigt werden), dass dies ein Beispiel für eine Form höherer Parametrizität ist, die noch nicht formuliert wurde. Seien Sie gespannt auf weitere Fortschritte in diesem Bereich.
[Anmerkung hinzugefügt] Der Zusammenhang zwischen logischen Beziehungen und Simulationen wird in unserem kürzlich erschienenen Artikel Logische Beziehungen und Parametrik: Ein Reynolds-Programm für Kategorietheorie und Programmiersprachen erörtert .
quelle
functor
Einer der Hauptunterschiede besteht darin, dass logische Beziehungen als eine Technik verwendet werden, um zu zeigen, dass eine Klasse von Programmen (z. B. die Eingabe in einen Compiler) einer anderen Klasse von Programmen (z. B. die Ausgabe des Compilers) entspricht, während Simulationsbeziehungen verwendet werden um die Entsprechung zwischen zwei Programmen anzuzeigen.
Die Ähnlichkeit zwischen den beiden Begriffen besteht darin, dass beide eine Beziehung definieren, die zur Darstellung der Korrespondenz zwischen zwei verschiedenen Entitäten verwendet wird. In gewissem Sinne kann man sich eine logische Relation als eine Simulationsrelation vorstellen, die induktiv über die Syntax von Typen definiert wird. Es gibt jedoch verschiedene Arten von Simulationsbeziehungen.
Logische Beziehungen können verwendet werden, um die Entsprechung zwischen einer Sprache wie ML und ihrer Übersetzung in Assemblersprache wie in dem von Ihnen gelesenen Artikel darzustellen. Eine logische Beziehung wird induktiv auf der Typstruktur definiert. Eine logische Beziehung bietet eine kompositorische Möglichkeit, um beispielsweise anzuzeigen, dass eine Übersetzung korrekt ist, indem gezeigt wird, dass die Übersetzung für jeden Typkonstruktor korrekt ist. Bei Funktionstypen würde die Korrektheitsbedingung so etwas wie bedeuten, dass die Übersetzung dieser Funktion eine gut übersetzte Eingabe in eine gut übersetzte Ausgabe umwandelt.
Logische Beziehungen sind eine vielseitige Technik für Sprachen, die auf dem Lambda-Kalkül basieren. Weitere Anwendungen logischer Beziehungen sind (von hier aus ): Charakterisieren der Lambda-Definierbarkeit, Beziehen denotationaler semantischer Definitionen, Charakterisieren des parametrischen Polymorphismus, Modellieren der abstrakten Interpretation, Überprüfen der Datendarstellung, Definieren der vollständig abstrakten Semantik und Modellieren des lokalen Zustands in Sprachen höherer Ordnung.
Simulationsbeziehungen werden im Allgemeinen verwendet, um die Gleichwertigkeit von zwei Programmen zu zeigen. Typischerweise erzeugen solche Programme eine Art Beobachtung, beispielsweise das Senden von Nachrichten auf Kanälen. Ein Programm P simuliert ein anderes Q, wenn P alles kann, was Q kann, wenn auch vielleicht mehr.
Grob gesagt, besteht Bisimulation aus zwei Simulationsbeziehungen. Sie zeigen, dass Programm P und Programm Q simulieren und dass Programm Q Programm P simulieren kann und Sie eine Bisimulation haben, obwohl im Allgemeinen zusätzliche Bedingungen vorliegen. Der Wikipedia-Eintrag zur Bisimulation ist ein guter (genauerer) Ausgangspunkt. Es gibt Tausende Varianten der Idee, aber es handelt sich um eine Grundidee, die in etwa der gleichen Form wie die Informatik, die Modallogik und die Modelltheorie neu erfunden wurde. Sangiorgis Artikel gibt eine wunderbare Geschichte der Idee.
Ein Beitrag, der eine Beziehung zwischen den beiden Begriffen herstellt, ist ein Hinweis zu logischen Beziehungen zwischen Semantik und Syntax von Andy Pitts, der logische Beziehungen verwendet, letztendlich einen syntaktisch definierten semantischen Begriff, um eine bestimmte Eigenschaft über die anwendbare Bisimulation zu beweisen , die ein rein syntaktischer Begriff ist.
quelle
Die beiden Arten von Beziehungen scheinen in unterschiedlichen Kontexten verwendet zu werden. Logische Simulationen für typisierte Sprachen und Simulationsbeziehungen im Umgang mit Prozesskalkülen oder modalen Logiken, die über Übergangssysteme interpretiert werden. Dave Clarke hat viele intuitive Erklärungen geliefert, daher möchte ich nur ein paar Hinweise hinzufügen, die hilfreich sein können.
Es wurde daran gearbeitet, beide Begriffe durch abstrakte Interpretation zu charakterisieren. Es ist vielleicht nicht das, was Sie wollen, aber zumindest werden beide Begriffe im selben mathematischen Rahmen behandelt.
Samson Abramsky verwendete logische Beziehungen, um die Zuverlässigkeit und die Beendigung der Strenge für die Lazy Lambda-Rechnung ( Abstrakte Interpretation, Logische Beziehungen und Kan-Erweiterungen ) zu beweisen . Er zeigte auch, dass die logischen Beziehungen Abstraktionsfunktionen im Sinne einer abstrakten Interpretation definieren. In jüngerer Zeit haben Backhouse und Backhouse gezeigt, wie Galois-Verbindungen für Typen höherer Ordnung aus Galois-Verbindungen für Basistypen konstruiert werden und dass diese Konstruktionen unter Verwendung logischer Beziehungen äquivalent beschrieben werden können ( Logical Relations und Galois Connections ) . Im spezifischen Kontext typisierter funktionaler Sprachen sind die beiden Begriffe also gleichwertig.
Simulationsbeziehungen charakterisieren die Eigenschaftserhaltung zwischen Kripke-Strukturen für verschiedene modale und zeitliche Logiken. Anstelle von Typen haben wir Modalitäten in einer Logik. Simulationsbeziehungen definieren auch Galois-Verbindungen und damit Abstraktionen. Man kann sich fragen, ob diese Abstraktionen besondere Eigenschaften haben. Die Antwort ist, dass Standardabstraktionen fundiert und auf Simulationsbeziehungen basierende Abstraktionen vollständig sind. Der Begriff der Vollständigkeit bezieht sich auf Galois-Verbindungen, die möglicherweise nicht mit der intuitiven Interpretation übereinstimmen. Diese Arbeit wurde von David Schmidt ( Strukturerhaltende binäre Beziehungen für die Programmabstraktion ) sowie Francesco Ranzato und Francesco Tapparo ( Verallgemeinerte starke Bewahrung durch abstrakte Interpretation ) entwickelt.
quelle
Ich würde sagen, dass die beiden Konzepte etwas vage sind. In beiden geht es um binäre Beziehungen von Rechenmechanismen, die irgendwie einen Begriff von Gleichheit verkörpern. Logische Beziehungen werden durch Induktion der Typstruktur definiert, während Simulationen definiert werden können, wie Sie möchten, aber der Begriff spielt auf die Koinduktion an.
quelle