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.