22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!