Definition der Hilfsprädikate

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

Partielle Korrektheit von Programmen. Beispiele an der Tafel

Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Hoare-Kalkül):

Software Entwicklung 2. Formale Verifikation

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Grundbegriffe der Informatik

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

Algorithmen und Datenstrukturen Korrektheit von Algorithmen

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

Algorithmen und Datenstrukturen

Informatik II - Tutorium

Imperative vs. Funktionale Programmierung

Theoretische Informatik SS 03 Übung 3

Informatik II, SS 2014

Kurs 1612 Konzepte imperativer Programmierung Musterlösung zur Nachklausur am

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

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

Algorithmen und Datenstrukturen

Grundlagen der Programm- und Systementwicklung. Anweisungen: Referenzen, Zeiger und organisierter Speicher

Programmierkurs Java

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Nachklausur am

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

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

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

2.3.1 Einleitung Einfache Sortierverfahren Höhere Sortierverfahren Komplexität von Sortierverfahren Spezielle Sortierverfahren

Sortieren. Eine Testmenge erstellen

Quicksort ist ein Divide-and-Conquer-Verfahren.

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

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

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

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

Kapitel 6 Elementare Sortieralgorithmen

Informatik II Musterlösung

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

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

Übung Datenstrukturen. Sortieren

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

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

Übung Algorithmen I

Abschnitt: Algorithmendesign und Laufzeitanalyse

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Funktionale Programmierung Teil 2 Methodik: Spezifikation, Implementierung, Verifikation

Erster Sortier-Algorithmus: Bubblesort

Sortieren durch Mischen (Mergesort; John von Neumann 1945)

Grundlagen von C# - 2

Welche Informatik-Kenntnisse bringen Sie mit?

Suchen und Sortieren (Die klassischen Algorithmen)

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

1.4 Die Ackermannfunktion

Programmieren I. Kapitel 5. Kontrollfluss

Grundlagen der Programmierung Teil1 Einheit III Okt. 2009

1.2 LOOP-, WHILE- und GOTO-Berechenbarkeit

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

Musterlösungen zu Datenstrukturen und Algorithmen SS 2005 Blatt 2, Aufgabe 3 Wir schreiben zunächst alle Funktionen zur Basis 2.

Algorithmen und Datenstrukturen Laufzeitabschätzung

3. Grundanweisungen in Java

Grundlagen der Programmierung (Vorlesung 15)

Informatik I Übung, Woche 40

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

11.1 Grundlagen - Denitionen

Informatik II Sortieralgorithmen

Grundlagen der Programmierung (Vorlesung 14)

Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

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

Elementare Konzepte von

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

Resolutionsalgorithmus

Sortieralgorithmen. Jan Pöschko. 18. Januar Problemstellung Definition Warum Sortieren?... 2

Folge 13 - Quicksort

Werkzeuge zur Programmentwicklung

Präzedenz von Operatoren

8. Übung zu Algorithmen I 15. Juni 2016

Grundlegende Sortieralgorithmen

JAVA - Suchen - Sortieren

Suchen und Sortieren

Algorithmen und Datenstrukturen 1-3. Seminar -

= 7 (In Binärdarstellung: = 0111; Unterlauf) = -8 (In Binärdarstellung: = 1000; Überlauf)

Einstieg in die Informatik mit Java

FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

MAXIMUM2.STR Struktogramme. Aufgabe: 3 Zahlen eingeben, größte Zahl ermitteln und ausgeben.

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

5. Elementare Befehle und Struktogramme

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

Computer & GNU/Linux Einführung Teil 4

JavaScript und PHP-Merkhilfe

Aufgabe 1.90: Ein Geschäft gibt ihren Kunden unterschiedliche Rabatte. Schreiben ein Programm, das folgende Rabattklassen vorsieht:

Überblick. Lineares Suchen

Sortierte Folgen 250

Syntax von LOOP-Programmen

Sortieren durch Einfügen. Prof. Dr. W. Kowalk Sortieren durch Einfügen 1

C.3 Funktionen und Prozeduren

Transkript:

Denition der Hilfsprädikate fct sorted = (seq nat s) bool: if #s < 2 then true else rst(s) rst(rest(s)) sorted(rest(s)) a s = ( nat k: k#a = k#s) mit k# = 0 k# j s = if k == j then 1+ k#s else k#s 1

Annotierte Anweisungen Eine (zusammengesetzte) Anweisung heißt vollständig (durch Zuweisungen) annotiert, wenn vor und nach jeder Anweisung eine Zusicherung steht. Die Annotation, die zu Beginn steht, heißt Vorbedingung. Ein annotiertes Programm heißt korrekt (annotiert), wenn für jede Ausführung des Programms ausgehend von einem Zustand, in dem die Vorbedingung gilt, alle durchlaufenen Zusicherungen in den jeweils dann eingenommen Zuständen immer gelten. 2

Bubblesort auf Sequenzen - annotiert mit Zusicherungen var seq nat a, var seq nat z :=, s; {a = z = s} do z then {sorted(a) a z s z } if a == then {a = z s z } a, z := rst(z), rest(z) {sorted(a) a z s } [] a =/= last(a) rst(z) then {sorted(a) a z s last(a) rst(z)} a, z := a rst(z), rest(z) {sorted(a) a z s } [] a =/= last(a) > rst(z) then {sorted(a) a z s last(a) > rst(z)} a, z := lrest(a), rst(z) last(a) rest(z) {sorted(a) a z s } {sorted(a) a z s } od {sorted(a) a z s z = } {sorted(a) a s} 3

Sinn annotierter Programme Ein annotiertes Programm kann durch (manuelle) Inspektion der Zusicherungen auf Korrektheit überprüft werden. Dazu wird für jede Anweisung überprüft, dass für jede Ausführung des Programms ausgehend von einem Zustand, in dem die Vorbedingung der Anweisung gilt, nach Ausführung der Anweisung die Zusicherung nach der Anweisung gilt. Für jede Art von Anweisungen gibt es formale Regeln, die diesen Zusammenhang herstellen (Zusicherungskalkül, Hoare-Kalkül) 4

Die Regel für Zuweisungen Für Zuweisungen gilt folgende Regel ( Zuweisungsaxiom ): { Q[E/x] } x := E { Q } falls E nur einfache Namen für Variablen enthält (kein Aliasing, keine Referenzen auf Variable). Beispiel: { 0 < x+1 } x := x+1 { 0 < x } {sorted(a) a z s last(a) rst(z) } {sorted(a rst(z) ) a rst(z) rest(z) s } a, z := a rst(z), rest(z) {sorted(a) a z s } 5

Die Regel für bedingte Anweisungen Für bedingte Anweisungen gilt: { Q } if C then { C Q } S1 { R } [] C then { C Q } S2 { R } { R } falls { C Q } S1 { R } und { C Q } S2 { R } gilt 6

Beispiel: Die Regel für bedingte Anweisungen Für bedingte Anweisungen gilt: { x > 1 y > 1 } if x y then { x y x > 1 y > 1 } z := x { z = min(x, y) x > 1 y > 1 } [] x > y then { x > y x > 1 y > 1 } z := y { z = min(x, y) x > 1 y > 1 } { z = min(x, y) x > 1 y > 1 } falls { x y x > 1 y > 1 } z := x { z = min(x, y) x > 1 y > 1 } und { x > y x > 1 y > 1 } z := y { z = min(x, y) x > 1 y > 1 } gilt 7

Die Regel für aufeinander folgende Zusicherungen Sind in einem annotierten Programm zwei Zusicherungen nicht durch eine Anweisung getrennt sondern folgen sie unmittelbar aufeinander, so gilt die Annotation falls { Q } gilt und { Q } { R } Q R 8

Die Regel für die Wiederholungsanweisung: Invariante Gilt für eine Wiederholungsanweisung die Annotation do C then S od {C Q } S { Q } dann ist folgendes Programm korrekt annotiert { Q } do C then {C Q } S { Q } od { C Q } Die Zusicherung Q heißt dann Invariante. Durch Invariante lassen sich Wiederholungsanweisungen verizieren. Nebenbedingungen: C enthält keine Seiteneffekte 9

Invarianten - Bubblesort {a = z = s} {sorted(a) a z s} do z then {sorted(a) a z s z }... {sorted(a) a z s } od {sorted(a) a z s z = } Invariante: Q = sorted(a) a z s 10

Bubblesort auf Feldern - annotiert mit Zusicherungen [1:n] array var nat a, var nat i := s, 1; // sei 1 n {a = s i = 1} {sorted(a[1:i]) a s i n} do i < n then {sorted(a[1:i]) a s i < n } if i == 0 then {a s i < n } i := 1 {sorted(a[1:i]) a s i < n } [] i =/= 0 a[i] a[i+1] then {sorted(a[1:i]) a s a[i] a[i+1] i < n } i := i+1 {sorted(a[1:i]) a s i n} [] i =/= 0 a[i] > a[i+1] then {sorted(a[1:i]) a s a[i] > a[i+1] i < n } a[i], a[i+1], i := a[i+1], a[i], i-1 {sorted(a[1:i]) a s i n} {sorted(a[1:i]) a s i n} od {sorted(a[1:i]) a s i n i n } {sorted(a) a s} 11

Terminierung Ist E ein totaler Ausdruck der Sorte nat und ist t ein Identikator der Sorte nat, der in C und S nicht vorkommt und ist eine Wiederholungsanweisung wie folgt korrekt annotiert { Q } do C then {C Q E = t } S { Q E < t } od { C Q } dann gilt, dass die Wiederholungsanweisung do C then S od terminiert, wenn in einem Zustand ausgeführt wird, für den die Zusicherung Q gilt. Nebenbedingung: C enthält keine Seiteneffekte, S wirft keine exceptions, es treten keine Ausdrücke auf, die den Wert liefern. 12

Beispiel: Suchen in sortiertem Feld Gegeben a : [1:n] Array Data, d : Data : sorted(a) Variable i, j : Var Nat precondition {i = 1 j = n} postcondition {1 i = j n ( (d in a) a[i] d) (a[i] = d))} wobei d in a = ( nat k: 1 k n a[k] = d ) 13

Beispiel: Suchen in sortiertem Feld - Annotation Gegeben [1:n] array data a, data d mit sorted(a) und 1 n var nat i, j := 1, n; { (d in a d in a[i:j]) 1 i j n } do i < j then { (d in a d in a[i:j]) 1 i < j n } nat m := (i+j)/2; { (d in a d in a[i:j]) 1 i m j n } if a[m] == d then i := j := m [] a[m] =/= d a[m] < d then i := m+1 ] a[m] =/= d a[m] d then j := m { (d in a d in a[i:j]) 1 i j n } od { (d in a d in a[i:j]) 1 i j n i j } { (d in a d in a[i:j]) i = j } 14

Beispiel: Suchen in sortiertem Feld - Terminierung Terminierungsausdruck: abs(j-i) var nat i, j := 1, n; { (d in a d in a[i:j]) 1 i j n } while i < j do { (d in a d in a[i:j]) 1 i < j n abs(j-i) = t} nat m := (i+j)/2; { (d in a d in a[i:j]) 1 i m < j n abs(j-i) = t} if a[m] == d then i := j := m [] a[m] =/= d a[m] < d then i := m+1 [] a[m] =/= d a[m] d then j := m { (d in a d in a[i:j]) 1 i j n abs(j-i) < t} od 15

Bubblesort auf Feldern - Terminierung Terminierungsfunktion: mit 2*inversionszahl(a) + n-i inversionszahl(a) = {(j, k): 1 j < k n a[j] > a[k] } {sorted(a[1:i]) a s i n} do i < n then {sorted(a[1:i]) a s i < n 2*inversionszahl(a) + n-i = t } if i == 0 then {z s i < n } i := 1 {sorted(a[1:i]) a s i < n } [] i == 0 a[i] a[i+1] then {sorted(a[1:i]) a s a[i] a[i+1] i < n } i := i+1 {sorted(a[1:i]) a s i n} [] i == 0 a[i] > a[i+1] then {sorted(a[1:i]) a s a[i] > a[i+1] i < n } a[i], a[i+1], i := a[i+1], a[i], i-1 {sorted(a[1:i]) a s i n} {sorted(a[1:i]) a s i n 2*inversionszahl(a) + n-i < t } od 16

Beispiel: Quicksort fct quicksort = (s : Seq Nat) Seq Nat: { var stack seq nat k, var seq nat v := estack, ; push(s, k); while k estack do seq nat a = rst(k); pop(k); if #a < 2 then v := a v else push(partle(rst(a), rest(a)), k); push( rst(a), k); push(partg(rst(a), rest(a)), k); od; v } Terminierungsfunktion: h(k) = 0 falls k = estack und h(k) = (#rst(k)) 2 +h(rest(k)) sonst Invariante: sum(k)+#v = #s mit sum(k) = 0 falls k = estack und sum(k) = #rst(k)+sum(rest(k)) 17