Verifikations- und Spezifikationsmethoden

Werbung
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}
Herunterladen