Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Definition 4.2.3 (Korrektheit von Routinen)<br />
1. Ist r eine Routine, so bezeichnet prer die Vorbedingung von r, postr die Nachbedingung von r und Br<br />
den Anweisungsteil (Body) von r.<br />
Die gültigen Argumente von r sind alle Werte, die für die formalen Argumente unter Einhaltung <strong>der</strong><br />
Typbedingungen eingesetzt werden dürfen.<br />
2. Eine Routine r heißt genau dann (total) korrekt, wenn für alle gültigen Argumente xr <strong>der</strong> Satz<br />
{ prer(xr)} Br { postr(xr)}<br />
ein wahrer Satz des Kalküls für Programmbeweise ist.<br />
Ebenso läßt sich nun auch die Korrektheit einer ganzen Klasse präzise definieren. Eine Klasse K ist genau<br />
dann korrekt, wenn ihre durch die Anweisungsteile <strong>der</strong> Routinen gegebene Implementierung mit <strong>der</strong> durch<br />
Invariante, Vor- und Nachbedingungen gegebenen Spezifikation konsistent ist.<br />
Definition 4.2.4 (Korrektheit von Klassen)<br />
Eine Klasse K mit Invariante INV heißt genau dann korrekt, wenn gilt<br />
1. Für jede exportierte Routine r von K und alle gültigen Argumente xr ist <strong>der</strong> Satz<br />
{ INV ∧ prer(xr)} Br { INV ∧ postr(xr)}<br />
ein wahrer Satz des Kalküls für Programmbeweise.<br />
2. Bezeichnet DefaultK die Zusicherung, daß alle Attribute von K die Initialwerte ihrer Typen tragen,<br />
so gilt für jede Initialisierungsprozedur i von K und alle gültigen Argumente xi <strong>der</strong> Satz<br />
{ DefaultK ∧ prei(xi)} Bi { INV ∧ posti(xi)}<br />
Gibt es keine Initialisierungsprozedur, so bedeutet die zweite Bedingung schlicht, daß DefaultK die Invariante<br />
INV impliziert, d.h. daß alle Initialwerte die Invariante erfüllen.<br />
Die Notation des Hoare-Kalküls erlaubt es, schrittweise Aussagen über die Wirkungen einzelner und durch<br />
Programmkonstrukte zusammengesetzter Anweisungen als mathematischen Satz eines formalen Kalküls zu<br />
formulieren und zu beweisen. Zur Formulierung steht uns die volle Sprache <strong>der</strong> Prädikatenlogik, ergänzt um<br />
boolesche Ausdrücke von Eiffel, zur Verfügung und zum Beweis <strong>der</strong> Ableitungskalkül <strong>der</strong> Prädikatenlogik<br />
(Seite 49), ergänzt um Regeln für jedes einzelne Programmierkonstrukt. Letztere werden wir im Detail in<br />
Sektion 4.3 besprechen, wenn wir die verschiedenen Programmierkonstrukte von Eiffel vorstellen.<br />
4.2.2 Ein Kalkül für Verifikation<br />
Die obige Definition <strong>der</strong> Wahrheit von Sätzen des Kalküls für Programmbeweise ist für die Durchführung von<br />
Beweisen unhandlich, da sie die Auswertung <strong>der</strong> Semantik benötigt, was im allgemeinen sehr aufwendig ist.<br />
Aus diesem Grunde hat man – analog zur Prädikatenlogik – einen Ableitungskalkül entwickelt, durch den die<br />
Beweisführung auf die Anwendung formaler syntaktischer Manipulationen (Beweisregeln) reduziert werden<br />
kann. Die konkreten Regeln lassen sich aus <strong>der</strong> genauen Definition <strong>der</strong> Semantik beweisen, was aber nicht<br />
Thema dieser Einführungsveranstaltung sein soll.<br />
Ein weiterer Zweck dieses Kalküls ist es, eine allgemein akzeptable Prüfung zu erlauben, ob für einen vorgegebenen<br />
Programmteil instructions die Korrektheit bezüglich seiner Spezifikation durch pre und post<br />
garantiert ist. Dies ist sinnvoll für Gruppen, die nicht in die Entwicklung involviert sind, wie zum Beispiel<br />
die innerbetrieblichen Qualitätskontrolle o<strong>der</strong> den TÜV, <strong>der</strong> in den kommenden Jahren immer mehr für eine<br />
außerbetriebliche Softwarekontrolle eingesetzt werden soll. Diese Gruppen interessieren sich nicht für den<br />
Entwicklungsprozeß, son<strong>der</strong>n nur für die Korrektheit des Ergebnisses. Für die Entwickler selbst ist die Trennung<br />
von Programmentwicklung und Verifikation unsinnig, da hierbei zweimal über dasselbe Programmstück<br />
nachgedacht werden muß. 14