Ich versuche, ein Gesamtbild über die Bedeutung des kleinsten Fixpunkts (lfp) in der Programmanalyse zu erhalten. Zum Beispiel scheint die abstrakte Interpretation die Existenz von lfp zu nutzen. Viele Forschungsarbeiten zur Programmanalyse konzentrieren sich auch stark darauf, den am wenigsten festgelegten Punkt zu finden.
In diesem Artikel in Wikipedia: Knaster-Tarski Theorem wird genauer erwähnt, dass lfp zur Definition der Programmsemantik verwendet wird.
Warum ist es wichtig? Jedes einfache Beispiel hilft mir. (Ich versuche ein großes Bild zu bekommen).
BEARBEITEN
Ich denke, mein Wortlaut ist falsch. Ich fordere die Bedeutung von lfp nicht heraus. Meine genaue Frage (Anfänger) lautet: Wie hilft die Berechnung von lfp bei der Programmanalyse? Zum Beispiel, warum / wie abstrakte Interpretation lfp verwendet? Was passiert, wenn im abstrakten Bereich kein LFP vorhanden ist?
Hoffentlich ist meine Frage jetzt konkreter.
Antworten:
Jede Form der Rekursion oder Iteration in der Programmierung ist tatsächlich ein fester Punkt. Zum Beispiel wird eine
while
Schleife durch die Gleichung charakterisiertdas heißt, das
while b do c done
ist eine LösungW
der Gleichungwo
Φ(x) ≡ if b then (c ; x)
. Aber was ist, wennΦ
es viele Fixpunkte gibt? Welches entspricht derwhile
Schleife? Eine der grundlegenden Erkenntnisse der Programmiersemantik ist, dass dies der am wenigsten festgelegte Punkt ist.Nehmen wir ein einfaches Beispiel, diesmal Rekursion. Ich werde Haskell benutzen. Die rekursive Funktion
f
definiert durchist die überall undefinierte Funktion, weil sie nur für immer läuft. Wir können diese Definition auf ungewöhnlichere Weise umschreiben (aber es funktioniert immer noch in Haskell) als
So
f
ist ein Fixpunkt der Identitätsfunktion:Aber jede Funktion ist ein fester Punkt von
id
. Unter der üblichen domänen-theoretischen Reihenfolge ist "undefiniert" das kleinste Element. Und in der Tat ist unsere Funktionf
die überall undefinierte Funktion.Auf Anfrage hinzugefügt: In den Kommentaren fragte OP nach der Teilreihenfolge für Semantikschleifenn x1, … , X.n dass das Programm lesen und aktualisieren kann und sonst nichts (keine E / A oder Ausnahmen oder Zuweisung neuer Variablen). In diesem Fall kann ein Programm als Transformation des Anfangszustands der Variablen in den Endzustand oder als undefinierter Wert angesehen werden, wenn das Programm zyklisch abläuft. Wenn also jede Variable ein Element einer Menge , entspricht ein Programm einer Zuordnung : für jede Anfangskonfiguration der Variablen wird das Programm entweder divergieren und , oder es wird beendet und den Endzustand erzeugt, der ein Element von . Die Menge aller Zuordnungen ist eine Domäne:V. V.n→ V.n∪ { ⊥ } ( v1, … , V.n) ∈ V.n ⊥ V.n V.n→V.n∪ { ⊥ }
while
(Sie haben angenommen, es sei ein Gitter, aber es muss nicht sein). Eine allgemeinere Frage ist die domänen-theoretische Interpretation einer prozeduralen Sprache, die Variablen manipulieren kann und die grundlegenden Kontrollstrukturen (Bedingungen und Schleifen) aufweist. Es gibt verschiedene Möglichkeiten, dies zu tun, je nachdem, was genau Sie erfassen möchten. Um die Dinge einfach zu halten, nehmen wir an, dass wir eine feste Anzahl globaler Variablenwhile true do skip done
Nur um Ihnen eine Vorstellung davon zu geben, wie dies funktioniert, die Semantik des Programms
e
quelle
But what if Φ has many fixed points?
Während ich die Fixpunktgleichung verstehe, ist in diesem Zusammenhang W \ in L? Wie definieren wir hier Gitter? Ich freue mich über Ihre weitere Ausarbeitung.Hier ist die Intuition: Die kleinsten Fixpunkte helfen Ihnen bei der Analyse von Schleifen.
Bei der Programmanalyse wird das Programm ausgeführt, wobei jedoch einige Details der Daten abstrahiert werden. Das ist alles gut. Die Abstraktion hilft dabei, die Analyse schneller durchzuführen als das eigentliche Ausführen des Programms, da Sie Aspekte ignorieren können, die Sie nicht interessieren. So funktioniert beispielsweise die abstrakte Interpretation: Sie simuliert im Grunde die Ausführung des Programms, verfolgt jedoch nur Teilinformationen über den Status des Programms.
Das Knifflige ist, wenn Sie zu einer Schleife kommen. Die Schleife könnte viele, viele Male ausgeführt werden. Normalerweise möchten Sie nicht, dass Ihre Programmanalyse alle diese Iterationen der Schleife ausführen muss, da die Programmanalyse dann lange dauert ... oder möglicherweise nicht einmal beendet wird. Hier verwenden Sie also einen am wenigsten festen Punkt. Der am wenigsten festgelegte Punkt kennzeichnet im Grunde genommen, was Sie mit Sicherheit sagen können, wird nach Beendigung der Schleife wahr sein, wenn Sie nicht wissen, wie oft die Schleife iteriert.
Dafür wird der am wenigsten feste Punkt verwendet. Da in allen Programmen Schleifen vorhanden sind, werden in der gesamten Programmanalyse die kleinsten Fixpunkte verwendet. Kleinste Fixpunkte sind wichtig, da Schleifen überall sind und es wichtig ist, Schleifen analysieren zu können.
Übrigens sind Rekursion und gegenseitige Rekursion nur eine andere Form der Schleife - daher werden auch sie mit einem am wenigsten festen Punkt behandelt.
quelle