Informatik I - Programmierung Globalübung Hoare-Kalkül. Thomas Weiler. Fachgruppe Informatik RWTH Aachen. T. Weiler, RWTH Aachen - 1 -

Ähnliche Dokumente
! 1. Erste Schritte! 2. Einfache Datentypen! 3. Anweisungen und Kontrollstrukturen! 4. Verifikation! 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

C. A. R. Hoare. An Axiomatic Basis for Computer Programming. Nicolas Schelp. Proseminar Assertions SS 2007

{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel

Algorithmen und Programmieren II Programmverifikation {V} P {N}

Partielle Korrektheit von Programmen. Beispiele an der Tafel

WS 05/06 mod Verifikation

Beispiel 1 zur Verifikation eines bedingten Anweisung. Hoare-Regel für die bedingte Anweisung. else

Beispiel 1 zur Verifikation eines bedingten Anweisung. Hoare-Regel für die bedingte Anweisung. Beispiel 2 zur Verifikation eines bedingten Anweisung

4.3 Verifikation von Aussagen über Algorithmen

Verifikation von Programmen

Algorithmen und Datenstrukturen Korrektheit von Algorithmen

Grundlagen der Theoretischen Informatik

Tutoraufgabe 1 (Hoare-Kalkül):

Übung Informatik I - Programmierung - Blatt 3

Verifizierende Testverfahren

2.4 Schleifen. Schleifen unterscheiden sich hinsichtlich des Zeitpunktes der Prüfung der Abbruchbedingung:

Theoretische Informatik SS 03 Übung 3

Informatik II - Tutorium

Grundbegriffe der Informatik

9.1 Grundsätzliches Fehlertoleranz vs. Fehlerintoleranz. Testen vs. Verifikation Testen. Verifikation und Test in der SW-Entwicklung

Kurs 1612 Konzepte imperativer Programmierung Musterlösung zur Nachklausur am

3. Grundanweisungen in Java

Formale Programmverifikation. Referentin: Kirsten Hradek

Ein Beispielbeweis zur Verifikation des Programms zur Division mit Rest auf der Basis der Hoare-Regeln

Einführung in die Informatik 1

Sequentielle Programme, Hoare-Logik und Dynamische Logik

Software Entwicklung 2. Formale Verifikation

Programmiersprachen. Marco Block. Folieninhalte teilweise übernommen von Prof. Heinz Schweppe (ALP II, SoSe 2008) und Prof. Löhr (ALP II, SoSe 2004)

SPARK95. Ingmar Wirths. 12. Juli 2007

Einführung in die Informatik Algorithms II

Algorithmus. Was ist ein Algorithmus? Ibn Musa Al-Chwarismi persischer Mathematikers 9. Jahrhundert Buch: Regeln der Wiedereinsetzung und Reduktion.

3. Klausur Einführung in die Theoretische Informatik Seite 1 von Welches der folgenden klassischen Probleme der Informatik ist entscheidbar?

Zusammenfassung. Definition. 1 (x i ) 1 i n Sequenz von Registern x i, die natürliche Zahlen beinhalten. 2 P ein Programm. Befehle: 1 x i := x i + 1

Übung zur Vorlesung Berechenbarkeit und Komplexität

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

Assertions (Zusicherungen)

Korrekte Software: Grundlagen und Methoden Vorlesung 11 vom : Funktionen und Prozeduren

11.0 Systematisches Programmierung

Statisches Programmverständnis. pk12w16,

Chapter A. Korrekte Programme. Korrektes Programm. Lecture Algorithmen & Datenstrukturen

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Semantik von Programmiersprachen SS 2017

1. Übung Algorithmen I

Logik. Ernest Peter Propädeutikum Mathematik Informatik/Wirtschaftsinformatik, Block Aussage

Resolutionsalgorithmus

Warum Programme Verträge schließen sollten

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

Dank. Theoretische Informatik II. Teil II. Registermaschinen. Vorlesung

1 Programmierfehler und ihre Behebung

Algorithmen und Datenstrukturen

7 Axiomatische Semantik

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

2. Algorithmenbegriff

Definition der Hilfsprädikate

Übung zu Grundbegriffe der Informatik. Simon Wacker. 15. November 2013

Algorithmen und Datenstrukturen 1. EINLEITUNG. Algorithmen und Datenstrukturen - Ma5hias Thimm 1

Informatik II, SS 2014

LOOP-Programme: Syntaktische Komponenten

fl diese Variablen haben jeweils den Wahrheitswert "wahr" oder "falsch", es sind damit boolesche Variablen (Datentyp: bool bzw.

Berechenbarkeit und Komplexität Vorlesung 11

7. Musterlösung zu Mathematik für Informatiker I, WS 2003/04

Nachklausur Bitte in Druckschrift leserlich ausfüllen!

Intensivübung zu Algorithmen und Datenstrukturen

Aufgabe 2 Konstruktion von Binärbäumen Tafelübung

Algorithmen und Datenstrukturen

Einführung in die Theoretische Informatik

Erfüllbarkeitstests. Im folgenden: Ein sehr effizienter Erfüllbarkeitstest für eine spezielle Klasse von Formeln in KNF, sogenannte Hornformeln (vgl.

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Algorithmen und Datenstrukturen

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Semantik von Programmiersprachen SS 2017

Abstract State Machines

Programmieren für Fortgeschrittene

Inhaltsverzeichnis. Einführende Bemerkungen 11. Das Fach Informatik 11 Zielsetzung der Vorlesung Grundbegriffe

Grundlagen Theoretischer Informatik 2 WiSe 2011/12 in Trier. Henning Fernau Universität Trier

Computergestützte Modellierung und Verifikation

Kapitel L:V. V. Erweiterungen und Anwendungen zur Logik

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Programmieren in C (Übungsblatt 1)

Elementare Konzepte von

Informatik I. Grundlagen der systematischen Programmierung. Peter Thiemann WS 2007/08. Universität Freiburg, Germany

Welche Informatik-Kenntnisse bringen Sie mit?

Steuerung von Programmabläufen. Lehrstuhl für Angewandte Mathematik Sommersemester Mai und 15. Mai 2008

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

System.out.println("TEXT");

Programmieren in C (Übungsblatt 1)

7.1 Spezifikation mit Vor- und Nachbedingungen

Tag 3 Repetitorium Informatik (Java)

Modellprüfung von UML-Zustandsmaschinen und UML-Kollaborationen in SAL

Bei der Und-Verknüpfung müssen beide Ausdrücke wahr sein, dass der gesamte Ausdruck wahr wird. a=1; b=2; a=1; b=3; else. endif

Friedrich-Alexander-Universität Erlangen-Nürnberg

2. Grundlagen. Beschreibung von Algorithmen durch Pseudocode. Korrektheit von Algorithmen durch Invarianten.

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

Definition: (Kette, noethersche Ordnung)

3.2.6 Sprünge. Hier: Beschränkung auf gute Sprünge wie return break continue. Beachte: Ein Sprung hat keinen Effekt auf die Programmvariablen.

Mathematische Rekursion

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Wintersemester 98/99 Hinweise zur Bearbeitung der Klausur zum Kurs 1612 Konzepte imperativer Programmierung

(Aufgaben zu Wertzuweisungen siehe Vorlesungsbeilage S. 49)

Prof. Dr. Michael Philippsen / Prof. Dr. Herbert Stoyan

Transkript:

Informatik I - Programmierung Globalübung 11.11.2003 Hoare-Kalkül Thomas Weiler Fachgruppe Informatik RWTH Aachen T. Weiler, RWTH Aachen - 1 -

Ariane 5 Die Ariane 5 ist das jüngste Modell der Trägerrakete Ariane der europäischen Weltraumorganisation ESA. Mit 4 CLUSTER-Satelliten beladen, sollte die Ariane 501 am 4. Juni 1996 ihren Jungfernflug starten. Dieser endete ca. 40 Sekunden nach dem Start mit einer Explosion der Trägerrakete 250 Mio. DM Startkosten 850 Mio. DM Cluster-Satelliten 600 Mio. DM für nachfolgende Verbesserungen Verdienstausfall für 2 bis 3 Jahre (Quelle: http://wwwzenger.informatik.tu-muenchen.de/lehre/seminare/semsoft/unterlagen_02/ariane/website/ariane.htm und http://www-aix.gsi.de/~giese/swr/ariane5.html ) T. Weiler, RWTH Aachen - 2 -

Was war passiert? 37 Sekunden nach Zünden der Rakete erreichte Ariane 5 in 3700 m Flughöhe eine Horizontal-Geschwindigkeit von 32768.0 (interne Einheiten). Dieser Wert lag etwa fünfmal höher als bei Ariane 4. Die Umwandlung in eine ganze Zahl führte zu einem Überlauf, der jedoch nicht abgefangen wurde. Nur bei 3 von 7 Variablen wurde ein Überlauf geprüft - für die anderen 4 Variablen existierten Beweise, dass die Werte klein genug bleiben würden (Ariane 4). Diese Beweise galten jedoch nicht für die Ariane 5 und wurden dafür auch gar nicht nachvollzogen. (Quelle: http://wwwzenger.informatik.tu-muenchen.de/lehre/seminare/semsoft/unterlagen_02/ariane/website/ariane.htm und http://www-aix.gsi.de/~giese/swr/ariane5.html ) T. Weiler, RWTH Aachen - 3 -

Software und Fehler Wunsch: Fehlerfreie Software Realität: Software enthält Fehler Garantiert fehlerfreie Software bislang nicht realisierbar Qualitätssicherung Analytische Maßnahmen Ergebnisse kontrollieren Erkannte Fehler korrigieren Beispiele: Review Test Verifikation Konstruktive / Organisatorische Maßnahmen Fehler verhindern Fehler vermeiden Beispiele: Code-Richtlinien Verwendung von Standards T. Weiler, RWTH Aachen - 4 -

Verifikation - 1 Spezifikation: Angabe, was ein Programm tun soll natürliche Sprache grafische Sprachen (UML,...) logische Sprachen (Z, VDM,...) Testen: Überprüfung für endlich viele Eingaben keine 100% Sicherheit Verifikation: Mathematischer Beweis der Korrektheit Terminierung: Hält Programm immer an? Partielle Korrektheit: Falls Programm anhält, erfüllt es Spezifikation? Totale Korrektheit: Terminierung & Partielle Korrektheit Semantik der Programmiersprache T. Weiler, RWTH Aachen - 5 -

Verifikation - 2 Programm P i = n; res = 1; Spezifikation: Programm berechnet (in res) Fakultät von n Terminierung: Programm hält an, weil i in jedem Schleifendurchlauf kleiner wird while (i > 1) { res = res * i; i = i - 1; Partielle Korrektheit: Nach Ausführung ist res = n! Totale Korrektheit Wie beweist man so etwas? Verifikation nötig bei sicherheitskritischen Anwendungen hilft für Programmentwurf und Programmierstil T. Weiler, RWTH Aachen - 6 -

Partielle Korrektheit: Hoare-Kalk Kalkül Spezifikation (zur partiellen Korrektheit) <ϕ> P <ψ> Wenn vor Ausführung von P Vorbedingung ϕ gilt und Ausführung von P terminiert, dann gilt hinterher Nachbedingung ψ. Bsp: <n >= 0> P <res = n!> Partielle Korrektheit ist semantische Aussage Hoare-Kalkül: 7 syntaktische Regeln zur Herleitung von Korrektheitsaussagen T. Weiler, RWTH Aachen - 7 -

Zuweisungsregel <ϕ [x/t]> x = t; < ϕ > x ist Variable, t ist Ausdruck (ohne Seiteneffekte), ϕ [x/t] ist ϕ mit allen x ersetzt durch t Bsp: <5 = 5> x = 5; <x = 5> <5 = 5> x = 5; <x = 5> T. Weiler, RWTH Aachen - 8 -

<ϕ> P <ψ> Sequenzregel <ϕ> P Q <β> < ψ > Q <β> Bsp: <true> x = 5; res = x * x + 6; <res = 31> <true> <5 = 5> x = 5; <x = 5> <x * x + 6 = 31> res = x * x + 6; <res = 31> T. Weiler, RWTH Aachen - 9 -

Konsequenzregel 1 (St( Stärkere Vorbedingung) <ϕ> P <ψ> α ϕ <α> P <ψ> Bsp: <true> x = 5; <x = 5>, denn: <5 = 5> x = 5; <x = 5> true 5 = 5 <true> x = 5; <x = 5> <true> <5 = 5> x = 5; <x = 5> T. Weiler, RWTH Aachen - 10 -

Konsequenzregel 2 (Schw( Schwächere Nachbedg.) <ϕ> P <ψ> <ϕ> P <β> ψ β Bsp: <true> x = 5; <x 5>, denn: <true> x = 5; <x = 5> <true> x = 5; <x 5> x = 5 x 5 <true> <5 = 5> x = 5; <x = 5> <x 5> T. Weiler, RWTH Aachen - 11 -

Bedingungsregel 1 <ϕ B> P <ψ> <ϕ> if (B) {P <ψ> ϕ B ψ Bsp: <true> res = y; if (x > y) res = x; <res = max(x,y)> denn: <res = y x > y > <x = max(x,y)> res = x; <res = max(x,y)> <true> <y = y> res = y; <res = y> if (x > y) res = x; <res = max(x,y)> und <res = y x > y > <res = max(x,y)> T. Weiler, RWTH Aachen - 12 -

Bedingungsregel 2 <ϕ B> P <ψ> <ϕ B> Q <ψ> <ϕ> if (B) {P else {Q <ψ> Bsp: <true> if (x < 0) res = -x; else res = x; <res = x > denn: <x < 0> <-x = x > res = -x; <res = x > und < x < 0> <x = x > res = x; <res = x > T. Weiler, RWTH Aachen - 13 -

Schleifenregel (1) <ϕ B> P < ϕ > <ϕ> while (B) {P < ϕ B > Bsp.: (Berechnung der Fakultät von n) <n >= 0> i = n; res = 1; while (i > 1) { res = res * i; i = i - 1; <res = n!> T. Weiler, RWTH Aachen - 14 -

Schleifenregel (2) <ϕ B> P < ϕ > <ϕ> while (B) {P < ϕ B > Zu zeigen: <n >= 0> i = n; res = 1; < ϕ > while (i > 1) { < ϕ (i > 1)> res = res * i; i = i - 1; < ϕ > < ϕ (i > 1)> <res = n!> Problem: Wie finden wir die Schleifeninvariante ϕ? Vorgehen: Betrachte Wert der verwendeten Variablen (hier für n = 4) res 1 4 12 24 ϕ (res * i! = n!) (i >= 0) i 4 3 2 1 n 4 4 4 4 T. Weiler, RWTH Aachen - 15 -

Schleifenregel (3) <n >= 0> Zu zeigen: rot <(1 * n! = n!) (n >= 0)> Beweisschritte: blau i = n; <(1 * i! = n!) (i >= 0)> res = 1; <(res * i! = n!) (i >= 0)> while (i > 1) { <(res * i! = n!) (i >= 0) (i > 1)> <(res * i! = n!) (i >= 1)> <((res * i) * (i-1)! = n!) ((i-1) >= 0)> res = res * i; <(res * (i-1)! = n!) ((i-1) >= 0)> i = i - 1; <(res * i! = n!) (i >= 0)> <(res * i! = n!) (i >= 0) (i > 1)> <(res * i! = n!) (i >= 0) (i <= 1)> <res = n!> T. Weiler, RWTH Aachen - 16 -

Schleifenregel (4) <n >= 0> <n >= 0 n = n> i = n; <i >= 0 i = n> <i >= 0 i = n 1 = 1> res = 1; <i >= 0 i = n res = 1> <(res * i! = n!) (i >= 0)> while (i > 1) { <(res * i! = n!) (i >= 0) (i > 1)> <(res * i! = n!) (i > 0)> <((res * i) * (i-1)! = n!) (i > 0)> res = res * i; <(res * (i-1)! = n!) (i > 0)> <(res * (i-1)! = n!) (i - 1 >= 0)> i = i - 1; <(res * i! = n!) (i >= 0)> <(res * i! = n!) (i >= 0) (i > 1)> <(res * i! = n!) (i >= 0) (i <= 1)> <res = n!> T. Weiler, RWTH Aachen - 17 -

Terminierung Für jede Schleife while (B) {P finde einen int-ausdruck V (Variante der Schleife), so dass: B V 0 und <V = m B> P <V < m> while (i > 1) { res = res * i; i = i - 1; Behauptung: Variante ist i Zu zeigen: 1. B V 0 i > 1 i 0 2. <V = m B > P <V < m> <i = m i > 1> <i-1 < m> res = res * i; <i-1 < m> i = i - 1; <i < m> T. Weiler, RWTH Aachen - 18 -

Potenzierung (Algorithmus) Eingabe: b, e mit e >= 0 Ausgabe: erg = b ^ e int bas = b; int exp = e; int erg = 1; while (exp > 0) { if (exp % 2 == 1) { erg = erg * bas; bas = bas * bas; exp = exp / 2; Ganzzahlige Division in JAVA, falls Dividend und Divisor (wie hier) int-werte sind. T. Weiler, RWTH Aachen - 19 -

Potenzierung (Partielle Korrektheit - 1) <e >= 0> int bas = b; int exp = e; int erg = 1; <ϕ> while (exp > 0) { <ϕ (exp > 0)> if (exp % 2 == 1) { erg = erg * bas; bas = bas * bas; exp = exp / 2; <ϕ> <ϕ (exp > 0)> <erg = b ^ e> b e bas exp erg 2 9 2 9 1 2 9 4 4 2 2 9 16 2 2 2 9 256 1 2 2 9 65536 0 512 Schleifeninvariante: ϕ b ^ e = bas ^ exp erg exp >= 0 T. Weiler, RWTH Aachen - 20 -

Potenzierung (Partielle Korrektheit 2) Zu zeigen: <e >= 0> int bas = b; int exp = e; int erg = 1; <b ^ e = bas ^ exp erg exp >= 0> while (exp > 0) { <b ^ e = bas ^ exp erg exp >= 0 (exp > 0)> if (exp % 2 == 1) { erg = erg * bas; bas = bas * bas; exp = exp / 2; <b ^ e = bas ^ exp erg exp >= 0> <b ^ e = bas ^ exp erg exp >= 0 (exp > 0)> <erg = b ^ e> T. Weiler, RWTH Aachen - 21 -

<b ^ e = bas ^ exp erg exp >= 0> while (exp > 0) { Potenzierung (Partielle Korrektheit 3) <b ^ e = bas ^ exp erg exp >= 0 (exp > 0)> if (exp % 2 == 1) { erg = erg * bas; <b ^ e = (bas * bas) ^ (exp DIV 2) erg exp >= 0> bas = bas * bas; <b ^ e = bas ^ (exp DIV 2) erg exp >= 0> exp = exp / 2; <b ^ e = bas ^ exp erg exp >= 0> <b ^ e = bas ^ exp erg exp >= 0 (exp > 0)> T. Weiler, RWTH Aachen - 22 -

Potenzierung (IF - Anweisung) <ϕ B> P <ψ> <ϕ> if (B) {P <ψ> ϕ B ψ <b ^ e = bas ^ exp erg (exp >= 0)> if (exp % 2 == 1) { erg = erg * bas; <b ^ e = (bas * bas) ^ (exp DIV 2) erg exp >= 0> Zu zeigen also: <b ^ e = bas ^ exp erg (exp >= 0) (exp % 2 = 1)> erg = erg * bas; <b ^ e = (bas * bas) ^ (exp DIV 2) erg (exp >= 0)> und <b ^ e = bas ^ exp erg (exp >= 0) (exp % 2 = 1)> <b ^ e = (bas * bas) ^ (exp DIV 2) erg (exp >= 0)> T. Weiler, RWTH Aachen - 23 -

IF Anweisung (Bedingung erfüllt) <b ^ e = bas ^ exp erg (exp >= 0) (exp % 2 = 1)> <b ^ e = bas ^ (2 * exp DIV 2) (erg * bas) (exp >= 0)> <b ^ e = (bas ^ 2) ^ (exp DIV 2) (erg * bas) (exp >= 0)> erg = erg * bas; <b ^ e = (bas * bas) ^ (exp DIV 2) erg (exp >= 0)> Da exp % 2 = 1, also exp ungerade, gilt: bas ^ exp = bas ^ (2 * exp DIV 2) * bas Es gilt: bas ^ (2 * exp DIV 2) = (bas ^ 2) ^ (exp DIV 2) T. Weiler, RWTH Aachen - 24 -

IF Anweisung (Bedingung nicht erfüllt) <b ^ e = bas ^ exp erg (exp >= 0) (exp % 2 = 1)> <b ^ e = bas ^ (2 exp DIV 2) erg (exp >= 0)> <b ^ e = (bas ^ 2) ^ (exp DIV 2) erg (exp >= 0)> <b ^ e = (bas bas) ^ (exp DIV 2) erg (exp >= 0) > Da exp % 2 = 0, also exp gerade, gilt: bas ^ exp = bas ^ (2 * exp DIV 2) Es gilt: bas ^ (2 * exp DIV 2) = (bas ^ 2) ^ (exp DIV 2) T. Weiler, RWTH Aachen - 25 -

Potenzierung (Partielle Korrektheit 4) <e >= 0> int bas = b; int exp = e; int erg = 1; <b ^ e = bas ^ exp erg exp >= 0> while (exp > 0) { <b ^ e = bas ^ exp erg exp >= 0 (exp > 0)> if (exp % 2 == 1) { erg = erg * bas; bas = bas * bas; exp = exp / 2; <b ^ e = bas ^ exp erg exp >= 0> <b ^ e = bas ^ exp erg exp >= 0 (exp > 0)> <erg = b ^ e> T. Weiler, RWTH Aachen - 26 -

Potenzierung (Partielle Korrektheit 5) Noch zu zeigen: <e >= 0> <b ^ e = b ^ e 1 e >= 0> int bas = b; <b ^ e = bas ^ e 1 e >= 0> int exp = e; <b ^ e = bas ^ exp 1 exp >= 0> int erg = 1; <b ^ e = bas ^ exp erg exp >= 0> q.e.d T. Weiler, RWTH Aachen - 27 -

Potenzierung - Terminierung Schleifenvariante ist exp, da 1. exp > 0 exp >= 0 2. <exp = m exp > 0> <exp DIV 2 < m> if (exp % 2 == 1) { erg = erg * bas; Hat keinen Einfluss auf exp bas = bas * bas; <exp DIV 2 < m> exp = exp / 2; <exp < m> Damit: Beweis der totalen Korrektheit. T. Weiler, RWTH Aachen - 28 -

Hinweise Die Schleifeninvariante zu finden, ist ein kreativer Prozess Tabelle Verständnis des Algorithmus Erfahrung In den einzelnen Schritten möglichst nicht umformen bzw. ausrechnen Die Beweisrichtung ist von oben nach unten (vorwärts) Die Beweisfindung wird oft erleichtert, wenn man von unten nach oben vorgeht (rückwärts) T. Weiler, RWTH Aachen - 29 -

Full name: Sir Charles Antony Richard Hoare, born: 11. Jan 1934 Elliot Brothers Ltd., London (1960 1966) Professor of Computing Science at Queen's University, Belfast (1968 1977) Professor of Computation and Head of the Programming Research Group, Oxford (1977-1999) Prof. Tony Hoare Senior Researcher with Microsoft Research in Cambridge (since 1999) (Quelle: http://research.microsoft.com/~thoare/) T. Weiler, RWTH Aachen - 30 -