Wenn Sie mit der Programmüberprüfung vertraut sind, ziehen Sie es wahrscheinlich vor, die Frage vor dem Hintergrund zu lesen . Wenn Sie mit der Programmüberprüfung nicht vertraut sind, können Sie diese Frage möglicherweise immer noch beantworten, aber Sie werden es wahrscheinlich vorziehen, zuerst den Hintergrund zu lesen .
Hintergrund
Es wird oft behauptet, dass die Überprüfung der teilweisen Korrektheit nicht zu entscheiden sei. Lassen Sie uns der Diskussion zuliebe eine ganz besondere Form der Präzisierung dieser Aussage im Stil von Floyd - Hoare auswählen. Ein Flowgraph ist ein Digraph mit einem definierten Anfangsknoten, von dem aus alle Knoten erreichbar sind. Ein Programm ist ein Ablaufdiagramm, dessen Knoten Befehle sind. Es gibt drei Arten von Befehlen (1) Annahmen übernehmen q , (2) Behauptungen assert q , und (3) Zuweisungen v: = e. Hier ist q eine fol-Formel (Logik erster Ordnung), e ist ein fol-Term und v ist eine Variable.
Wir sagen, dass ein Programm teilweise korrekt ist, wenn es eine Möglichkeit gibt, jeden Knoten x mit einer Vorbedingung a (x) und einer Nachbedingung b (x) zu versehen, so dass (1) die Vorbedingung des Anfangsknotens gültig ist, (2) { a (x) } x { b (x) } gilt für alle Befehle x , und (3) ( b (x) impliziert, dass a (y) ) für alle Kanten von x bis y gültig ist . Hier sind die Hoare-Tripel wie folgt definiert:
- { p } setze q { r } bedeutet, dass ( p impliziert ( q und r )) gültig ist
- { p } nehme an, dass q { r } bedeutet, dass (( p und q ) r implizieren ) gültig ist
- { p } v: = e { r } bedeutet, dass (( p mit e als Ersatz für v ) r impliziert ) gültig ist
Hier ist ein handgewelltes Argument, warum die Überprüfung dieser teilweisen Korrektheit nicht zu entscheiden ist: Wenn Sie ein a (x) und ein b (x) eingegeben haben, müssen Sie überprüfen, ob einige Fol-Formeln gültig sind, und das ist nicht zu entscheiden.
Ein typischer Weg, die Beendigung in teilweiser Korrektheit zu kodieren, besteht darin, einige spezielle Aussagen hinzuzufügen, die im Wesentlichen besagen: "Seit meiner letzten Hinrichtung gab es Fortschritte in Richtung Beendigung." Diese Fortschrittszusicherungen müssen so platziert werden, dass alle unendlichen Abläufe auf dem Ablaufdiagramm (die am Anfangsknoten beginnen) unendlich viele Fortschrittszusicherungen enthalten. Um genauer zu sein, nehmen wir an, dass Fortschrittszusagen immer die Form assert u < v haben , wobei u und v positive ganze Zahlen sind, der Zuweisung u : = f vorangestellt ist und der die Zuweisung v : = u folgt . Hier ist f avariante Funktion , u ist sein aktueller Wert und v ist sein früherer Wert. Nun, da wir über "positive ganze Zahlen" sprechen und sie vergleichen, müssen wir sicherstellen, dass ein bisschen mehr als fol verfügbar ist: Nehmen wir an, Peano-Arithmetik ist verfügbar. (Ich habe keine feste Meinung zu dieser Wahl. Sie können sie gerne ignorieren, wenn sie Ihnen zusagt.) Natürlich kann f auch andere Funktionen und Konstanten verwenden, die im Programm erwähnt werden. (Beachten Sie, dass das Hinzufügen von Annahmen zu Beginn des Programms der Einführung nicht logischer Axiome entspricht.)
Wenn das Programm mit den Fortschrittszusicherungen noch teilweise korrekt ist, wissen wir, dass das ursprüngliche Programm beendet wird.
Frage
Bei einem abschließenden Programm ist es schwierig, Variantenfunktionen für Fortschrittsaussagen zu finden. Aber wie schwer? (Ich weiß, dass ich trotz des riesigen Hintergrunds oben diese Frage immer noch offen oder schlecht definiert gelassen habe, je nachdem, wie Sie sie betrachten möchten.)
Anders ausgedrückt: Ich suche eine Referenz, die das Problem der Reduzierung der Terminierung auf teilweise Korrektheit formalisiert und dann etwas über deren Komplexität aussagt. Eine Antwort, die all dies tut, wäre natürlich willkommen.
quelle
Antworten:
Eine Möglichkeit, dies zu beantworten, besteht darin, die rechnerische Komplexität der Entscheidungsprobleme für die als entscheidbar bekannten Klassen von Teilkorrektheits- und Beendigungsabfragen zu berücksichtigen. Eine abstrakte Interpretation unter Verwendung der polyedrischen Domäne kann auf die von Ihnen erwähnten Teilkorrektheitsanmerkungen schließen, wenn die erforderlichen Anmerkungen Konjunktionen linearer Ungleichungen sind. Die Berechnung der abstrakten Nachbedingung ist in Bezug auf die Anzahl der Variablen exponentiell. Dann gibt es den Overhead, den Fixpunkt zu finden. Weitere Informationen hierzu und zur Apron-Bibliothek finden Sie in Cousots frühen Veröffentlichungen, wenn Sie direkt damit spielen möchten.
Das Finden von Variantenfunktionen ist entscheidend, wenn die Variantenfunktionen linear sind. Ich konnte keine vollständige Beschreibung der Komplexität finden, aber "Termination of Linear Programs" von Tiwari enthält einen Abschnitt, in dem die Komplexität erörtert wird. Siehe auch "Eine vollständige Methode zur Synthese linearer Rangfolgenfunktionen" von Podelski und Rybalchenko. Außerdem hat Byron Cook daran gearbeitet, abstrakte Interpretationen zu nutzen, um Abschlussargumente zu erstellen. Siehe z. B. "Rangabstraktionen" und "Varianzanalysen aus Invarianzanalysen". Diese können einen weiteren Einblick in die Beziehung zwischen teilweiser Richtigkeit und Beendigung geben.
Links:
quelle
Es gibt eine offensichtliche Reduktion von der notwendigen Nichtbeendigung zur teilweisen Richtigkeit, nämlich:
P endet nie, wenn es in einem Anfangszustand gestartet wird, der φ iff { φ } erfüllt P {false} gültig ist.
Mir ist bewusst, dass dies eine weitere Nichtantwort ist. Sein Vorteil ist, dass es kürzer als die oben genannten ist.
quelle
Es gibt eine Standardtechnologie - normalerweise natürlich unentscheidbar -, mit der Sie Ihren Graphen mit Vor- und Nachbedingungen füllen können, nämlich mit der schwächsten liberalen Semantik der Vorbedingungen. Hierbei handelt es sich um eine Form der Prädikattransformatorsemantik, die die schwächsten Voraussetzungen für die Erfüllung der Spezifikation oder für die Nichterfüllung bietet -Beendigung. Dies ist im Wesentlichen eine vollständige Theorie der teilweisen Korrektheit für solche Sprachen und tatsächlich der vollständigen Korrektheit
Es ist Kreide und Käse, der entscheidet, welche der Enden und die teilweise Korrektheit die harte Arbeit sind, da beide so schwer unentscheidbar sind. Die teilweise Korrektheit ist jedoch mit Problemen bei der Sprachgestaltung sowohl für Programm- als auch für Spezifikationssprachen verbunden, während die Schwierigkeit der Terminierung eindeutig ist: Für jede Theorie, die zum Nachweis der Terminierung herangezogen wird, gibt es Algorithmen, die terminieren, von denen jedoch nicht nachgewiesen werden kann, dass sie relativ terminieren zu dieser Theorie. Zum Beispiel Berechnungen im reinen polymorphen Lambda-Kalkül enden, aber die Peano-Arithmetik kann dies nicht beweisen.
Mein Eindruck ist, dass die von Patrick Cousot ins Leben gerufene Arbeit zur abstrakten Interpretation die dynamischste in diesem Bereich war, aber ich gebe nicht vor, ein Experte zu sein.
quelle