Partielle Korrektheit von Programmen. Beispiele an der Tafel

Ähnliche Dokumente
Algorithmen und Programmieren II Programmverifikation {V} P {N}

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

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

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

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

Kurs 1612 Konzepte imperativer Programmierung Musterlösung zur Nachklausur am

WS 05/06 mod Verifikation

4.3 Verifikation von Aussagen über Algorithmen

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

Grundlagen der Theoretischen Informatik

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

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Verifikation von Programmen

Theoretische Informatik SS 03 Übung 3

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

Definition der Hilfsprädikate

3. Grundanweisungen in Java

Algorithmen und Datenstrukturen Korrektheit von Algorithmen

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

Statisches Programmverständnis. pk12w16,

Verifizierende Testverfahren

Informatik II, SS 2014

Software Entwicklung 2. Formale Verifikation

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Schleifeninvarianten. Dezimal zu Binär

1. Übung Algorithmen I

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

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

Sequentielle Programme, Hoare-Logik und Dynamische Logik

SPARK95. Ingmar Wirths. 12. Juli 2007

Informatik II - Tutorium

Algorithmen und Datenstrukturen 1 Kapitel 4.1

Grundbegriffe der Informatik

3. Wahrheitswerte. Boolesche Funktionen; der Typ bool; logische und relationale Operatoren; Kurzschlussauswertung; Assertions und Konstanten

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

Resolutionsalgorithmus

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

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

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.

Kurs 1612 Konzepte imperativer Programmierung Kurs 1613 Einführung in die imperative Programmierung

Übung zur Vorlesung Berechenbarkeit und Komplexität

So viele Fehler! Programmverifikation und logisch falsche Programme

Formale Programmverifikation. Referentin: Kirsten Hradek

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

Vorlesung Datenstrukturen

C++ - Einführung in die Programmiersprache Schleifen

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

Mathematische Rekursion

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie

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

Verlässliche Echtzeitsysteme

Verlässliche Echtzeitsysteme

Softwaretechnik. Vorlesung 06: Design by Contract (Entwurf gemäß Vertrag) Peter Thiemann SS Universität Freiburg, Germany

Kontrollstrukturen -- Schleifen und Wiederholungen

Tableaukalkül für Aussagenlogik

Thomas Gewering Benjamin Koch Dominik Lüke. (geschachtelte Schleifen)

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Übung Informatik I - Programmierung - Blatt 3

Semantik von Programmiersprachen SS 2017

Einführung in die Informatik Algorithms II

Institut für Programmierung und Reaktive Systeme 7. Juli Programmieren II. Übungsklausur

7.1 Spezifikation mit Vor- und Nachbedingungen

Tag 3 Repetitorium Informatik (Java)

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

LOOP-Programme: Syntaktische Komponenten

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

Funktionale Spezifikation

1 Einführung. 2 Typ-0- und Typ-1-Sprachen. 3 Berechnungsmodelle. 4 Unentscheidbarkeit. 5 Unentscheidbare Probleme. 6 Komplexitätstheorie

Informatik II Musterlösung

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

Informatik I Tutorium WS 07/08

Bsp. Euklidischer Algorithmus

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Vorlesung. Vollständige Induktion 1

3. Anweisungen und Kontrollstrukturen

Noethersche Induktion

Praktikum zur Vorlesung Einführung in die Programmierung WS 14/15 Blatt 3

Einführung in die Programmierung II. 3. Kontrollstrukturen

Schleifen: Immer wieder dasselbe tun

Algorithmen und Programmieren II Einführung in Python (Teil 2)

Kapitel 5. Textalgorithmen. 5.1 Grundbegriffe

Einführung in die Programmierung I Systema=sches Programmieren

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

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

7 Axiomatische Semantik

Algorithmen und Datenstrukturen

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

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

Fachhochschule Südwestfalen Wir geben Impulse. Kontrollstrukturen und Schleifen in Octave

Tag 3 Repetitorium Informatik (Java)

Student: Alexander Carls Matrikelnummer: Aufgabe: Beschreibung des euklidischen Algorithmus Datum:

Grundlagen: Algorithmen und Datenstrukturen

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

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

Theoretische Informatik SS 03 Übung 5

Tutoraufgabe 1 (Hoare-Kalkül):

Einführung in die Theoretische Informatik

Transkript:

Partielle Korrektheit von Programmen Beispiele an der Tafel ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 36

Beispiel: Partielle Korrektheit von Programmen Nehmen wir an, wir möchten beweisen, dass folgendes Programm partiell korrekt ist: # Eingabe dividend = int(input( 'n=' )) divisor = int(input( 'd=' )) while rest >= divisor: # Ausgabe print( 'rest=',rest) print( 'result=',result) Das Programm berechnet die ganzahlige Division mit Rest von zwei positiven Zahlen Wir werden in unserer Analyse keine Ausgabe berücksichtigen und die Eingabe als vorgegebene Konstanten betrachten. ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 37

Vor- und Nachbedingungen können wir mit Hilfe von assert- Anweisungen formulieren. # Eingabe dividend = int(input( 'n=' )) divisor = int(input( 'd=' )) assert dividend>=0 and divisor>0 Vorbedingung {P} Div-Programm assert dividend==(result*divisor+rest) and 0<=rest and rest<divisor Nachbedingung {Q} ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 38

Unser Programm ist partiell korrekt, wenn die Programmformel {P} Div-Programm {Q} gültig ist. {dividend 0 divisor>0} {P} {dividend==result divisor+rest 0 rest<divisor} {Q} Wir fangen rückwärts mit Q an und versuchen, eine Schleifeninvariante für die while-anweisung zu finden, dann beweisen wir mit Hilfe der Sequenzregel den Rest. ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 39

{dividend 0 divisor>0} {B} {P} {dividend==result divisor+rest 0 rest<divisor} {Q} Zuerst müssen wir eine Schleife-Invariante finden, sodass folgendes gilt: INV B dividend==result divisor+rest 0 rest<divisor weil B rest<divisor gilt, dann eine mögliche Invariante ist: INV dividend==result divisor+rest 0 rest ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 40

Partielle Korrektheit von Programmen jetzt müssen wir für unsere Schleife die while-regel beweisen {INV B} Schleifen-Rumpf {INV} in unserem Fall: {dividend==result divisor+rest 0 rest rest divisor} {dividend==result divisor+rest 0 rest } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 41

Partielle Korrektheit von Programmen Wir fangen wieder rückwärts an und versuchen, zuerst eine Vorbedingung P 1 für die letzte Zuweisung zu finden und dann eine Vorbedingung P 2 für die erste Zuweisung zu finden mit Hilfe des Zuweisungsaxioms. {dividend==result divisor+rest 0 rest rest divisor} {P 2 } {P 1 } {dividend==result divisor+rest 0 rest } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 42

Partielle Korrektheit von Programmen {dividend==result divisor+rest 0 rest rest divisor} {dividend==(result+1) divisor+rest-divisor 0 rest-divisor} {P 2 } {P 2 } {dividend==(result+1) divisor+rest 0 rest } {P 1 } {dividend==(result) divisor+rest 0 rest } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 43

{dividend==result divisor+rest 0 rest rest divisor} Da die Vorbedingung des Schleifenrumpfs das Prädikat P 2 impliziert, haben wir aufgrund der zweiten Konsequenz-Regel die Gültigkeit der Teilformel bewiesen. {dividend==result divisor+rest rest divisor } {P 2 } {dividend==(result+1) divisor+rest 0 rest } {P 1 } {dividend==(result) divisor+rest 0 rest } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 44

{dividend==result divisor+rest 0 rest rest divisor} {dividend==(result+1) divisor+rest 0 rest } {dividend==(result) divisor+rest 0 rest } Mit Hilfe der Sequenzregel erhalten wir: {dividend==result divisor+rest 0 rest rest divisor} {dividend==(result) divisor+rest 0 rest } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 45

Partielle Korrektheit von Programmen Wir haben eine Schleifeninvariante gefunden und damit auch nach der while-regel die Gültigkeit der Programmformel {INV} {dividend==result divisor+rest 0 rest } {dividend==result divisor+rest 0 rest<divisor } bewiesen. {INV B} ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 46

Partielle Korrektheit von Programmen Zum vollständigen Beweis der partielle Korrektheit brauchen wir nur noch zu zeigen, dass nach der Ausführung der ersten zwei Zuweisungen aus den Anfangsvorbedingungen die Schleifen-Invariante hergeleitet werden kann. {dividend>=0 divisor>0} {dividend==result divisor+rest 0 rest } {dividend==result divisor+rest 0 rest<divisor } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 47

Wieder mit dem Zuweisungsaxiom erhalten wir {dividend>=0 divisor>0} {dividend==result divisor +dividend 0 dividend} {dividend==result divisor+dividend 0 dividend} {dividend==result divisor+rest 0 rest } {dividend==result divisor+rest 0 rest<divisor } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 48

{dividend>=0 divisor>0} {dividend==dividend 0 dividend} {dividend==result divisor +dividend 0 dividend} {dividend==result divisor+dividend 0 dividend} {dividend==result divisor+rest 0 rest } {dividend==result divisor+rest 0 rest<divisor } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 49

{dividend>=0 divisor>0} {true 0 dividend} {dividend==dividend 0 dividend} {dividend==result divisor +dividend 0 dividend} {dividend==result divisor+dividend 0 dividend} {dividend==result divisor+rest 0 rest } {dividend==result divisor+rest 0 rest<divisor } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 50

{dividend>=0 divisor>0} {0 dividend} {true 0 dividend} {dividend==dividend 0 dividend} {dividend==result divisor +dividend 0 dividend} {dividend==result divisor+dividend 0 dividend} {dividend==result divisor+rest 0 rest } {dividend==result divisor+rest 0 rest<divisor } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 51

Partielle Korrektheit von Programmen {dividend>=0 divisor>0} {dividend>=0} wir beweisen die Gültigkeit der {dividend==result divisor+rest 0 rest } Teilprogrammformel mit Hilfe der Konsequenzregel {dividend==result divisor+rest 0 rest<divisor } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 52

Partielle Korrektheit von Programmen Zum Schluss verwenden wir die Sequenzregel und beweisen damit unsere Programmformel. {dividend>=0 divisor>0} {dividend==result divisor+rest 0 rest } {dividend>=0 divisor>0} {dividend==result divisor+rest 0 rest<divisor } {dividend==result divisor+rest 0 rest<divisor } ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 53

Nochmal alle Vorund Nachbedingungen in Python # Eingabe dividend = int(input('n=')) divisor = int(input('d=')) assert dividend>=0 and divisor>0 assert result*divisor==0 and dividend>=0 assert dividend==(result*divisor+rest) and rest>=0 assert dividend==(result*divisor+rest) and rest>=0 and rest>=divisor assert dividend==((result+1)*divisor+rest) and 0<=rest assert dividend==(result*divisor+rest) and 0<=rest and rest<divisor # Ausgabe print('rest=',rest) print('result=',result) ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 54

Terminierung Bis jetzt haben wir nur die partielle Korrektheit bewiesen. Die totale Korrektheit kann nur bewiesen werden, wenn die Terminierung gezeigt wird. Das Problem entsteht, wenn wir mindestens eine Schleife haben. Betrachten wir folgende while-schleife while B: S 1 S 2 Wir müssen nachweisen, dass nach endlich vielen Schleifendurchläufen B erfüllt ist. ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 55

Terminierung Eine Funktion τ heißt Terminierungsfunktion der while-schleife while B: S wenn sie folgende drei Bedingungen erfüllt: 1) Seien v 1,, v n die in B und S vorkommenden Variablen und Konstanten. Dann ist τ: Ζ n Ζ mit τ(v 1,, v n ) Ζ. 2) Ist vor einem Schleifendurchlauf τ(v 1,, v n )=t erfüllt, dann ist nach dem Schleifendurchlauf τ(v 1,, v n )<t erfüllt. 3) Es existiert ein Wert t* Ζ, so dass vor jedem Schleifendurchlauf τ(v 1,, v n ) t* gilt. Existiert eine Terminierungsfunktion für eine Schleife, dann terminiert die Schleife. ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 56

Iterationsregel für totale Korrektheit {INV B t=z} S {INV t<z}, INV t 0 {INV} while B: S {INV B} Erweiterung der while-regel mit zusätzlichen Bedingungen über die Laufvariable Durch {t=z} S {t<z} nimmt t bei jedem Schleifendurchlauf ab INV t 0 stellt sicher, dass eine untere Schranke gibt Das bedeutet, die Schleife muss irgendwann enden. ALP II: Margarita Esponda, 12. Vorlesung, 24.5.2012 57