Programmverifikation
Programmverifikation
Programmverifikation
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Algorithmen und Datenstrukturen 1<br />
<strong>Programmverifikation</strong>
Inhalt<br />
• Korrektheit von Algorithmen<br />
• Freies Testen mit Debugger<br />
• Systematisches Testen mit JUnit<br />
• Logik-Repetition<br />
• <strong>Programmverifikation</strong><br />
• Java Assertions vs. Exceptions<br />
• Literatur<br />
• Wikipedia zum Stichwort Algorithmus: http://de.wikipedia.org/wiki/Algorithmus<br />
• Kompendium Theoretische Informatik. Ingo Wegener.<br />
Teubner, 1996.<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-2
Lernziele<br />
• Der Begriff Programmspezifikation ist Ihnen verständlich und Sie<br />
wissen wie daraus der Korrektheitsbegriff abgeleitet wird.<br />
• Sie verstehen den grundsätzlichen Unterschied zwischen dem<br />
Testen von Programmen und dem formalen Beweisen der<br />
Korrektheit.<br />
• Sie sind in der Lage, Programme mit Hilfe von JUnit gezielt auf<br />
Schwachstellen zu untersuchen und deren Verhalten mit Hilfe eines<br />
Debugger nachzuvollziehen.<br />
• Von einfachen Programmen können Sie selber formal beweisen, ob<br />
sie korrekt sind.<br />
• Sie können Vor- und Nachbedingungen mit Hilfe von Assertions in<br />
Java gezielt einsetzen.<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-3
Black and White<br />
• Gegeben<br />
• Behälter mit w weissen Kugeln und b schwarzen Kugeln<br />
• mindestens eine Kugel ist im Behälter: b + w ≥ 1<br />
• Ablauf (Prozess)<br />
• solange wenigstens zwei Kugeln im Behälter sind, zufällig zwei Kugeln<br />
rausnehmen und …<br />
• haben beide herausgenommenen Kugeln die gleiche Farbe<br />
eine weisse Kugel in den Behälter legen<br />
• haben beide herausgenommenen Kugeln unterschiedliche Farben<br />
schwarze Kugel in den Behälter zurücklegen<br />
• Gesucht<br />
• Terminiert dieser Ablauf?<br />
• Falls ja, wie und wovon hängt die Schlusssituation ab?<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-4
Verbindungslinien<br />
• Gegeben<br />
• n schwarze und n weisse Punkte in der Ebene<br />
• keine drei Punkte kollinear (in einer Reihe)<br />
• Ablauf<br />
• je ein weisser und ein schwarzer Punkt werden mit einer Strecke<br />
verbunden<br />
• jeder Punkt darf nur mit einem andern Punkt verbunden werden<br />
• Gesucht<br />
• Existiert eine schnittfreie Anordnung der Verbindungsstrecken?<br />
• Falls ja, wie findet man eine solche?<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-5
Korrektheit eines Algorithmus<br />
• Ein Algorithmus heisst korrekt, wenn er seiner Spezifikation genügt<br />
wenn er zu allen Eingabedaten, die der Vorbedingung genügen, die<br />
Ausgabedaten erzeugt, welche die Nachbedingung erfüllen.<br />
• Die Überprüfung eines Algorithmus hinsichtlich Korrektheit kann auf<br />
zwei grundsätzlich verschiedene Weisen erfolgen:<br />
• Verifikation (formale Methode)<br />
Mittels logischer Herleitungen wird die Einhaltung der Bedingungen an die<br />
Zwischen- und Endergebnisse des Algorithmus nachgewiesen.<br />
• Testen (empirische Methode)<br />
Mit bestimmten ausgesuchten Daten, für die das Ergebnis bekannt ist, wird<br />
der Algorithmus erprobt. Dabei kann lediglich das Vorhandensein von<br />
Fehlern entdeckt, nicht jedoch die Fehlerfreiheit nachgewiesen werden.<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-6
Testen<br />
• Arten von Tests<br />
• Modul- bzw. Klassentest (Unit-Test)<br />
• Code-Review (zu zweit den Code Zeile für Zeile besprechen)<br />
• Systemtest (dem Auftraggeber wird die Funktionsweise des Systems<br />
demonstriert)<br />
• Kunst des Testens<br />
• Programme testen ist nicht einfach<br />
• in der Praxis werden oft Spezialisten eingesetzt<br />
• Testen ist nicht billig: Aufwand muss im Verhältnis zur geforderten<br />
Qualität stehen<br />
• Fehlerlokalisierung<br />
• an markanten Stellen des Programms Ausgabeanweisungen einfügen<br />
(so genannte Kontrollausgaben), um den aktuellen Programmzustand<br />
zu erfassen<br />
• Debugger einsetzen<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-7
Testen: Typische Fehler<br />
• Schleifen, die entweder einmal zu oft oder einmal zu wenig<br />
durchlaufen werden<br />
• nicht initialisierte Variablen<br />
• Bereichsüberschreitung von Variablen<br />
• Indexüberschreitung bei Arrays<br />
• Integer-Overflow<br />
• unerwartete Nebenwirkungen von Methoden<br />
• bei Verwendung von Instanzvariablen oder globaler Variablen<br />
• numerische Überraschungen<br />
• Rundungsfehler<br />
• Auslöschung führender Ziffern bei Subtraktion ähnlich grosser Zahlen<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-8
Testen: Regeln<br />
• Wahl von Testdaten<br />
• Ziel: jede Zeile des Codes muss durchlaufen werden<br />
• man wähle sowohl typische als auch untypische Eingabewerte<br />
• besondere Aufmerksamkeit ist auf Sonderfälle (leerer Text, leere Eingabe) und<br />
Grenzwerte (z.B. kleinster und grösster Wert) zu richten<br />
• man sollte auch zufällige Testdaten verwenden, selbst wenn diese nicht sinnvoll<br />
erscheinen mögen, denn mit ihnen lassen sich Testlücken aufgrund scheinbarer<br />
Selbstverständlichkeiten vermeiden<br />
• Testdurchführung<br />
• man notiere vor der Durchführung des Testlaufs, welche Ausgabe das<br />
Programm laut Spezifikation liefern soll<br />
• man prüfe nicht nur, ob das Programm tut, was es soll, sondern auch, ob es<br />
etwas tut, was es nicht soll (z. B.: hat eine Prozedur unerwünschte<br />
Nebenwirkungen?)<br />
• Testvereinfachung<br />
• man entwerfe Algorithmen bzw. Programme testfreundlich<br />
• man befolge die Grundsätze des strukturierten Programmentwurfs und baue ggf.<br />
geeignete Testhilfen (z. B. Messpunkte) ein.<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-9
Debugger<br />
• sehr hilfreiches Werkzeug<br />
• zur schrittweisen Verfolgung des Kontrollflusses (Programmablauf)<br />
• zur Inspektion von Variablenwerten während der Laufzeit<br />
• zur Inspektion des Methoden-Stacks<br />
• wichtigste Befehle<br />
• Programm im Debug-Modus starten<br />
• Breakpoints setzen<br />
• Programmausführung bis zum nächsten Breakpoint<br />
• Einzelschrittausführung<br />
• Methodenaufrufe als Einzelschritt behandeln<br />
• in Methoden eintauchen<br />
• aus einer Methode zum Aufruf zurückkehren<br />
• Variableninspektion<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-10
JUnit<br />
• sehr hilfreiches Werkzeug<br />
• zum systematischen Testen einer Java-Unit<br />
(Klasse oder Methode)<br />
• zur Zusammenfassung von verschiedenen Unit-<br />
Tests<br />
• wichtigste Befehle<br />
• JUnit-Testklasse erzeugen<br />
• JUnit-Testmethoden (automatisch) erzeugen<br />
• Programm als JUnit-Test starten<br />
• Struktur<br />
• Testklasse muss von TestCase abgeleitet sein<br />
• Namen der Testmethoden beginnen mit test<br />
• Aufruf der Methode fail() signalisiert das nicht<br />
erfolgreiche Ende eines Tests<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-11
Vor- und Nachbedingungen<br />
• Vorbedingung (Precondition)<br />
• ein Algorithmus muss in einem klar definierten Zustand starten,<br />
andernfalls sind keine klaren Aussagen über seine Arbeitsweise<br />
möglich<br />
• alle Parameterwerte des Algorithmus müssen innerhalb der<br />
spezifizierten Wertebereiche liegen<br />
• Nachbedingung (Postcondition)<br />
• die Ausgabe (Endwerte) eines Algorithmus muss der Spezifikation<br />
entsprechen<br />
• Beispiel<br />
• Spezifikation:<br />
f<br />
: N N<br />
x<br />
[0,10]:<br />
f ( x)<br />
<br />
• Precondition: Parameter x ist ganzzahlig und liegt im Bereich [0,10]<br />
• Postcondition: f(x) = x!<br />
x!<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-12
Assertions in Java<br />
• Assertions sind Zusicherungen<br />
• dienen zur Überprüfung von Vor- und Nachbedingungen<br />
• Syntax<br />
• assert logischerAusdruck;<br />
• assert logischerAusdruck : "Fehlermeldung";<br />
• Semantik<br />
• ist der logischeAusdruck falsch, dann bricht das Programm ab<br />
• … und gibt die Fehlermeldung aus<br />
• Virtual Machine<br />
• Assertions können ein- und ausgeschaltet werden<br />
auf Nebeneffekte beim Ausführen der logischen Ausdrücke muss gänzlich<br />
verzichtet werden<br />
• standardmässig sind sie ausgeschaltet also heute noch einschalten!<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-13
Assertions: Beispiel<br />
double method(int param1, int param2) {<br />
// Vorbedingungen überprüfen<br />
assert param2 > 100 : "param2 ist zu klein: " + param2;<br />
assert 0 ≤ param1 && param1 < param2 : "param1 ist falsch";<br />
// führe ein paar Berechnungen durch<br />
double tmp = func(param1, param2);<br />
// Überprüfung der Nachbedingung<br />
assert tmp != 0 : "tmp ist null";<br />
}<br />
return tmp;<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-14
Assertions vs. Exception Handling<br />
• Idee hinter Assertions<br />
• eine Verletzung einer Assertion hängt nicht …<br />
• mit ungeschicktem Benutzerverhalten zusammen oder<br />
• mit einer Ausnahmesituation infolge veränderter Betriebsmittel<br />
• eine Verletzung einer Assertion ist ein klarer Hinweis auf einen Fehler<br />
im Programm<br />
• Assertions erlauben das frühzeitige Erkennen von Programmfehlern<br />
• Fehler werden bereits in der Testphase und<br />
• nicht erst beim Benutzer im Einsatz erkannt<br />
• Idee hinter Exception Handling<br />
• ungeschicktes Benutzerverhalten elegant abfangen<br />
• Ausnahmesituation infolge veränderter Betriebsmittel sicher auffangen,<br />
so dass ein Absturz des Programms vermieden werden kann<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-15
<strong>Programmverifikation</strong><br />
• Entscheidend bei der Verifikation sind<br />
• Nachweis der erstrebten Nachbedingungen bei erfüllter<br />
Vorbedingungen<br />
• Nachweis der Terminierung (ordentlicher Programmabbruch)<br />
• Auffinden von Schleifeninvarianten<br />
• Schleifeninvarianten<br />
• eine Aussageform, die nach jedem Schleifendurchlauf wahr ist, wenn<br />
sie es vorher war<br />
• die Idee der Schleifeninvarianten ist häufig gleich der Entwurfsidee, in<br />
die mathematisches Wissen über den betrachteten Gegenstand eingeht<br />
• Korrektheit bezüglich Spezifikation<br />
• Fehler in der Spezifikation werden nicht direkt erkannt<br />
• die Wahrheit der Schleifeninvarianten und das Zutreffen der<br />
Abbruchbedingung erlaubt den Schluss, dass die erstrebte<br />
Nachbedingung erreicht ist, der Algorithmus also tut, was in der<br />
Spezifikation verlangt wird.<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-16
Probleme der Verifikation<br />
• umfangreiche Programme<br />
• modulare bzw. objektorientierte Zerlegung in überblickbare Teile ist<br />
notwendig<br />
• manuelle <strong>Programmverifikation</strong> ist sehr zeitaufwändig<br />
automatische Verifikationswerkzeuge sind hilfreich<br />
• Programmspezifikation und Modellvalidierung<br />
• in der Praxis besteht das eigentliche Problem im Entwickeln eines<br />
geeigneten Modells (Vereinfachung der Realität)<br />
• passt das Modell auf die Wirklichkeit?<br />
• in der Praxis ändert sich die Spezifikation laufend, das Modell wird<br />
abgewandelt<br />
angewiesen auf empirisches Testen<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-17
Aussagenlogik: Syntax und Semantik<br />
• Syntax<br />
• atomare Formeln (Atome): A, B, C, …<br />
• seien F und G zwei beliebige Formeln<br />
• Konjunktion: (F G) ist eine Formel<br />
• Disjunktion: (F G) ist eine Formel<br />
• Negation: F ist eine Formel<br />
• Implikation: (F G) ist eine Kurzschreibweise für (F G)<br />
• Bikonditional: (F G) ist eine Kurzschreibweise für (F G) (G F)<br />
• Semantik<br />
• Belegung B: eine Teilmenge der atomaren Formeln wird mit einem<br />
Wahrheitswert aus {false, true} bzw. {0,1} belegt<br />
• die Bedeutungen der Konjunktion, Disjunktion und Negation sind analog<br />
zur Bool'schen Algebra definiert<br />
• passende Belegung B auf Formel F angewendet: B(F)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12<br />
7-18
Aussagenlogik: Modell und Erfüllbarkeit<br />
• Modell<br />
• eine Belegung heisst zu einer Formel F passend, wenn alle in F<br />
vorkommenden Atome belegt sind<br />
• eine Belegung B ist ein Modell für eine Formel F, wenn sie passend ist<br />
und wenn der Wahrheitswert von B(F) = true ist: B ⊨ F<br />
• Belegung ist B kein Modell für Formel F, wenn sie zwar passend ist,<br />
aber wenn der Wahrheitswert von B(F) = false ist: B ⊭ F<br />
• Erfüllbarkeit<br />
• eine Formel F heisst erfüllbar, wenn für sie ein Modell existiert,<br />
andernfalls unerfüllbar<br />
• Tautologie<br />
• eine Formel F heisst gültig (oder Tautologie), wenn alle passenden<br />
Belegungen Modelle sind: ⊨ F<br />
• Bsp.: (F F)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12<br />
7-19
Aussagenlogik: Äquivalenz<br />
Zwei Formeln F und G heissen (semantisch) äquivalent, falls für<br />
alle passenden Belegungen B gilt: B(F) = B(G). Dafür schreiben wir<br />
⊨ (F G) oder kurz F ≡ G.<br />
• Äquivalenzregeln (AND)<br />
(F F) ≡ F<br />
(F G) ≡ (G F)<br />
((F G) H) ≡ (F (G H))<br />
(F (F G)) ≡ F<br />
(F (G H)) ≡ ((F G) (F H))<br />
(F G) ≡ (F G)<br />
(F G) ≡ G, falls ⊨F<br />
(F G) ≡ F, falls F unerfüllbar<br />
• Äquivalenzregeln (OR)<br />
(F F) ≡ F<br />
(F G) ≡ (G F)<br />
((F G) H) ≡ (F (G H))<br />
(F (F G)) ≡ F<br />
(F (G H)) ≡ ((F G) (F H))<br />
(F G) ≡ (F G)<br />
(F G) ≡ F, falls ⊨F<br />
(F G) ≡ G, falls F unerfüllbar<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12<br />
7-20
Prädikatenlogik 1. Stufe: Syntax<br />
• Erweiterung der Aussagenlogik um Quantoren, Funktionen,<br />
Prädikate, Relationen und Variablen<br />
• nullstellige Prädikate entsprechen den Atomen der Aussagelogik<br />
• Relationen können als Prädikate aufgefasst werden<br />
• nullstellige Funktionen sind Konstanten<br />
• Formeln<br />
• logische Verknüpfung von Prädikaten<br />
• die Argumente der Prädikate sind Terme, gebildet aus Funktionen, Variablen<br />
und Konstanten<br />
• sei x eine Variable und F eine Formel<br />
• x F ist eine Formel mit gebundenem x<br />
• x F ist eine Formel mit gebundenem x<br />
• eine Formel heisst geschlossen oder Aussage, wenn alle ihre Variablen<br />
durch Quantoren gebunden sind<br />
• Prädikatenlogik mit Identität<br />
• wenn F und G zwei Formeln sind, so ist auch F = G eine Formel<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12<br />
7-21
Prädikatenlogik 1. Stufe: Semantik<br />
• Struktur S = (U S , I S ),<br />
• U S ist eine nicht-leere Grundmenge und I S eine Abbildung<br />
• der Prädikate über U S<br />
• der Funktionen auf U S<br />
• der Variablen auf Elemente von U S<br />
• Semantik bezüglich passender Struktur S<br />
• S(Term)<br />
jeder Term wird gemäss I S auf ein Element aus U S abgebildet<br />
• S(Prädikat) jedes Prädikat bestimmt einen Wahrheitswert in Abhängigkeit<br />
seiner Argumente (Terme)<br />
• S(Formel) die aussagenlogische Verknüpfung der Wahrheitswerte der<br />
• S(x F)<br />
Prädikate<br />
F ist eine Formel<br />
• ist true, falls für alle d U S gilt: S [x/d] (F) = true<br />
• ist false, sonst<br />
• S(x F) F ist eine Formel<br />
• ist true, falls für ein d U S gilt: S [x/d] (F) = true<br />
• ist false, sonst<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12<br />
7-22
Prädikatenlogik: Äquivalenz<br />
• Definition<br />
• Zwei prädikatenlogische Formeln F und G sind äquivalent, falls für alle<br />
passenden Strukturen S gilt: S(F) = S(G). Dafür schreiben wir F ≡ G.<br />
• Äquivalenzregeln (zusätzlich zur Aussagenlogik)<br />
x F ≡ x F x F ≡ x F<br />
x y F ≡ y x F x y F ≡ y x F<br />
(x F x G) ≡ x (F G) (x F x G) ≡ x (F G)<br />
falls x in G nicht frei vorkommt, gilt<br />
(xF G) ≡ x (F G)<br />
(xF G) ≡ x (F G)<br />
(xF G) ≡ x (F G)<br />
(xF G) ≡ x (F G)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12<br />
7-23
Formale Programm-Verifikation<br />
• Tony Hoare<br />
• Erfinder des Quicksort-Algorithmus<br />
• Promoter der Idee der Programm-Verifikation mittels Vor- und<br />
Nachbedingungen<br />
• Programm: Sequenz von Anweisungen<br />
• Anweisungen<br />
• Zuweisung<br />
• Selektion<br />
• Rekursion bzw. Iteration<br />
• Hoare-Triple: { R } P { S }<br />
• ein Hoare-Triple ist gültig, wenn bei erfüllter Vorbedingung R und nach<br />
Ausführung von P die Nachbedingung S erfüllt ist<br />
• das Programm P ist korrekt, wenn das Hoare-Triple gültig ist<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-24
Nachbedingung<br />
• Variablen<br />
• Input: a, b, c, …, z<br />
• Output: a', b', c', …, z'<br />
• Nachbedingung (Postcondition)<br />
• je präziser (spezieller), desto besser<br />
• Implikation {S T} a, b, …, z, a', b', …, z': S T<br />
• a, b, … z' sind alle Variablen, die in den Nachbedingungen S und T<br />
vorkommen<br />
• wenn ein Programm P die speziellere Nachbedingung S erfüllt, so auch die<br />
allgemeinere T<br />
• es gibt ein Programm Q, welches die Nachbedingung T erfüllt und<br />
mindestens so einfach ist wie das Programm P, welches die Nachbedingung<br />
S erfüllt<br />
• Beispiele<br />
S = (x' = 10), T = (x' > 0)<br />
P 1 = (x' := 6), P 2 = (x' := 10), P 3 = (x' := x + 1)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-25
Weakest Precondition<br />
• Vorbedingung (Precondition)<br />
• damit das Programm P die Nachbedingung (Postcondition) S erfüllen kann,<br />
muss die Vorbedingung R erfüllt sein<br />
• je schwächer die Vorbedingung R, desto besser (weniger einschränkender)<br />
weakest precondition (WP)<br />
• Beispiel<br />
Nachbedingung S = (x' = 10)<br />
Programm P = (x' := x + 2)<br />
mögliche Vorbedingung R = (a = 0 b = 2 x = 8 z = 0)<br />
einfachste Vorbedingung (weakest Precondition) WP = (x = 8)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-26
Ablauf der Verifikation<br />
• Gegeben<br />
• Vorbedingung R, Nachbedingung S, Programm P<br />
• Ablauf<br />
• aus S und P die schwächste Vorbedingung WP = wp(P, S) berechnen<br />
• falls { R WP } gilt, dann erfüllt das Programm P die Nachbedingung S<br />
bei eingehaltener Vorbedingung R<br />
• R kann somit durch WP ersetzt werden<br />
• Berechnung der WP<br />
• ausgehend von der Nachbedingung S<br />
• Anweisung für Anweisung rückwärts rechnen<br />
• Berechnungsregeln für Zuweisung, Sequenz, Selektion, Iteration<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-27
WP-Berechnungsregeln: Zuweisung<br />
• Gegeben<br />
• Zuweisung P = (x' := y)<br />
• Nachbedingung S<br />
• Regel<br />
• WP = wp(P, S) = wp((x' := y), S) = S| alle x' durch y ersetzt<br />
• Beispiele<br />
• S = (a' = z), P = (a' := b + c), WP = (b + c = z)<br />
• S = (n' = n), P = (n' := n – 1), WP = (n = n – 1) = false<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-28
WP-Berechnungsregeln: Sequenz<br />
• Gegeben<br />
• Sequenz P = (Anweisung 1 ; Anweisung 2 ; …; Anweisung n )<br />
• Nachbedingung S<br />
• Regel<br />
• WP = wp(P, S) =<br />
wp((Anweisung 1 ; Anweisung 2 ; …; Anweisung n-1 ), wp(Anweisung n , S))<br />
• Beispiel<br />
P = (t' := x; x' := y; y' := t')<br />
S = (x' = b y' = a)<br />
WP = wp((t' := x; x' := y; y' := t'), (x' = b y' = a))<br />
= wp((t' := x; x' := y), wp((y' := t'), (x' = b y' = a)))<br />
= wp((t' := x; x' := y), (x' = b t' = a))<br />
= wp((t' := x), wp((x' := y), (x' = b t' = a)))<br />
= wp((t' := x), (y = b t' = a))<br />
= (y = b x = a)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-29
WP-Berechnungsregeln: Selektion<br />
• Gegeben<br />
• logischer Ausdruck b<br />
• Selektion P = (if b then P 1 else P 2 )<br />
• Nachbedingung S<br />
• Regel<br />
• WP = wp(P, S)<br />
= wp((if b then P 1 else P 2 ), S) = (b wp(P 1 , S)) (b wp(P 2 , S))<br />
= (b wp(P 1 , S)) (b wp(P 2 , S))<br />
= bb bwp(P 2 , S) bwp(P 1 , S) wp(P 1 , S)wp(P 2 , S)<br />
= false bwp(P 2 , S) bwp(P 1 , S) false<br />
= bwp(P 1 , S) bwp(P 2 , S)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-30
Beispiel: Selektion<br />
• Gegeben<br />
• Programm P = (if x < 0 then x' := -x else x' := x – 1)<br />
• Nachbedingung S = (x' > 0)<br />
• Gesucht<br />
• weakest Precondition WP<br />
WP = wp((if x < 0 x' := -x else x' := x – 1), x' > 0)<br />
= (x ≥ 0 -x > 0) (x < 0 x – 1 > 0)<br />
= (x ≥ 0 x < 0) (x < 0 x > 1)<br />
= true (x [0, 1])<br />
= x [0, 1]<br />
oder<br />
WP = (x < 0 -x > 0) (x ≥ 0 x – 1 > 0)<br />
= (x < 0) (x ≥ 0 x > 1)<br />
= (x < 0) (x > 1)<br />
= x [0, 1]<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-31
WP-Berechnungsregeln: Iteration<br />
• Iterationen<br />
• for-Schleife: Anzahl Durchläufe bekannt als Sequenz betrachten<br />
• while-Schleife: Spezialfall der Rekursion Invariante bestimmen<br />
• Gegeben<br />
• logischer Ausdruck B (so genannte Schleifenbedingung)<br />
• Programm P = (while B do P 1 )<br />
• Nachbedingung S = B INV<br />
• Invariante (INV)<br />
• eine logische Bedingung ausgedrückt in den Variablen aus P, welche<br />
vor P und nach jedem Durchlauf von P 1 gültig ist<br />
• wenn { INV B } P 1 { INV } gültig ist, so ist auch<br />
{ INV } while B do P 1 { INV B } gültig<br />
• Regel<br />
• WP = wp(P, S) = INV<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-32
Invariante: Beispiel (1)<br />
• long multiply(int x, int y) {<br />
long a = x, b = y, r = 0;<br />
while (a != 0) {<br />
if ((a & 1) == 1) r += b;<br />
b = b > 1;<br />
}<br />
return r;<br />
}<br />
• Nachbedingung<br />
S = (r = x*y)<br />
• Invariante<br />
INV = (a ≥ 0 a*b + r = x*y)<br />
schwächste Vorbedingung WP<br />
INV muss gelten<br />
INV (a ≠ 0) muss gelten<br />
INV muss gelten<br />
INV (a = 0) muss gelten<br />
Nachbedingung S muss gelten<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-33
Fortsetzung des Beispiels (2)<br />
• Gegeben: Invariante INV = (a ≥ 0 a*b + r = x*y)<br />
• Gesucht: Ist INV wirklich eine korrekte Invariante?<br />
• Beweisverfahren<br />
• wenn an Position die Invariante INV gilt, dann muss an der Position <br />
auch die Invariante gelten<br />
• zu zeigen: { (INV B) wp(P 1 , INV) }<br />
• Beispiel<br />
R1 = wp(a := a >> 1, INV) = (a/2 ≥ 0 a/2*b + r = x*y)<br />
R2 = wp(b := b
Fortsetzung des Beispiels (3)<br />
• Gegeben: Invariante INV = (a ≥ 0 a*b + r = x*y)<br />
• Gesucht: schwächste Vorbedingung WP<br />
• Verfahren<br />
• wenn an Position die Invariante INV gilt, dann gilt sie auch an der<br />
Position <br />
• somit ist INV an der Position die Nachbedingung der Instruktionen vor<br />
der while-Schleife und wir können mit dem üblichen Verfahren WP<br />
berechnen<br />
• Beispiel<br />
R1 = wp(r := 0, INV) = (a ≥ 0 a*b = x*y)<br />
R2 = wp(b := y, R2) = (a ≥ 0 a*y = x*y)<br />
WP = wp(a := x, R3) = (x ≥ 0 x*y = x*y) = (x ≥ 0)<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-35
Fortsetzung des Beispiels (4)<br />
• Gegeben<br />
• Invariante INV = (a ≥ 0 a*b + r = x*y)<br />
• Schleifenbedingung B = (a 0)<br />
• Gesucht: Nachbedingung S<br />
• Verfahren<br />
• wenn an Position die Invariante INV gilt, dann gilt an der Position die<br />
Invariante, nicht aber B, also S = (INV B)<br />
• Beispiel<br />
S = (INV B) = (a ≥ 0 a*b + r = x*y a = 0)<br />
S = (r = x*y a = 0)<br />
Der Rückgabewert r ist also gleich dem Produkt aus x und y.<br />
Prof. Dr. C. Stamm – Algorithmen und Datenstrukturen 1, FS 12 7-36