03.11.2013 Aufrufe

Programmverifikation

Programmverifikation

Programmverifikation

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!