Beweisbar korrekte Software

Werbung
Beweisbar korrekte Software
eine praktische Einführung
Dominik Haneberg, Gerhard Schellhorn, Jonathan
Schmitt
1
Organisatorisches
Vorlesung:
Mittwoch
10.00 Uhr - 11.30 Uhr (1005 L1)
Versuche: (Raum 1006, 2 Termine wählen)
Freitag: 10.00 - 11.30 Uhr
Freitag: 11.45 - 13.45 Uhr
Freitag: 14.00 - 15.30 Uhr
Freitag: 15.45 - 17.30 Uhr
2
Anmeldung
• Maximal 40 Teilnehmer in Zweiergruppen
• Paarweise in die erste Liste in Zweiergruppen eintragen:
Ergibt Gruppennummer
• Zweite Liste: Unter der Gruppennummer aus den 4 möglichen Terminen
so viele wie möglich auswählen (nicht bloss 2!)
• Wir verteilen die Gruppen auf mögliche Termine (je 2 pro Gruppe)
• Bei zuvielen Teilnehmern: Los.
• Vorausgesetzt: Kenntnisse aus Logik-Vorlesung
Logik bestanden ⇒ bevorzugt
• Spätestens morgen: Welche Gruppennummer wann dran ist auf WWW
3
Prüfung
•
•
Anwesenheitspflicht in den Übungen!
Vorbereitung der Aufgaben anhand der Doku
• Abgabe der gelösten Aufgaben per Mail.
• 2 Mündliche Abnahmen im Semester in Zweiergruppen :
⋆ 1. Abnahme nach ca. 6 Wochen
(zu: Prädikatenlogik und Algebraische Spezifikationen)
⋆ 2. Abnahme am Ende
(Programmbeweisen und TL)
⋆ Mit: Testaufgaben (KIV) & Fragen zur Vorlesung
4
Schein und Sprechstunden
Schein
2 V + 4 Ü = 8 Creditpoints für den Bereich ”Softwaretechnik” oder für den
Bereich ”Theoretische Informatik”
Sprechstunden
Dominik Haneberg: Raum 2032, Tel. 2178
Gerhard Schellhorn: Raum 2002A, Tel. 2124
Jonathan Schmitt: Raum 2028, Tel. 2176
5
BKS: Ziel und Vorgehen
Ziel: Beweisbar korrekte Software
Vorgehen
1. Formale Spezifikation der Anforderungen
2. Validierung/Nachweis von Sicherheitseigenschaften
3. Programmierung
4. Beweis, dass Programm die Spezifikation erfüllt
Notwendig
Definition formaler Modelle und Aussagen ⇒ Logik
6
Verschiedene Logiken
• Aussagenlogik
• Prädikatenlogik (erster Stufe)
• Logiken höherer Stufe
• Hoare-Logik (imperative Programme)
• Dynamische Logik (imperative Programme)
• LCF (funktionale Programme)
• Temporallogik (parallele Programme)
• (Modallogik)
• (Nichtmonotone Logik)
7
Warum Beweise über Programme?
Fehler in Software sind eine nicht enden wollende Geschichte: Oft nur
ärgerlich, manchmal sehr teuer oder sogar lebensgefährlich!
• Gepäckverteilung Flughafen Denver (1994) und Terminal 5 London
Heathrow (2008)
• Ausfall des A340-Autopiloten
• Strahlentherapiesystem Therac-25
• Ariane 5 Explosion beim ersten Start
• Mars Climate Orbiter und Mars Polar Lander
• ...
8
Warum formale Beweise mit KIV?
These: Eine detaillierte Analyse des Programms von Hand genügt, um
seine Korrektheit nachzuweisen!
Problem
9
Warum formale Beweise mit KIV?
These: Eine detaillierte Analyse des Programms von Hand genügt, um
seine Korrektheit nachzuweisen!
Problem
Beweise für Software sind häufig sehr langwierig (viele Details) und daher
noch fehleranfälliger als die Programme selbst.
⇒ Systemunterstützung mit KIV
(andere Systeme: ACL2, Isabelle, PVS, . . . )
Durch die Systemunterstützung wird die korrekte Anwendung von
Kalkülregeln sichergestellt
9
Lernziele
• Erlernen des Umgangs mit KIV
• Formales Beweisen mit KIV
⋆ Umsetzen von Beweisen in einem Kalkül
⋆ Automatisierung durch Simplifikation und Heuristiken
⋆ Beweise für Datenstrukturen und Programme
• Strukturierte Spezifikation mit KIV
• Verschiedene Verfeinerungskonzepte um von abstrakten
Spezifikationen zu konkreten Programmen zu kommen
10
Praktische Anwendung
• Einsatz von KIV durch KIV-Experten in sicherheitskritischen
Anwendungen
• Einsatz von automatischen (spezialisierten) Tools:
⋆ Model Checking (HW-Design, eingebettete Systeme)
⋆ Bounded Model Checking, SAT checking (z. B. Security Protokolle)
⋆ Datenflussanalyse (z. B. MS Kernel Treiber im SLAM-Projekt).
⋆ predicative Abstraction und Typechecking (z. B. Nullpointer
Exceptions, SPEC#)
⋆ Entscheidungsprozeduren für Arithmetik (z .B. für Zeitconstraints bei
Echtzeitsystemen)
⋆ ...
• Systematisches Testen mit aus Spezifikationen generierten Testfällen
• Konstruktion von endlichen Gegenbeispielen (z. B. Alloy, MACE)
• Verwendung der Vorgehensmethodik (“UML, aber eine Nummer
präziser”)
11
Überblick
1.
2.
3.
4.
5.
6.
Aussagen- und Prädikatenlogik
Beweise über Datenstrukturen (Listen, Heaps)
Algebraische Spezifikationen
Programmbeweise (Hoare, while-Schleifen)
Data Refinement
Temporallogik & Parallele Programme
12
(2 Wochen)
(2.5 Wochen)
(1.5 Wochen)
(2 Wochen)
(2 Wochen)
(2 Wochen)
Prädikatenlogik
mit Sorten
und Sequenzenkalkül
13
Prädikatenlogik mit Sorten
• In Logik f. Inf.: n-stellige Funktionssymbole f ∈ F n
Semantik: n-stellige Funktion über Grundbereich D
• BKS: Gegeben ist eine endliche Menge S von Sorten.
Semantik: jede Sorte bezeichnet einen Grundbereich
• Funktionen jetzt: f ∈ Fs→s′ oder einfacher: f : s → s
wobei s = s1 , . . . , sn mit n ≥ 0 (n = 0 : Konstante c : s)
• Vorteile:
• Theorie:
• Praxis:
14
Prädikatenlogik mit Sorten
• In Logik f. Inf.: n-stellige Funktionssymbole f ∈ F n
Semantik: n-stellige Funktion über Grundbereich D
• BKS: Gegeben ist eine endliche Menge S von Sorten.
Semantik: jede Sorte bezeichnet einen Grundbereich
• Funktionen jetzt: f ∈ Fs→s′ oder einfacher: f : s → s
wobei s = s1 , . . . , sn mit n ≥ 0 (n = 0 : Konstante c : s)
• Vorteile:
⋆ pro Datentyp eine Sorte, damit Typcheck wie in Prog.Sprachen
⋆ später: leichte Erweiterbarkeit zu Higher-Order-Logik
• Theorie: Sorten können in Prädikate codiert werden
• Praxis: ohne Sorten zusätzliche Axiome und Deduktion notwendig!
(Z. B. nat(x) ∧ nat(y ) → nat(x + y ))
• Es gibt immer eine vordefinierte Sorte bool.
14
Die Sorte bool: Formeln sind auch Terme!
• Mit einer vordefinierten Sorte bool wird es möglich,
Formeln und Terme der Sorte bool zu identifizieren
• Logische Operatoren sind jetzt vordefinierte boolesche Funktionen:
. ∧ ., . ∨ ., . → ., . ↔ . : bool × bool → bool
¬ . : bool → bool
true, false : bool
• Formeln ϕ, ψ und Terme t heissen jetzt Ausdrücke e
• Prädikate sind einfach Funktionen mit Zielsorte bool
• Funktionen und Prädikate heissen jetzt Operationen OP
15
Signaturen und Variablen
Eine Signatur Σ = (S, OP ) ist ein Paar mit:
• Endlicher Menge S von Sorten, mit bool ∈ S
• Endlicher Familie
[
OP =
OP s→s′
s∈S ∗ ,s′ ∈S
von Operationssymbolen mit Argumentsorten s und
Ergebnissorte s′ (leere Liste von Argumentsorten: Konstante c)
• OP enthält immer die üblichen booleschen Operationen
• Wie üblich: Konstanten sind null-stellige Operationen
• Boolesche Konstanten = atomare Aussagen
Eine Variablenmenge X besteht aus einer abzählbar unendlichen Menge
von Variablen Xs für jede Sorte s ∈ S
16
Syntax von Ausdrücken
Ausdrücke e ∈ EXPR s (Σ, X) der Sorte s ∈ S über der Signatur Σ und über
den Variablen X sind rekursiv definiert durch
• x aus Xs ist ein Ausdruck der Sorte s
• Sind e1 , . . . , en Ausdrücke der Sorten s1 , . . . , sn und op : s1 , . . . , sn → s′ ,
dann ist op(e1 , . . . , en ) ein Ausdruck der Sorte s′
• Bem.: Schreibe c statt c() für Konstanten (n = 0)
• Sind e1 , e2 Ausdrücke der Sorte s, so ist
e1 = e2 eine Formel (i. e. ein Ausdruck der Sorte bool )
• Ist ϕ eine Formel, und x eine Variable, so sind
∀ x.ϕ und ∃ x.ϕ Formeln
EXPR(Σ, X) :=
S
s∈S
EXPR s (Σ, X), For (Σ, X) := EXPR bool (Σ, X)
Terme t ∈ T (Σ, X) sind Ausdrücke ohne Quantoren und Gleichheit.
17
KIV-Syntax für Signaturen
sorts nat;
list;
constants 0 : nat;
ϕ : bool; (: 0-stelliges Prädikat als boolesche Konstante :)
functions f : nat × nat → nat;
g : nat, nat -> nat;
(: es geht auch ASCII :)
predicates isprime : nat;
. < . : nat × nat;
variables x,y : nat;
u : list;
• Sorten, Funktionen, Prädikate, Variablen immer in dieser Reihenfolge
• Aufzählungen mit derselben Sorte nur bei Variablen
18
KIV: Infix-Schreibweise und Bindungsstärken
• Signatur: . ⊕ . : s1 × s2 → s,
s1 , s2 , s ∈ S
• Üblich: ⊕ besteht aus Sonderzeichen, z. B. +, ∗, <, /, ⊕, ∈, ≥
• Term (t1 ⊕ t2 )
• Infix-Funktionssymbole in KIV können priorisiert werden
(∗ bindet stärker als +)
• Es gibt auch Postfix (z. B. für Fakultät “. !”) und Präfix (für Anzahl der
Elemente: # ∅ = 0)
Bindungsstärken
{postfix} > {präfix} > {infix} > {¬} > {∧} > {∨} > {→} > {↔} > {∀, ∃}
Außenklammern werden weggelassen,
Aufzählungen mit ∧, ∨ ungeklammert.
19
Sequenzenkalkül
• Erfunden von Gerhard Gentzen (1934)
• Nur einer von vielen möglichen Kalkülen:
Hilbertkalkül, natürliches Schliessen, Tableaukalkül, Modellelimination
• Charakteristik: versucht, Beweisziel auf Axiome zu reduzieren
(schrittweise Vereinfachung des Problems); am menschlichen
Beweisen orientiert
ϕ1 , . . . , ϕn ⊢ ψ1 , . . . , ψm
ϕ1 , . . . , ϕn
ψ 1 , . . . , ψm
Sequenz
Antezedent (n ≥ 0)
Sukzedent (m ≥ 0)
Beachte: “⊢” ist Sequenzenpfeil, “⊢PL ” ist Ableitbarkeit
20
Notation
Γ, Γ1 , ∆, . . . Listen von Formeln,
Γ = ϕ1 , . . . , ϕn , ∆ = ψ1 , . . . , ψm
Γ ⊢ ∆ := ϕ1 , . . . , ϕn ⊢ ψ1 , . . . , ψm
Γ, ϕ ⊢ ψ := ϕ1 , . . . , ϕn , ϕ ⊢ ψ
Γ, ϕ ∧ ψ, ∆ ⊢ := ϕ1 , . . . , ϕn , ϕ ∧ ψ, ψ1 , . . . , ψm ⊢
^
[ϕ1 , . . . , ϕn ] := ϕ1 ∧ . . . ∧ ϕn
_
^
[] := true
[ψ1 , . . . , ψm ] := ψ1 ∨ . . . ∨ ψm
_
[] := false
Bedeutung einer Sequenz: Γ ⊢ ∆ =
V
21
Γ→
W
∆
Sequenzenkalkül: Inferenzregeln
Regel: (n ≥ 0)
Γ1 ⊢ ∆1
Γ2 ⊢ ∆2
Γ⊢∆
...
Γn ⊢ ∆n
• Regeln werden von unten nach oben gelesen:
Um Γ ⊢ ∆ (die Konklusion) zu beweisen, beweise stattdessen
einfachere Prämissen Γ1 ⊢ ∆1 , . . . , Γn ⊢ ∆n
• Bei n = 0 ist die Konklusion direkt bewiesen
• n = 1: Vereinfachung
• n = 2: Fallunterscheidung
22
Beispiel
Ein erster Beweis.
23
Sequenzenkalkül: Ableitbarkeit
Γ ⊢ ∆ ist aus einer Menge von Formeln (Axiomen) Ax ableitbar
(kurz: Ax ⊢PL Γ ⊢ ∆)
:⇔ Es gibt eine Ableitung (Baum) mit
• Wurzel: Γ ⊢ ∆ (Konklusion)
• Blätter: ⊢ ϕ mit ϕ ∈ Ax (Prämissen)
• Innere Knoten durch Regelanwendungen gebildet
24
Kalkül für Aussagenlogik
ϕ, Γ ⊢ ϕ, ∆
(axiom)
false, Γ ⊢ ∆
Γ′ ⊢ ∆′
(weakening, Γ′ ⊆ Γ, ∆′ ⊆ ∆)
Γ⊢∆
(false left)
Γ ⊢ ϕ, ∆
ϕ, Γ ⊢ ∆
(cut formula)
Γ⊢∆
Γ ⊢ ϕ, ∆
(negation left)
¬ ϕ, Γ ⊢ ∆
ϕ, ψ, Γ ⊢ ∆
ϕ ∧ ψ, Γ ⊢ ∆
ϕ, Γ ⊢ ∆
ψ, Γ ⊢ ∆
ϕ ∨ ψ, Γ ⊢ ∆
Γ ⊢ ϕ, ∆
ψ, Γ ⊢ ∆
ϕ → ψ, Γ ⊢ ∆
Γ ⊢ true, ∆
(true right)
ψ, Γ ⊢ ∆
(negation right)
Γ ⊢ ¬ ψ, ∆
(conjunction left/right)
Γ ⊢ ϕ, ∆
Γ ⊢ ψ, ∆
Γ ⊢ ϕ ∧ ψ, ∆
(disjunction left/right)
Γ ⊢ ϕ, ψ, ∆
Γ ⊢ ϕ ∨ ψ, ∆
(implication left/right)
ϕ, Γ ⊢ ψ, ∆
Γ ⊢ ϕ → ψ, ∆
Γ ⊢ ϕ, ψ, ∆ ϕ, ψ, Γ ⊢ ∆
ϕ, Γ ⊢ ψ, ∆ ψ, Γ ⊢ ϕ, ∆
(equivalence left/right)
ϕ ↔ ψ, Γ ⊢ ∆
Γ ⊢ ϕ ↔ ψ, ∆
25
Regeln für Quantoren und Gleichungen
ϕτx , ∀ x.ϕ, Γ ⊢ ∆
(all left)
•
∀ x.ϕ, Γ ⊢ ∆
Γ ⊢ ϕτx , ∃ x.ϕ, ∆
(exists right)
Γ ⊢ ∃ x.ϕ, ∆
ϕyx , Γ ⊢ ∆
(exists left)
•
∃ x.ϕ, Γ ⊢ ∆
Γ ⊢ ϕyx , ∆
(all right)
Γ ⊢ ∀ x.ϕ, ∆
ϕτx die Substitution von x durch einen beliebigen Term τ in ϕ.
y ist eine neue Variable, i. e. eine die nicht frei in Q x.ϕ, Γ, ∆ (Q ∈ {∀, ∃})
vorkommt.
Genauer: y 6∈ (free(ϕ)\{x}) ∪ free(Γ) ∪ free(∆)
•
Γ ⊢ τ = τ, ∆
x = τ, Γτx ⊢ ∆τx
(insert equation)
x = τ, Γ ⊢ ∆
(reflexivity right)
26
Variablen und freie Variablen eines Ausdrucks
Die Variablen eines Ausdrucks (Var (e))
Var (x)
Var (op(t1 , . . . , tn ))
Var (e = e′ )
Var (Qx.ϕ)
=
=
=
=
{x}
x∈X
Sn
i=1 Var (ti )
Var (e) ∪ Var (e′ )
{x} ∪ Var (ϕ)
Q ∈ {∀, ∃}
Die freien Variablen einer Formel (free(ϕ)) sind genauso definiert ausser:
free(Qx.ϕ) = free(ϕ) \ {x} Q ∈ {∀, ∃}
27
Substitution
Die Substitution einer Variablen x durch einen Ausdruck t in e (etx )
xtx
= t
yxt
= y
falls x 6= y
op(e1 , . . . , en )tx = op((e1 )tx , . . . , (en )tx )
(e1 = e2 )tx
(Qy.ϕ)tx
= (e1 )tx = (e2 )tx )
=


Qy.ϕ




 Qy.ϕt






x
Qz.(ϕzy )tx
falls y = x ∨ x 6∈ free(ϕ)
falls y 6= x, y 6∈ free(t), x ∈ free(ϕ)
falls y 6= x, y ∈ free(t), x ∈ free(ϕ)
(z neu, d. h. z 6∈ Var (ϕ) ∪ Var (t))
(Q ∈ {∀, ∃})
28
KIV: Organisation in Projekte
Grundlegende Organisation:
• In KIV arbeitet man in (SW-Entwicklungs-) Projekten
• Jedes Projekt definiert Spezifikationen (Σ + Ax + Weiteres)
• Spezifikationen können aufeinander aufbauen
⇒ Entwicklungsgraph
• Über jeder Spezifikation kann man Theoreme formulieren und
beweisen
29
KIV: Projektauswahl- und Projektebene
4 Ebenen:
1. Projektauswahlebene
• Projekte anlegen, löschen, auf einem Projekt arbeiten
2. Projektebene
• Zeigt den Entwicklungsgraph der Spezifikationen
• Spezifikationen anlegen, ändern, löschen
• Auf einer Spezifikation arbeiten
30
KIV: Spezifikations- und Beweisebene
3. Spezifikationsebene
⋆ Theoreme anlegen, ändern, löschen
⋆ Einen Beweis führen
4. Beweisebene
⋆ Beweise führen durch interaktive Anwendung von Regeln
⋆ Zwei Regelsätze: Basisregeln/für’s Beweisen optimierte Regeln
⋆ Backtracking, Pruning
⋆ Simplifikation + Heuristiken zur automatischen Anwendung von
Regeln
31
KIV: Verzeichnisstruktur
Verzeichnisstruktur:
• Ein Projektverzeichnis <projektname>
⋆ Darin:
− Ein Unterverzeichnis specs
− [Eine Datei devgraph für den Entwicklungsgraph]
• In specs: ein Unterverzeichnis <specname> für jede Spezifikation
⋆ Darin:
− Eine Datei specification für Signatur, Axiome etc.
− Eine Datei sequents für Theoreme
− [Ein Verzeichnis proofs das geladene Theoreme, geführte
Beweise etc. speichert]
32
Herunterladen