Zum Inhalt springen

Hoare-Kalkül

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 3. Mai 2005 um 17:57 Uhr durch 80.146.90.141 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Hoare-Logik (oder Hoare-Kalkül) ist ein Formales System, entwickelt von dem Britischen Informatiker C.A.R. Hoare und später verfeinert von Hoare und anderen Wissenschaftlern. Sie wurde 1969 in einem Artikel mit dem Titel "An axiomatic basis for computer programming" veröffentlicht. Der Zweck des Systems ist es, eine Mege von logischen Regeln zu liefern, die es erlauben, Aussagen über die Korrektheit von Computer-Programmen zu treffen und sich dabei der mathematischen Logik bedienen. Hoare knüpft an frühere Beiträge von Robert Floyd an, der ein ähnliches System für Flussdiagramme veröffentlichte.

Das zentrale Element der Hoare-Logik ist das Hoare-Triple, das beschreibt, wie ein Programmteil den Zustand einer Berechnung verändert:

Dabei nennt man P und Q Zusicherungen (englisch assertions). S ist ein Programmsegment. P heißt die Vorbedingung (englisch precondition) , Q heißt die Nachbedingung (englisch postcondition). Zusicherungen sind Formeln der Prädikatenlogik. Ein Tripel kann auf folgende Weise verstanden werden: Falls P gilt für den Programmzustand vor der Ausführung von S, dann gilt Q danach. Falls S nicht terminiert, dann gibt es kein "danach", also kann in diesem Fall Q jede beliebige Aussage sein. Tatsächlich kann man für Q die Aussage false wählen, um auszudrücken, dass S nicht terminiert. Man spricht hier von "partieller Korrektheit". Falls S terminiert und nach Terminierung ist Q wahr, dann spricht man von "totaler Korrektheit". Die Terminierung muss unabhängig bewiesen werden.

Die Hoare-Logik besteht aus Axiomen und Ableitungsregeln für alle Konstrukte einer einfachen imperativen Programmiersprache:

  • Das Zuweisungsaxiom besagt, dass nach einer Zuweisung jede Aussage für die Variable gilt, welche vorher für die rechte Seite der Zuweisung galt:



ist die Aussage, die dadurch entsteht, dass man in jedes Vorkommen von durch ersetzt.

Genau genommen ist das Zuweisungsaxiom kein einzelnes Axiom, sondern ein Schema für eine unendliche Menge von Axiomen, denn , und können jede mögliche Form annehmen, und kann daraus konstruiert werden.

Ein Beispiel für ein durch das Zuweisungsaxiom beschriebenes Tripels ist:


  • Sequenzregel


Eine Regel kann auf folgende Weise angewendet werden: Wenn die über dem Strich stehenden Aussagen bewiesen worden sind, kann die unter dem Strich stehende Aussage auch als bewiesen angesehen werden.

Betrachtet man zum Beispiel die folgenden beiden Aussagen, die aus dem Zuweisungsaxiom folgen

und

kann man die folgende Aussage daraus folgern:


  • Auswahlregel (if-then-else-Regel)



  • Iterationsregel (while-Regel)



  • Konsequenzregel



Festzuhalten bleibt aber, dass es sich hierbei nur um die Regeln für die partielle Korrektheit handelt. Zur totalen Korrektheit, wie sie bei Programmen benötigt wird, die z.B. Atomkraftwerke steuern, muss man in der While-Regel noch zwei Sachen hinzufügen.

Zum Einen einen Terminierungsausdruck, den man in einer Freien Variablen (z) abspeichert. Nach jedem Schleifendurchlauf muss sichergestellt sein, dass der Terminierungsausdruck (t) echt kleiner geworden ist. Das Zweite ist, dass die zu bestimmende Invariante dahingehend modifiziert werden muss (bzgl. der Invariante der partiellen Korrektheit), dass aus der Invariante folgt, dass der Terminierungsausdruck stets größer oder gleich 0 ist.

  • Whileregel für totale Korrektheit:


Siehe auch

References

  • C. A. R. Hoare. "An axiomatic basis for computer programming". Communications of the ACM, 12(10):576-585, October 1969. [1]