Bisher: Wiederholung Klassische Logik Aussagenlogik: I Syntax I Semantik I Semantisches Folgern I Syntaktisches Schließen (Beweisen) Hilbert-Kalkül Prädikatenlogik (1. Stufe): I Syntax I Semantik I Semantisches Folgern I Syntaktisches Schließen (Beweisen) Hilbert-Kalkül Hoare-Kalkül – Motivation Verifikation imperativer Programme I I I Spezifikation: Angabe von Vorbedingung ϕ und Nachbedingung ψ (logische Formeln) Implementierung (Entwurf, Programm) Verifikation: Beweis, das der Entwurf die Spezifikation erfüllt, d.h. die Ausführung des Programmes jeden Zustand, in dem ϕ gilt, in einen Zustand, in dem ψ gilt, überführt. Spezifikation (informal und formal) I ist zu Beginn des Software-Entwicklungsprozesses oft noch nicht klar, I zunächst grober Ansatz, I wird schrittweise verfeinert, I formale Spezifikation hilft auch bei Problemverständnis und Dokumentation während des Entwicklungsprozesses Korrektheit von Programmen Programm P heißt bezüglich der Spezifikation I Vorbedingung ϕ I Nachbedingung ψ partiell korrekt , falls gilt: Aus der Gültigkeit von ϕ im Zustand vor Ausführung von P folgt die Gültigkeit von ψ im Zustand nach Ausführung von P, falls P terminiert. total korrekt , falls gilt: Aus der Gültigkeit von ϕ im Zustand vor Ausführung von P folgt, dass 1. P terminiert und 2. ψ im Zustand nach Ausführung von P gilt. While-Programme (einfache Programmiersprache mit Ablaufsteuerung) Datentypen Int, Bool Ausdrücke E ::= n | x | (-E) | (E+E) | (E-E) | (E*E) mit n ∈ Int, x ∈ (Variablenmenge) X B ::= true | false | (!B) | (B && B) | (B || B) | ( E < E) Anweisungen I I einfach: Zuweisungen zusammengesetzt: Nacheinanderausführung, Verzweigung, Schleife C ::= x := E | C;C’ | while B {C} | if B then {C} else {C} mit Programmvariable x, Ausdruck E, Boolescher Ausdruck B, Anweisungen C, C 0 Programmzustand: Belegung aller Variablen mit Werten (passenden Typs) Beispiel Berechnung von n! induktive Definition von n!: IA 0! = 1 IS ∀n ∈ : (n + 1)! = (n + 1)n! Spezifikation: I Vorbedingung: x ist ein Wert vom Typ Int I Nachbedingung: y = x! Implementierung P: N y = 1; z = 0; while !( z = ... ){ z = ... y = ... } Problem: P terminiert nur für nichtnegative x I partiell korrekt für die oben gegebene Spezifikation I total korrekt für die Spezifikation mit Vorbedingung x ≥ 0 Hoare-Kalkül – Syntax Hoare-Tripel {ϕ}P{ψ} mit I Vorbedingung ϕ Aussage über Programmzustand prädikatenlogische Formel mit I Variablen: I I I I im Programm vorkommende (Programmvariablen) zusätzliche (logische Variablen) Funktionssymbolen +, −, · Relationssymbolen =, <, > Quantoren dürfen nur Variablen binden, die nicht im Programm vorkommen I Programm P (Anweisung, einfach oder zusammengesetzt) I Nachbedingung ψ (prädikatenlogische Formel wie Vorbedingung) Hoare-Tripel – Beispiel informale Spezifikation: Berechne eine ganze Zahl y , deren Quadrat kleiner als die eingegebene ganze Zahl x ist. formale Spezifikation: I Vorbedingung: keine, also t I Nachbedingung: y · y < x als Hoare-Tripel: {t}P{y · y < x} Problem: keine Lösung für x = −1 Lösung: Korrektur der Spezifikation, Vorbedingung {0 < x} als Hoare-Tripel: {0 < x}P{y · y < x} Hoare-Kalkül – Semantik X Zustand (Variablenbelegung) s : → Int erfüllt die Formel ϕ (s |= ϕ), falls ((Int,Bool),s)|= ϕ mit ((Int,Bool),s) als Σ-Interpretation (Int und Bool mit den üblichen Operationen und Relationen, s als Belegung der Programmvariablen) Beispiele: Zustand s mit s(x) = −1, s(y ) = 4 I s |= (x < y ) I s 6|= (y < y · x) I s |= (x · y < y ) I s |= (x = x0 ∧ y > x0 ) I s 6|= (∀z : x · z < y ) I s |= (∀z : (z > 0 → (x · z < y )) I s |= t I s 6|= f Hoare-Tripel – Semantik {ϕ} P{ψ} Semantik: I für jeden Zustand s, in dem Vorbedingung ϕ gilt: I wenn A (Anweisung) ausgeführt wird, I gilt im erreichten Zustand t die Nachbedingung ψ Beispiel: { x >= 5 } y := x + 3 { y >= 7 } Gültigkeit solcher Aussagen kann man I beweisen (mit Hoare-Kalkül) I prüfen (testen) Hoare-Kalkül – Beispiel Spezifikation als Hoare-Tripel: {x > 0}P{y · y < x} Implementierung 2: y = 0 erfüllt die Spezifikation Implementierung 2: y = 0 while (y * y < x){ y = y + 1 }; y = y - 1 erfüllt die Spezifikation auch Idee: syntaktisches Ableiten von gültigen Hoare-Tripeln über Struktur der Anweisung (Programm) Hoare-Kalkül – Beweisregeln Regelschemata: {ϕ}c1 {ψ} {ψ}c2 {η} {ϕ}c1 ; c2 {η} {ϕ ∧ B}c1 {ψ} {ϕ ∧ ¬B}c2 {ψ} {ϕ} if B then c1 else c2 {ψ} {ϕ ∧ B}c{ϕ} {ϕ} while B c {ϕ ∧ ¬B} ϕ0 → ϕ {ϕ}c{ψ} {ϕ0 }c{ψ 0 } ψ → ψ0 Axiom: {ϕ[x 7→ E]}x = E{ϕ} Axiom-Instanzen {ϕ[x 7→ E]}x = E{ϕ} I {2 = 2}x = 2{x = 2} I {2 = 4}x = 2{x = 4} I {2 = y }x = 2{x = y } I {2 > 0}x = 2{x > 0} I {x + 1 = 2}x = x + 1{x = 2} I {x + 1 = y }x = x + 1{x = y } I {x + 1 + 5 = y }x = x + 1{x + 5 = y } I {x + 1 > 0 ∧ y > 0}x = x + 1{x > 0 ∧ y > 0} Verifikation Verifikation eines Hoare-Tripels {ϕ}P{ψ}: schrittweise Konstruktion eines Beweises für {ϕ}P{ψ} Darstellung von Beweisen: I Baum oder I sequentielle Darstellung: {ϕ0 } c1 {ϕ1 } .. . c2 {ϕn−1 } cn {ϕn } Schwächste Vorbedingungen Beweiskonstruktion von unten nach oben Ausgangspunkt: Programm P, Nachbedingung ψ Schrittweise Bestimmung der schwächsten Vorbedingung ϕ, so dass {ϕ}P{ψ} ein gültiges Hoare-Tripel ist. Beispiele (sequentiell) Spezifikation: {y = 5}x = y + 1{x = 6} Verifikation: {y = 5} {y + 1 = 6} {x = 6} x =y +1 (Implikation) (Zuweisung) Spezifikation: {y < 3}y = y + 1{y < 4} Verifikation: {y < 3} {y + 1 < 4} {y < 4} y =y +1 (Implikation) (Zuweisung) Beispiele (sequentiell) Spezifikation: {t}z = x; z = z + y ; u = z{u = x + y } Verifikation: {t} {x + y = x + y } z=x {z + y = x + y } z =z +y {z = x + y } {u = x + y } u=z (Implikation) (Zuweisung) (Zuweisung) (Zuweisung) Beispiele (Verzweigung) {ϕ ∧ B}c1 {ψ} {ϕ ∧ ¬B}c2 {ψ} {ϕ} if B then c1 else c2 {ψ} {t}P{y = x + 1} {t} {(x + 1 − 1 = 0 → 1 = x + 1) ∧ (x + 1 − 1 6= 0 → x + 1 = x + 1)} {(a − 1 = 0 → 1 = x + 1) ∧ (a − 1 6= 0 → a = x + 1)} a=x +1 if (a − 1 = 0)then {x = x + 1} y =1 {y = x + 1} else {a = x + 1} y =a {y = x + 1}