Verifikation von Programmen

Ähnliche Dokumente
Teil X. Programmverifikation. Spezifikation eines Algorithmus einer Funktion einer Prozedur. Vorbedingungen Parameter Wertebereiche

5. Spezifikation und Verifikation von Programmen. Hier: Spezifikation einfacher Programme

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Dr. Monika Meiler. Inhalt

1. Teilklausur. Modul "OOPM Vorlesung/Übung" Gruppe A

Dr. Monika Meiler. Inhalt

VBA-Programmierung: Zusammenfassung

Master Technische Informatik. Seminar Informatik- SS Formale Programmverifikation: theoretische Grundlagen und Beispiele

4 Greedy-Algorithmen (gierige Algorithmen)

Oft kommt es darauf an, Potenzen a n mod m zu berechnen. Dabei kann n eine sehr groÿe Zahl sein.

2. Vorlesung. Slide 40

Assertions (Zusicherungen)

Programmiertechnik II

Teil 2 - Softwaretechnik. Modul: Programmierung B-PRG Grundlagen der Programmierung 1 Teil 2. Übersicht. Softwaretechnik

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

Grundlagen der Programmierung (Vorlesung 14)

Grundlagen der Künstlichen Intelligenz

Theoretische Informatik

Abschnitt: Algorithmendesign und Laufzeitanalyse

Java Einführung Operatoren Kapitel 2 und 3

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Verträge für die funktionale Programmierung Design und Implementierung

Einfache Rechenstrukturen und Kontrollfluss II

Primitive Datentypen

Einfaches Programmtesten

Wirtschaftsinformatik I

Algorithmen und algorithmische Sprachkonzepte

SEP 114. Design by Contract

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Probeklausur: Programmierung WS04/05

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Übersicht Programmablaufsteuerung

Logik für Informatiker

Laufzeit und Komplexität

Studientag zum Kurs 1793

Visual Basic / EXCEL / Makroprogrammierung Unterrichtsreihe von Herrn Selbach

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

Propädeutikum zur Programmierung

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

5. Tutorium zu Programmieren

Informationsblatt Induktionsbeweis

Das Briefträgerproblem

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

1 Syntax von Programmiersprachen

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Kapitel 7: Formaler Datenbankentwurf

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Einführung in die Informatik Control Structures and Enumerations

1 Aussagenlogische Formeln

Teil IV. Grundlagen der Programmierung

Zum Einsatz von Operatoren im Informatikunterricht

C-Vorrangregeln. Version Web:

Einführung in die Java- Programmierung

Suchen und Sortieren Sortieren. Heaps

SOMA Reverse Engineering

Schritt 1. Schritt 1. Schritt 3. - Analysieren des Problems und Spezifizierung einer Lösung.

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

Algorithmen & Programmierung. Aspekte von Algorithmen

Programmiervorkurs WS 2012/2013. Schleifen und Methoden

Programmierung in Python

Übungen zu C++ Kapitel 1

5.1 Drei wichtige Beweistechniken Erklärungen zu den Beweistechniken... 56

Kapitel 11: Wiederholung und Zusammenfassung

SWP Prüfungsvorbereitung

Theoretische Grundlagen des Software Engineering

Datenstruktur zum Speichern einer endlichen Menge M von Zahlen. Genauer:

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Fehler die bei der Programmerstellung passieren können teilweise vom Compiler erkannt werden

Endlicher Automat (EA)

Steueranweisungen. Eike Schallehn Grundlagen der Informatik für Ingenieure Wintersemester 08/

Theorie der Informatik

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Prolog basiert auf Prädikatenlogik

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen

Some Software Engineering Principles

Kapitel 2: Formale Sprachen Kontextfreie Sprachen. reguläre Grammatiken/Sprachen. kontextfreie Grammatiken/Sprachen

2.4.3 Polymorphie (Wiederholung von Alp2)

Übungsaufgaben zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 8

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

FB Informatik. Fehler. Testplan

Sortierte Folgen 250

Grammatiken. Einführung

Binäre Suchbäume (binary search trees, kurz: bst)

P r o g r a m m a b l a u f s t e u e r u n g

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

22. Algorithmus der Woche Partnerschaftsvermittlung Drum prüfe, wer sich ewig bindet

Spec# Einführung. Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba

Modul 122 VBA Scribt.docx

Klausur zur Einführung in die objektorientierte Programmierung mit Java

The B Method. B ist eine Methode zur Spezifikation zum Entwurf zur Implementierung von Software Systemen. Bücher zur B-Methode

Einführung in die Informatik Grammars & Parsers

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Transkript:

http://scam-trap.com/i/stophacking1.gif Verifikation von Programmen OOPM, Ralf Lämmel

380 Was tun? (Mit den Spezifikationen) Dokumentation Überprüfen der Bedingungen zur Laufzeit Verifizieren der Bedingungen vor Laufzeit Ableitung einer korrekten Implementation aus Spezifikation Verwendung der Spezifikation zur Testdatengenerierung

381 Entwicklung korrekter Programme 1. Ansatz OOPM Aufstellung einer Spezifikation (Problembeschreibung). Erstellung einer Implementation (Problemlösung). Beweis über Einhaltung der Spezifikation durch Programm. 2. Ansatz Aufstellung einer Spezifikation. Schrittweise Ableitung einer (effizienten) Implementation. Korrektheit folgt aus Konstruktion. OOPM

382 Programme mit Spezifikation = Tripel { P } S { Q } S ist eine Anweisung. P und Q sind Zusicherungen (Bedingungen) P heißt Vorbedingung. Q heißt Nachbedingung.

383 Formale Bedeutung von Tripeln { P } S { Q } Zwei Optionen: Totale Korrektheit: Jede Ausführung von S ausgehend von einem Zustand, in dem P gilt, wird normal zum Halt kommen in einem Zustand, in dem Q gilt. Partielle Korrektheit: Jede Ausführung von S ausgehend von einem Zustand, in dem P gilt, wird entweder nicht normal zum Halt kommen (z.b. nicht terminieren) oder normal zum Halt kommen in einem Zustand, in dem Q gilt.

384 Spezifikation für die Division mit Rest { x >= 0 && y > 0 } q = 0; r = x; while (r >= y) { r = r - y; q = q + 1; } { x == y * q + r && r < y && r >= 0 && q >= 0 } Wie können wir einen Beweis angehen?

Ein Tripel wird zerlegt in viele Teilbeweise mit kleineren Tripeln. { x >= 0 && y > 0 } q = 0; {? } r = x; {? } while (r >= y) { {? } r = r - y; {? } q = q + 1; Betrachtung der Optionen für S in { P } S { Q } Zuweisung Anweisungssequenz While-Schleife {? } } { x == y * q + r && r < y && r >= 0 && q >= 0 } (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 385

Zusammenfassung der Beweisschritte für Division mit Rest { x >= 0 && y > 0 } q = 0; {? } r = x; 7.Zuweisung 6.Zuweisung {? } while (r >= y) { 5.Zuweisung {? } r = r - y; {? } 4.Zuweisung q = q + 1; {? } 3.Sequenz } { x == y * q + r && r < y && r >= 0 && q >= 0 } QED 1.Sequenz 2.While Der Beweis beginnt von hinten. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 386

387 Beweisschritte für Sprachkonstruktionen Zuweisung Anweisungssequenz While-Schleife

388 1. OPTION Annahme Nur Q ist gegeben. Vorgehensweise Ermittle P aus Q. Beispiel Beweis einer Zuweisung { P } v = t; { Q } Ersetze v in Q durch t. Instanzierung v t P Q x y y==0 x==0 { y==0 } x = y; { x==0 } Wir lesen also die Vorbedingung P aus dem Programm ab.

389 2. OPTION Annahme Beweis einer Zuweisung { P } v = t; { Q } P und Q sind gegeben. Vorgehensweise Ermittle P aus Q. Ersetze v in Q durch t. Instanzierung v t P x y y==0 P y>=0 Q x>=0 Überprüfe dass P P Beispiel { y==0 } x = y; { x>=0 } P is notwendig für Q. P ist stärker als P. P ist hinreichend für Q.

390 3. OPTION Beweis einer Zuweisung { P } v = t; { Q } Annahme Nur P ist gegeben. Vorgehensweise Keine allgemeine, systematische Vorgehensweise

391 Beweis einer Anweisungssequenz { P } A1; A2 { Q } Annahme Nur Q ist gegeben. Vorgehensweise Zerlege das Problem. { P } A1 { R } { R } A2 { Q } Instanzierung A1 A2 x++; x++; P x>0 R x>1 Q x>2 Führe die Teilbeweise. Beispiel { x>0 } x++; x++; { x>2 } Zwischenrechnung nächste Seite

392 Zwischenrechnung Zu zeigen: { x > 1 } x++; { x > 2 } Beweis: Zuckerexpansion für x++ {? } x=x+1; { x > 2 } Ablesen der Vorbedingung { x+1 > 2 } x=x+1; { x > 2 } Vereinfachung von x+1 > 2 { x > 1 } x++; { x > 2 } wzbw.

393 Beweis einer While-Schleife { P } while (B) S { Q }?

394 // Vor der Schleife Die wesentliche Idee ist, dass eine Schleife eine Invariante I bewahrt. Sie gilt überall. while (B) I gilt hier. // Am Anfang des Schleifenkörpers I gilt hier. B gilt auch. S // Am Ende des Schleifenkörpers I gilt hier. // Nach der Schleife I gilt hier. B gilt nicht.

395 Beweis einer Schleife { P } while (B) S { Q } Annahme Nur Q ist gegeben. Vorgehensweise Identifiziere die Invariante I. Zerlege das Problem. { I && B } S { I } I &&!B Q Führe die Teilbeweise. Beispiel { x>=y } while (x>y) x--; { x==y } Instanzierung B x>y S x-- P x>=y Q x==y I x>=y

396 Anwendung auf Division mit Rest Schleifeninvariante r >= y { I } Schleifenbedingung r := x; Type to enter text { I && B } r = r - y { I &&!B } q = q + 1 { I } Wie ist I hier beschaffen?

397 Ermittlung der Invariante & Co I x == q * y + r && r >= 0 && q >= 0 Heureka! I &&!B x == q * y + r && r < y && r >= 0 && q >= 0 Letzteres ist die Nachbedingung des Programms.

{ P } S1 { Q }, { Q } S2 { R } { P[x/t] } x = t { P } { P } S1; S2 { R } Mechanisierung der Beweisschritte auf der Basis formaler Regeln { I && B } S { I } { I } while (B) S { I &&!B } P Q, { Q } S { R } { P } S { R } (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 398

399 Hoare-Regel für die While-Schleife Voraussetzung { I && B } S { I } { I } while (B) S { I &&!B } Schlussfolgerung B ist die Schleifenbedingung. S ist der Schleifenkörper. I ist die Schleifeninvariante. I muss (fast) überall gelten: - vor und nach der Schleife. - vor und nach jedem Schleifendurchlauf.

400 Einsetzen in die Schleife { I && B } S { I } { I } while B S { I &&!B } r >= y { I } Schleifeninvariante Schleifenbedingung r := x; Type to enter text { I && B } r = r - y { I &&!B } q = q + 1 { I }

401 Vorkommende Bedingungen { I && B } S { I } { I } while B S { I &&!B } B r >= y (Ablesen aus dem Programm) I x == q * y + r && r >= 0 && q >= 0 Heureka!!B r < y (Symbolische Negation von B) I &&!B x == q * y + r && r < y && r >= 0 && q >= 0 Letzteres ist die Nachbedingung des Programms.

402 Einsetzen in die Schleife { I && B } S { I } { I } while B S { I &&!B } r >= y { I x == q * y + r && r >= 0 && q >= 0 } Type to enter text { I && B... && r >= y } r = r - y Zu zeigen! q = q + 1 { I x == q * y + r && r >= 0 && q >= 0 } { I &&!B... && r < y }

403 Zu zeigen: Korrektheit des Schleifenkörpers Type to enter text { I && B... && r >= y } r = r - y q = q + 1 { I x == q * y + r && r >= 0 && q >= 0 } Plan: Wir führen unsere Beweise weiterhin von hinten.

404 Betrachtung von Anweisungsfolgen { I && B... && r >= y } r = r - y??? q = q + 1 { I x == q * y + r && r >= 0 && q >= 0 }

405 Hoare-Regel für die Anweisungsverkettung { P } S1 { Q }, { Q } S2 { R } { P } S1; S2 { R } Zwei Anweisungen S 1 und S 2, welche nacheinander ausgeführt werden, können zu einem Programmstück S 1 S 2 zusammengesetzt werden, wenn die Nachbedingung von S 1 mit der Vorbedingung von S 2 identisch ist.

406 TODO: Ablesen der Zwischen- und Vorbedingungen von hinten anfangend Type to enter text {??? } r = r - y {??? } q = q + 1 { I x == q * y + r && r >= 0 && q >= 0 }

407 Hoare-Regel (Axiom) für Zuweisung { P[x/t] } x = t { P } Das ist ein Axiom -- eine Regel ohne Prämissen. Substitution von x durch t. Wir setzen hier voraus, dass t keine Seiteneffekte hat.

408 Hintere Zuweisung in der Schleife { x == (q + 1) * y + r && r >= 0 && q + 1 >= 0 } q = q + 1 { x == q * y + r && r >= 0 && q >= 0 } Ermittlung der Vorbedingung aus der Nachbedingung. Substituiere q durch q + 1.

409 TODO: Ablesen der Vorbedingung Type to enter text {??? } r = r - y { x == (q + 1) * y + r && r >= 0 && q + 1 >= 0 } q = q + 1 { x == q * y + r && r >= 0 && q >= 0 } Nun müssen wir weiter nach vorn gehen.

410 Vordere Zuweisung in der Schleife { x == (q + 1) * y + (r - y) && r - y >= 0 && q + 1 >= 0 } r = r - y { x == (q + 1) * y + r && r >= 0 && q + 1 >= 0 } Ermittlung der Vorbedingung aus der Nachbedingung. Substituiere r durch r - y.

411 Betrachtung von Anweisungsfolgen { x == (q + 1) * y + (r - y) && r - y >= 0 && q + 1 >= 0 } r = r - y { x == (q + 1) * y + r && r >= 0 && q + 1 >= 0 } q = q + 1 { x == q * y + r && r >= 0 && q >= 0 } Die innere Bedingung war nur Mittel zum Zweck.

412 Betrachtung von Anweisungsfolgen { x == (q + 1) * y + (r - y) && r - y >= 0 && q + 1 >= 0 } r = r - y q = q + 1 { x == q * y + r && r >= 0 && q >= 0 } Die innere Bedingung war nur Mittel zum Zweck.

413 Anpassung von Bedingungen Haben : Mechanisch abgeleitete Vorbedingung { x == (q + 1) * y + (r - y) && r - y >= 0 && q + 1 >= 0 } r = r - y q = q + 1 { x == q * y + r && r >= 0 && q >= 0 }

414 Anpassung von Bedingungen Soll : Ursprüngliche Spezifikation des Schleifenkörpers { I && B x == q * y + r && r >= 0 && q >= 0 && r >= y } r = r - y q = q + 1 { x == q * y + r && r >= 0 && q >= 0 } { I && B } S { I } { I } while B S { I &&!B }

415 Anpassung von Bedingungen Soll x == q * y + r && r >= y && r >= 0 && q >= 0 Haben x == (q + 1) * y + (r - y) && r - y >= 0 && q + 1 >= 0 Plan: Wir ordnen die einzelnen Operanden der Konjunktionen aus den beiden Formeln einander zu.

Anpassung von Bedingungen Soll x == q * y + r && r >= y && r >= 0 && q >= 0 Haben x == (q + 1) * y + (r - y) && r - y >= 0 && q + 1 >= 0 Nebenrechnung x == (q + 1) * y + (r - y) x == q * y + y + r - y (Ausmultiplizieren) (... +y und... -y) x == q * y + r (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 416

417 Anpassung von Bedingungen Soll... && r >= y && r >= 0 && q >= 0 Haben... && r - y >= 0 && q + 1 >= 0 Nebenrechnung r - y >= 0 (Addiere y) r >= y

418 Anpassung von Bedingungen Soll... &&... && r >= 0 && q >= 0 Haben... &&... && q + 1 >= 0 Soll Haben q >= 0 q + 1 >= 0 Die Ableitung der Vorbedingung aus der Nachbedingung ergibt die schwächste, solche Bedingung. Wir können auch mehr fordern.

419 Anpassung von Bedingungen Soll... &&... && r >= 0 &&... Haben... &&... &&... Soll Haben r >= 0 true Die Ableitung der Vorbedingung aus der Nachbedingung ergibt die schwächste, solche Bedingung. Wir können auch mehr fordern.

420 Schwäche/Stärke von Bedingungen Zielstellung: Vorbedingungen so schwach wie möglich. Nachbedingungen so stark wie möglich. Definitionen x ist schwächer als y wenn y x. x ist echt schwächer als y wenn nicht auch x y.

421 Hoare-Regel für die Verstärkung der Vorbedingung P Q, { Q } S { R } { P } S { R }

422 Die Schleife ist bewiesen. { I && B } S { I } { I } while B S { I &&!B } r >= y { I x == q * y + r && r >= 0 && q >= 0 } Type to enter text { I && B... && r >= y } r = r - y q = q + 1 { I } { I &&!B... && r < y }

Fortsetzung des Gesamtbeweises (ohne neue Ideen) q = 0 { x >= 0 && y > 0 } r = x r >= y { x == q * y + r && r >= 0 && q >= 0 } Verbleibender Programmteil r = r - y r := x; q = q + 1 { x == q * y + r && r < y && r >= 0 && q >= 0 } (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 423

424 Hintere Zuweisung { x == q * y + x && x >= 0 && q >= 0 } r = x { x == q * y + r && r >= 0 && q >= 0 }

425 Vordere Zuweisung { x == 0 * y + x && x >= 0 && 0 >= 0 } q = 0 { x == q * y + x && x >= 0 && q >= 0 }

426 Vordere Zuweisung (nach Vereinfachung) { x >= 0 } q = 0 { x == q * y + x && x >= 0 && q >= 0 }

427 Betrachtung von Anweisungsfolgen { x >= 0 } q = 0 { x == q * y + x && x >= 0 && q >= 0 } r = x { x == q * y + r && r >= 0 && q >= 0 } Die innere Bedingung war nur Mittel zum Zweck.

Betrachtung von Anweisungsfolgen { x >= 0 } q = 0 r = x { x == q * y + r && r >= 0 && q >= 0 } Die innere Bedingung war nur Mittel zum Zweck. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 428

429 Anpassung von Bedingungen Soll x >= 0 && y > 0 Haben x >= 0 Soll Haben Die Ableitung der Vorbedingung aus der Nachbedingung ergibt die schwächste, solche Bedingung. Wir können auch mehr fordern -- etwa mit dem Ziel der Terminierung im Auge.

Das Programm mit Spezifikation ist korrekt. { x >= 0 && y > 0 } q = 0 r = x r >= y r = r - y r := x; q = q + 1 { x == q * y + r && r < y && r >= 0 && q >= 0 } Q.E.D. (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 430

431 Zusammenfassung der Methode zum Beweis der Korrektheit mit Hoare-Regeln Programme mit Spezifikationen: { Vorbedingung } Programm { Nachbedingung } Vor- und Nachbedingungen sind logische Formeln: Hoare- Tripel Formeln beschreiben Annahmen über Variablenbelegungen. Es gibt Korrektheitsregeln für jede Anweisungsform. Vorgehenweise beim Korrektheitsbeweis Ergänze alle Programmstücke mit Vor- und Nachbedingungen. Überprüfe alle Tripel auf Korrektheit gemäß Regeln.

432 Beweisregeln A1,..., An A0 Jedes Ai ist... entweder ein Hoare-Tripel oder eine prädikatenlogische Formel. Benutzung Boolescher Ausdrücke der Programmiersprache.

433 Arten von Regeln Programmiersprachenabhängige Regeln Zuweisung If-Anweisung... Programmiersprachenunabhängige Regeln Anpassung von Vor- und Nachbedingungen Prädikatenlogische Regeln

Hoare-Regel für If-Then-Else { P && B } S1 { R }, { P &&!B } S2 { R } { P } if (B) S1 else S2 { R } P && B S 1 P B Ja Nein P &&!B S 2 R R R (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 434

Hoare-Regel für If-Then { P && B } S { R }, P &&!B R { P } if (B) S { R } P && B S P B Ja Nein P &&!B Leere Anweisung R R R (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 435

436 Hoare-Regel für die Verstärkung der Vorbedingung P Q, { Q } S { R } { P } S { R }

437 Hoare-Regel für die Abschwächung der Nachbedingung { P } S { Q }, Q R Diese Regel wird im Beispielbeweis nicht verwendet. { P } S { R }

Im Beispiel verwendete Regeln { P } S1 { Q }, { Q } S2 { R } { P[x/t] } x = t { P } { P } S1; S2 { R } { I && B } S { I } { I } while (B) S { I &&!B } P Q, { Q } S { R } { P } S { R } (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 438

439 2 Fangfragen { x >= 0 && y > 0 } Können wir die Vorbedingung abschwächen so dass auch Division mit Rest für negative Zahlen korrekt modelliert ist oder müssen wir zusätzlich das Programm ändern? q = 0; r = x; while (r y) { r = r - y; q = q + 1; } Schließen wir aus, dass x und y nicht geändert wurden? Taugt die Beweismethode dazu? { x == y q + r && r < y && r >= 0 && q >= 0 }

440 Situationen beim Beweisen Tote Schleife Endlosschleife Inkorrekte Schleife Erfolgreicher Beweis...

441 Tote Schleife { I &&!B } B r := x; Type { I to && enter B } text { I &&!B } S { I } Die Schleifenbedingung ist definitiv vor der Schleife unerfüllt.

442 Endlosschleife { I } B r := x; Type to enter text { I && B } S { I && B } { I &&!B } Der Schleifenkörper stellt immer wieder die Gültigkeit der Schleifenbedingung her.

443 Inkorrekte Schleife { I } B Type to enter text { I &&!B } S { I } { I &&!B } Der Schleifenkörper verlangt, dass die negierte Schleifenbedingung zum Eintritt in die Schleife gelten muss.

444 Erfolgreicher Beweis { I } B r := x; Type to enter text { I && B } S { I } { I &&!B } Die Vorbedingung (eventuell durch Abschwächung) lässt sich aus der Nachbedingung ableiten.

Zusammenfassung Einfache Programme sind nicht einfach korrekt. Softwareentwickler benötigen mathematische Fähigkeiten. Softwareentwicklung benötigt Beweisautomatisierung. Kosten von Korrektheit motivieren Wiederverwendung. Ausblick Schnittstellen Zeiger Abstrakte Datentypen

Weitere Verifikationsbeispiele (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 446

{ 447 Verifikationsbeispiel: Schnelle Potenzierung Problem Berechne x n Naive Methode x n = x *... * x n mal Kosten: n - 1 Multiplikationen Wie geht das schneller?

448 Schnelle Potenzierung Zu berechnen: x n Fall 1: n ist gerade, etwa n = 2k Berechne x = x 2. Gib x k zurück. Fall 2: n ist ungerade, etwa n = 2k + 1 Berechne x = x 2. Gib x * x k zurück. Dies ergibt O(log n) Multiplikationen.

449 Imperative, iterative Implementation Schneller Exponentation public static int power(int x, int n) { int k = n; int p = x; int y = 1; while (k>0) if (k % 2 == 0) { p = p * p; k = k / 2; } else { y = y * p; k = k - 1; } return y; }

450 Formierung eines Hoare-Tripels { n >= 0 } int k = n; int p = x; int y = 1; while (k>0) if (k % 2 == 0) { p = p * p; k = k / 2; } else { y = y * p; k = k - 1; } { y == x n }

451 Was ist die Schleifen-Invariante I? Ansatz: Wie stehen die Programmvariablen in Beziehung? x und n sind konstant. Wir setzen n = 10. y p k x n 1 x 10 x 10 1 x 2 5 x 10 x 2 x 2 4 x 10 x 2 x 4 2 x 10 x 2 x 8 1 x 10 x 10 x 8 0 x 10 y * p k x 10 x 10 x 10 x 10 x 10 x 10 Wie man leicht sieht: I y * p k == x n && k >= 0

452 Verifikation der While-Schleife { I y * p k == x n && k >= 0 } while k > 0 Type to enter text { I B... && k > 0 } if (k % 2) == 0 { p := p * p; k := k / 2; } else { y = y * p; k = k - 1; } { I } { I!B... &&!(k > 0) }

453 Verifikation der Fallunterscheidung { I && B y * p k == x n && k >= 0 && k > 0 } { B k % 2 == 0 } Ja Nein { I && B && B } y * p k == x n && k >= 0 && k > 0 && k % 2 == 0 { I && B &&!B } y * p k == x n && k >= 0 && k > 0 &&!(k % 2 == 0) p := p * p; k := k / 2; { I } y = y * p; k = k - 1; { I } { I y * p k == x n && k >= 0 }

Hoare-Regel für If-Then-Else { P && B } S1 { R }, { P &&!B } S2 { R } { P } if B S1 else S2 { R } P && B S 1 P B Ja Nein P &&!B S 2 R R R (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 454

Fall 1: Then -Zweig { I && B && B } y * p k == x n && k >= 0 && k > 0 && k % 2 == 0 Soll? y * (p * p) k / 2 == x n && k / 2 >= 0 p = p * p; Haben y * p k / 2 = x n && k / 2 >= 0 k = k / 2; { I } y * p k == x n && k >= 0 (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 455

456 Fall 1: Then -Zweig Soll y * p k == x n && k >= 0 && k > 0 && k % 2 == 0 y * (p * p) k / 2 == x n && k >= 0 && k > 0 && k % 2 == 0 y * (p * p) k / 2 == x n && k / 2 >= 0 && k > 0 && k % 2 == 0 y * (p * p) k / 2 == x n && k / 2 >= 0 Haben

457 Fall 2: Else -Zweig Übungsaufgabe

458 Verifikationsbeispiel: Berechnung des Quadrats einer Zahl Restriktionen: ohne Verwendung von * mit Verwendung von +. Eine Option für den Lösungsansatz:

459 Veranschaulichung der Generierung der Quadratzahlen Quelle: http://de.wikipedia.org/wiki/quadratzahl

Imperative, iterative Implementation i = 0 k = -1 y = 0 i < n i = i + 1 r := x; k = k + 2 y = y + k 3 (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 460

Formierung eines Hoare-Tripels { P } i = 0 k = -1 y = 0 i < n i = i + 1 r := x; k = k + 2 y = y + k { Q } 3 Welches sind die Vor- und Nachbedingungen? (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 461

462 Aufstellung der Spezifikation { n >= 0 } i = 0 k = -1 y = 0 i < n r := x; i = i + 1 k = k + 2 y = y + k { y = n*n } 3

463 Beweis von hinten { n >= 0 } i = 0 k = -1 y = 0 i < n r := x; i = i + 1 k = k + 2 y = y + k { y = n*n } 3 Wir wenden die Beweisregel für While-Schleifen an.

464 Hoare-Regel für die While-Schleife { I && B } S { I } { I } while B S { I &&!B }

465 Anwendung der Schleifenregel i < n { I } Type to enter text i = i + 1 { I && B } k = k + 2 y = y + k { I } { I &&!B } 6

466 Was ist die Schleifen-Invariante I? Ansatz: Wie stehen die Programmvariablen in Beziehung? n ist konstant. Wir setzen n = 4. i k y n 0-1 0 4 1 1 1 4 2 3 4 4 3 5 9 4 4 7 16 4 k == 2*i - 1 y == i*i 0 <= i <= n I k == 2*i - 1 && y == i*i && i <= n

467 Verifikation der Schleife i < n { I k == 2*i - 1 && y == i*i && i <= n } Type to enter text i = i + 1 k = k + 2 y = y + k { I && B... && i < n } Zu vereinfachen! { I } { I &&!B... &&!(i < n) } i <= n && i < n i < n

468 Verifikation des Schleifenkörpers i < n Type to enter text { k == 2*i 1 && y == i*i && i < n } { k + 2 == 2*(i+1) 1 && y + k + 2 == (i+1)* (i+1) && i+1 <= n } i = i + 1 { k + 2 == 2*i 1 && y + k + 2 == i*i && i <= n } k = k + 2 Soll Haben { k == 2*i 1 && y + k == i*i && i <= n } y = y + k { k == 2*i 1 && y == i*i && i <= n } k + 2 == 2*(i + 1) 1 k + 2 == 2*i + 2 1 k == 2*i 1 y + k + 2 == (i +1)* (i +1) y + k + 2 11 == i*i + 2*i + 1 y + 2*i - 1 + 2 == i*i + 2*i + 1 y + 2*i + 1 == i*i + 2*i + 1 y == i*i i+1 <= n i < n

469 Restliche Zuweisungen zu verifizieren { n >= 0 } i = 0 Type to enter k = -1 y = 0 i < n r := x; i = i + 1 k = k + 2 y = y + k { y = n*n } 3

Restliche Zuweisungen zu verifizieren { n >= 0 } { -1 == 2*0-1 && 0 == 0*0 && 0 <= n } i = 0 { -1 == 2*i - 1 && 0 == i*i && i <= n } k = -1 y = 0 { k == 2*i - 1 && 0 == i*i && i <= n } { k == 2*i - 1 && y == i*i && i <= n } -1 == 2*0-1 && 0 == 0*0 && 0 <= n n >= 0 (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 470

{ 471 Eine Übungsaufgabe Problem (wie zuvor): Berechnen des Quadrats einer Zahl ohne Verwendung von * mit Verwendung von +. Eine andere Option für ein Lösungsansatz: n 2 = n +... + n n mal Aufgabe: Programm Spezifikation Korrektheitsbeweis