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

Ähnliche Dokumente
Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Assertions (Zusicherungen)

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

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

4.Grundsätzliche Programmentwicklungsmethoden

Informatik II Musterlösung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Einführung in die Informatik 1

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Algorithmen und Programmieren II Einführung in Python

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

1 Bedingungen und der Typ bool. Informatik I: Einführung in die Programmierung 5. Bedingungen, bedingte Ausführung und Schleifen. Vergleichsoperatoren

Semantik von Formeln und Sequenzen

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

SEP 114. Design by Contract

Grundlagen der Programmierung Prof. H. Mössenböck. 4. Schleifen

Kontrollstrukturen - Universität Köln

2.5 Programmstrukturen Entscheidung / Alternative

Grundlagen der Programmierung

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

Syntax von LOOP-Programmen

2. Algorithmen und Algorithmisierung Algorithmen und Algorithmisierung von Aufgaben

Abstrakte Algorithmen und Sprachkonzepte

VBA-Programmierung: Zusammenfassung

Objektorientierte Programmierung

Sudoku. Warum 6? Warum 6?

Prolog basiert auf Prädikatenlogik

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

Einführung in die Programmierung

Webbasierte Programmierung

Einführung in die Theoretische Informatik

Kapitel 7: Formaler Datenbankentwurf

Rhetorik und Argumentationstheorie.

Algorithmen und Datenstrukturen Laufzeitabschätzung

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Algorithmen und Datenstrukturen 1 Kapitel 4.1

Grammatiken. Einführung

Prädikatenlogik - Micromodels of Software

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

C.3 Funktionen und Prozeduren

Flussdiagramm / Programmablaufplan (PAP)

Einführung. Rechnerarchitekturen Entwicklung und Ausführung von Programmen Betriebssysteme

Entwurf von Algorithmen - Kontrollstrukturen

Erwin Grüner

Formale Sprachen und Automaten

Weitere Beweistechniken und aussagenlogische Modellierung

Logik für Informatiker

2. Programmierung in C

Hilbert-Kalkül (Einführung)

Wissensbasierte Systeme

Zusicherungen und Laufzeit Überwachungen in der modellbasierten Software Entwicklung

Softwareentwicklung Allgemeines und prozedurale Konstrukte

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Handout zu Beweistechniken

Kontrollstrukturen MySQL Funktionen. MySQL 4, 5. Kapitel 20a: PHP Teil 2. Marcel Noe

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

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Einfache Rechenstrukturen und Kontrollfluss II

3 Vom Zählen zur Induktion

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Algorithmen und ihre Programmierung

Syntaxanalyse Ausgangspunkt und Ziel

4.5 Nassi-Schneidermann Diagramm

Programmiersprachen. Organisation und Einführung. Berthold Hoffmann. Studiengang Informatik Universität Bremen

Design by Contract with JML

Zusammenfassung. 1 Wir betrachten die folgende Signatur F = {+,,, 0, 1} sodass. 3 Wir betrachten die Gleichungen E. 4 Dann gilt E 1 + x 1

Program = Logic + Control

Theoretische Informatik. Reguläre Sprachen und Automaten

Probeklausur: Programmierung WS04/05

Übungen zur Vorlesung Wissenschaftliches Rechnen I. Grundelemente von Java. Eine Anweisung. wird mit dem Wertzuweisungsoperator = geschrieben.

Theoretische Grundlagen des Software Engineering

Laufzeitverifikation

Endlicher Automat (EA)

Client-Server-Beziehungen

Grundlagen der Programmierung (Vorlesung 14)

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

Grundlagen der Programmierung in C++ Kontrollstrukturen

Grundlagen der Programmierung

Übersicht Programmablaufsteuerung

1. Erläutern Sie die Aufgaben von Datentypen in der imperativen Programmierung.

Programmieren in C/C++ und MATLAB

Einführung in die Informatik Grammars & Parsers

Programmierkurs II. C und Assembler

Lösungen zur 3. Projektaufgabe TheGI1

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

Kapitel 2. Methoden zur Beschreibung von Syntax

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

7. Formale Sprachen und Grammatiken

Die Programmiersprache C Eine Einführung

Formale Methoden II. Gerhard Jäger. SS 2008 Universität Bielefeld. Teil 8, 11. Juni Formale Methoden II p.1/30

Software- und Systementwicklung

Zusammenfassung. Satz. 1 Seien F, G Boolesche Ausdrücke (in den Variablen x 1,..., x n ) 2 Seien f : B n B, g : B n B ihre Booleschen Funktionen

Grundlagen der Programmierung

12 == 12 true 12 == 21 false 4 === 7 true 4 === "vier" false 4 === 4.0 false 12!= 13 true 12!== 12 false 12!== 12.0 true. 1 < 3 true 3 < 1 false

Transkript:

Algorithmen und Programmieren II Programmverifikation {V} P {N} SS 2012 Prof. Dr. Margarita Esponda ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 1

Assertions oder Zusicherungen Das Konzept der Zusicherungen kommt aus dem Gebiet der Programmverifikation und Softwarequalität. Assertions sind Anweisungen, die mit Hilfe eines logischen Ausdrucks Bedingungen während der Ausführung eines Programms überprüfen. Beim Assertions geht der Programmierer davon aus, dass diese immer erfüllt sind, überprüft aber trotzdem diese Behauptungen, um zu garantieren, dass Programme immer korrekt ablaufen. Diese Art der Programmierung nennt man defensives Programmieren. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012

Design by Contract (DBC) Zusicherungen sind kein neues Konzept. Assertions kommen aus dem DBC-Konzept, der seit Jahren in mehreren Programmiersprachen eingeführt ist. Die Idee ist, dass die Software nur nach einem bestimmten Vertrag (Spezifikation) zwischen Softwareentwickler und Kunden entworfen wird. Fast alle wichtigen modernen Programmiersprachen unterstützen das DBC-Konzept Beispiel: C, C++, C#, Java, Pearl, PHP, Python, usw. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012

Design by Contract (DBC) Nach dem DBC-Konzept gibt es drei Sorten von Assertions: Vorbedingungen (Preconditions) Bedingungen, die vor der Ausführung einer Funktion oder Methode erfüllt werden sollten. Nachbedingungen (Postconditions) Bedingungen, die nach der Ausführung einer Funktion oder Methode gelten sollten. Invariant (Invariante) Bedingungen, die innerhalb eines Programmsegments immer wahr sein müssen. Zum Beispiel innerhalb einer for-schleife, Funktion oder Klasse. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 4

Motivation Es wird ständig wichtiger aus finanziellen Gründen Fehler in Programmen zu finden. Mit Assertions versucht der Softwareentwickler, Fehler so früh wie möglich zu beseitigen. Nach Qusay H. Mahmoud, sahen im Jahr 2005 die Fehlerkorrekturkosten, je nachdem in welcher Phase der Softwareentwicklung die Fehler beseitigt wurden, wie folgt aus. $1 Definition der Anforderungen $5 Softwaredesign $10 Implementierung der Software $20 Testphase $200 nach der Lieferung des Software ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 5

assert-anweisung in Python Syntax: assert e 1, e 2,, e n Beispiel: mylist = [1,2] assert len(mylist)>0 print(mylist.pop()) assert len(mylist)>0 print(mylist.pop()) assert len(mylist)>0 mylist.pop() >>> 2 1 Traceback (most recent call last): File "assert_statement.py", line 11, in <module> assert len(mylist)>0 AssertionError >>> ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 6

Programmverifikation Imperative Programmiersprachen Motivation Wie können wir wissen, dass ein Programm korrekt funktioniert? Viel testen hilft, ist aber kein Beweis! Sicherheitskritische Softwarebereiche können sich keine Fehler erlauben Beispiele: Steuerungssysteme für Medizingeräte oder Flugzeuge Überwachungssysteme für Verkehr (z.b. Zug-Verkehr) Software für Weltraumprojekte usw. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 7

Programmverifikation Ziel Imperative Programmiersprachen Grundsätzliches Verständnis von Verifikationsmethoden zu erwerben und mit Hilfe dieser Denkweise eine Verbesserung in der Entwicklung von Software zu erreichen. Programmverifikation ist leider nicht immer einsetzbar und das systematische Testen bleibt als einzige Alternative zur Analyse der Korrektheit eines Programms. Um ein Programm zu verifizieren, brauchen wir einen mathematischen Formalismus. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 8

Programmverifikation Zwei Formalismen Hoare-Kalkül Sir Charles Antony Hoare - 1930 - University of Oxford, Michrosoft Research Cambridge - 1980 Turing Award - Einige wichtige Leistungen sind: - CSP (Communicating Sequential Processes) - Monitor-Konzept - Hoare-Kalkül - usw. Die Verifikation eines Programms besteht aus zwei Schritten: - Beweis der partiellen Korrektheit - Beweis der Terminierung ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 9

Zwei Formalismen wp-kalkül Edsger Wybe Dijkstra - 1930-1972. Turing Award - Dijkstra's Algorithms - Semaphore-Konzept - Guarded Command Language - Die Methode der schwächsten Vorbedingung wp-kalkül - usw. Die Methode der schwächsten Vorbedingung. weakest precondition (wp) Die totale Korrektheit wird in einem einzigen Arbeitsgang bewiesen ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 10

Grundlegende Definitionen: Hoare-Kalkül Definition von Programmformeln {P} S {Q} wird als Programmformel bezeichnet, wenn S ein Programm ist und P und Q Prädikate (über Variablen und Konstanten von S) sind. Gültigkeit von Programmformeln Eine Programmformel {P} S {Q} ist gültig, wenn vor Ausführung von S, das Prädikat P wahr ist und nach Beendigung von S, das Prädikat Q wahr ist, gilt. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 11

Hoare-Kalkül Programmformeln können als Programmspezifikation für Programme benutzt werden, wenn diese erst geschrieben werden sollen. DBC Design By Contract oder als Programmdokumentation, um die Wirkung eines Programms formal zu beschreiben Probleme: es existieren beliebig viele Formeln für ein Programm die Formeln können zu ungenau oder zu schwach sein Beispiel: {True} S {True} gilt immer für alle Programme S ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 12

Partielle Korrektheit eines Programms Definition: Sei {P} S {Q} eine Programmspezifikation. Jedes Programm S' ist partiell korrekt in Bezug auf diese Spezifikation, wenn eine Programmformel {P'} S' {Q'} mit P P' und Q' Q existiert. Die partielle Korrektheit eines Programms S ist bewiesen, wenn die Vorbedingung P der Spezifikation die Vorbedingung P' einer gültigen Programmformeln von S' impliziert und die Nachbedingung Q' die Nachbedingung Q der Spezifikation impliziert. P P' und Q' Q gleich oder schwächer als P mindestens so stark wie Q ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 13

Axiomatische Semantik für einfache Anweisungen Leeranweisungsaxiom Die leere Anweisung hat keine Auswirkung auf den Zustand irgendeiner Programmvariablen und wird durch folgendes Axiom definiert: Für jedes Prädikat P ist {P} {P} eine gültige Programmformel. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 14

Axiomatische Semantik für einfache Anweisungen Zuweisungsaxiom Sei x = expr eine Zuweisung (in C, C++, Java, Python, usw.), die den Wert der Variablen x durch den Wert des Ausdrucks expr ersetzt, dann wird die Semantik durch das Zuweisungsaxiom wie folgt definiert. Für jedes Prädikat P ist {P <x expr>} x = expr {P} eine gültige Programmformel. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 15

Zuweisungsaxiom Beispiel: Folgende Programmformel { z>0 y-1>0 z==0 y-1 0 } y = y - 1 { z>0 y>0 z==0 y 0} ist gültig, weil nach Anwendung der Substitution y y-1 in der Nachbedingung diese vor der Ausführung der Zuweisung gültig ist und somit die Nachbedingung auch. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 16

Zuweisungsaxiom In den Programmformeln verwenden wir (==) für die logischen Vergleichsoperationen innerhalb von Prädikaten, um diese von dem Zuweisungsoperator (=) innerhalb von Programmen zu unterscheiden. Beispiel: Folgende Programmformeln sind gültig: {z>0} x = 0 {z>x} {x==1} x = x-1 {x==0} {y 1 y 5} x = y+1 {x 2 y 5} ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 17

Das Hoare-Kalkül Das Hoare-Kalkül stellt eine Reihe von Ableitungsregeln zur Verfügung, die, den Nachweis partieller oder totaler Korrektheit ermöglichen. Die Ableitungsregeln haben folgende allgemeine Form: H 1,...,H n H und bedeuten, dass, wenn H 1 bis H n erfüllt sind, dann auch H erfüllt ist. Manche Regeln haben zusätzliche Bedingungen, die festlegen, wann sie angewendet werden dürfen. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 18

Ableitungsregeln Sequenzregel Besteht eine Sequenz aus den Anweisungen S 1 und S 2, und sind die Programmformeln {P} S 1 {R} und {R} S 2 {Q} gültig, dann ist auch {P} S 1, S 2 {Q} gültig. {P} S 1 {R}, {R} S 2 {Q} {P} S 1, S 2 {Q} "," als Verallgemeinerung der Trennzeichen zwischen Anweisungen ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 19

Sequenzregel C, C++, Java, usw. Ableitungsregeln {P} S 1 {R}, {R} S 2 {Q} {P} S 1 ; S 2 {Q} Python {P} S 1 {R}, {R} S 2 {Q} {P} S 1 S 2 {Q} Induktiv lässt sich diese Regel von zwei Anweisungen auf endlich viele aufeinanderfolgende Anweisungen erweitern. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 20

Sequenzregel Beispiel: Nehmen wir an, wir möchten die Gültigkeit folgender Programmformel beweisen { x > y } y = x - y y = x + y { x < y }.......... (1) Nach der Sequenzregel ist die Programmformel gültig, wenn wir eine Bedingung R finden können, so dass die beiden Programmformeln {x>y} y = x - y {R}.......... (2) und {R} y = x+y {x<y}.......... (3) gültig sind. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 21

Sequenzregel {x>y} y = x - y {R}.......... (2) {R} y = x+y {x<y}.......... (3) Wenn wir das Zuweisungsaxiom auf (3) anwenden, erhalten wir als Vorbedingung R x<x+y, {R x<x+y} y = x+y {x<y}.... (3) und wenn wir wiederum das Prädikat R in (2) einsetzen, erhalten wir mit dem Zuweisungsaxiom die Vorbedingung x<x+x-y, die äquivalent zu x>y ist. {x>y} {x<x+(x-y)} y = x - y {R x<x+y}.. (2) ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 22

Regel für Blockanweisungen Eine Anweisungsfolge S kann durch begin und end in Pascal oder geschweifte Klammern in C oder Java eingeschlossen werden, ohne dass sich die Semantik von S ändert. Pascal {P} S {Q} {P} begin S end {Q} C, C++, Java, usw. {P} S {Q} {P} {S} {Q} ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 23

Ableitungsregeln Bedingungsregel wenn wir folgende Programmformel betrachten {P} if Bedingung: S 1 else: S 2 {Q} müssen wir zwischen zwei Fällen unterscheiden 1. Fall Bedingung==True dann ist {P Bedingung} S 1 {Q} eine gültige Formel 2. Fall Bedingung==False dann ist {P Bedingung} S 2 {Q} eine gültige Formel ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 24

Ableitungsregeln Bedingungsregel bzw. Inferenz-Schema für Fallunterscheidung {P B} S 1 {Q}, {P B} S 2 {Q} {P} if (B) S 1 else S 2 {Q} C, C++, Java, usw. Python {P B} S 1 {Q}, {P B} S 2 {Q} {P} if B: S 1 else: S 2 {Q} ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 25

while-regel Formen von while-anweisungen Ableitungsregeln Java und C Pascal Python while (B) S while B do S while B: S Nehmen wir an, dass {P B} S {P} eine gültige Programmformel für den Schleifen-Block S ist wenn B nach einem Schleifen-Durchlauf noch erfüllt wird, dann gilt die Vorbedingung {P B} wenn B nicht mehr erfüllt wird, dann gibt es keinen Schleifen- Durchlauf mehr und es gilt {P B} ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 26

while-regel {P B} S {P} {P} while B: S {P B} Die Vorbedingung P ist nach jedem Schleifen-Durchlauf wahr. P wird als Schleifen-Invariante bezeichnet. Die Festlegung von Schleifen-Invarianten spielt eine zentrale Rolle in der Korrektheitsanalyse von Programmen. Aus der Gültigkeit von {P B} S {P} kann nicht abgeleitet werden, dass jemals B erfüllt wird, d.h. wir wissen nicht, ob die Schleife terminiert. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 27

while-regel {INV B} S {INV} {INV} while B: S {P INV} while B: S1... Sn INV INV B INV INV B ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 28

Beispiel: while-regel Nehmen wir an, wir möchten die Gültigkeit folgender Programmformel beweisen: { x 0 } while x!=0: x = x-1 { x==0 } wir wählen P x 0 und wissen, dass B x 0. Weil P B x==0, können wir unsere Programmformel wie folgt schreiben: { P } while x!=0: x = x-1 { P B } ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 29

while-regel weiter mit dem Beispiel: Nach der while-regel ist unsere Programmformel gültig, wenn {P B} x=x-1 {P} mit anderen Worten, wir müssen nur die Gültigkeit folgender Programmformel beweisen {x 0 x 0} x=x-1 {x 0} Diese ergibt sich aus dem Zuweisungsaxiom (x 0 x 0) x 1 {x-1 0} x=x-1 {x 0} mit P x 0 (Schleifeninvariante) { x 0 } while x!=0: x = x-1 { x==0 } ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 30

do-while-regel Ableitungsregeln Pascal {P} S {Q}, {Q B} {P} {P} repeat S until B; {P B} C und Java {P} S {Q}, {Q B} {P} {P} do S while (B); {P B} ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 31

Konsequenz-Regeln Regel der Schwächeren Nachbedingung Wenn nach der Ausführung einer Anweisungsfolge S die Bedingung R erfüllt ist, dann ist auch jede Nachbedingung Q erfüllt, die aus R impliziert werden kann. {P} S {R}, R Q {P} S {Q} ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 32

Konsequenz-Regeln Regel der stärkeren Vorbedingung Wenn {R} S {Q} eine gültige Programmformel ist, dann ist für jede Bedingung P, die R impliziert, auch die Programmformel {P} S {Q} gültig. P R, {R} S {Q} {P} S {Q} ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 33

Beispiel: Konsequenz-Regeln Nehmen wir an, dass folgende Programmformel gilt: {x>0 y>0} S {z+a y == x y a==0} aber (z+a y == x y) a==0 z == x y dann folgt aus der Regel der schwächeren Nachbedingung {x>0 y>0} S { z==x y } ist eine gültige Programmformel. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 34

Anwendung der Konsequenz-Regeln Wenn wir die Regel der schwächeren Nachbedingungen zweimal verwenden, können wir folgendes Inferenz-Schema aus der Bedingungsregel ableiten: Python {P B} S 1 {Q}, {P B} S 2 {R} {P} if B: S 1 else: S 2 {Q R} weil Q Q R und R Q R und in beiden oberen Programmformeln angewendet werden kann. ALP II: Margarita Esponda, 11. Vorlesung, 22.5.2012 35