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.

Die Bedeutung einer solchen Schleife ist die folgende: zunächst werden die Initialanweisung(en) im from-Teil<br />

ausgeführt 28 und anschließend die Schleifenanweisung(en) zwischen loop und end solange wie<strong>der</strong>holt, bis die<br />

im until-Teil genannte Abbruchbedingung erfüllt ist. Ist diese bereits nach <strong>der</strong> Initialanweisung erfüllt, dann<br />

wird die Schleifenanweisung überhaupt nicht ausgeführt. Die Anweisungen dürfen dabei wie immer beliebig<br />

komplex o<strong>der</strong> auch leer sein (was aber nur im Falle <strong>der</strong> Initialanweisung Sinn macht).<br />

Mit dem Schleifenkonstrukt sind wir nun in <strong>der</strong> Lage, das noch fehlende Programmstück aus Beispiel 4.3.8 –<br />

die Implementierung von “fakultäts-berechnung” – anzugeben<br />

from Result := 1 ; n := 1<br />

until n>=arg<br />

loop<br />

n := n+1;<br />

Result := Result*n<br />

end<br />

Dabei muß die lokale Variable n zuvor in <strong>der</strong> Funktion fakultät mit local n:INTEGER vereinbart werden.<br />

Schleifen sind (neben Routinen) bei <strong>der</strong> Implementierung das mächtigste Handwerkzeug, da sie erlauben,<br />

bestimmte Anweisungsfolgen beliebig oft durchführen zu lassen. An<strong>der</strong>erseits machen Schleifen es aber auch<br />

erheblich schwerer, das Verhalten eines Programmes präzise zu beschreiben, wenn man nicht extrem sorgfältig<br />

programmiert. Dadurch, daß die Anzahl <strong>der</strong> Wie<strong>der</strong>holungen <strong>der</strong> Schleifenanweisungen erst während <strong>der</strong><br />

Laufzeit – nämlich nach Beendigung – <strong>der</strong> Schleife bestimmt werden kann, ist das Verhalten von Schleifen<br />

weniger geradlinig als das von zusammengesetzten o<strong>der</strong> bedingten Anweisungen. Es ist nicht einmal gesichert,<br />

ob die Schleife überhaupt jemals beendet wird. Deshalb muß man bei <strong>der</strong> Verifikation von Programmen, die<br />

Schleifen enthalten, zwei Fragen beantworten.<br />

Bricht die Schleife jemals (geplant) ab? (Terminierung)<br />

Wenn sie endet, erfüllt sie ihre Nachbedingung? (Partielle Korrektheit)<br />

Für den Beweis <strong>der</strong> Terminierung hat sich folgen<strong>der</strong> Gedankengang bewährt. Wenn eine Schleife nach einer<br />

Anzahl von Schritten terminiert, dann wird bei jedem Schleifendurchlauf die Anzahl <strong>der</strong> noch ausstehenden<br />

Schleifendurchläufe um eins kleiner. Im Prinzip läßt sich also die Anzahl <strong>der</strong> noch ausstehenden Schleifendurchläufe<br />

durch einen Integer-Ausdruck beschreiben, <strong>der</strong> von allen möglichen in die Schleife verwickelten<br />

Parametern abhängt und bei jedem Schleifendurchlauf geringer wird.<br />

Den genauen Ausdruck zu finden ist jedoch im allgemeinen zu schwierig. Stattdessen behilft man sich mit einer<br />

Näherungslösung. Es genügt ja, einen an<strong>der</strong>en, etwas groberen Zusammenhang durch einen Integer-Ausdruck<br />

zu beschreiben, <strong>der</strong> – wie die Anzahl <strong>der</strong> noch ausstehenden Schleifendurchläufe – stets größer gleich Null ist,<br />

wenn die Abbruchbedingung nicht erfüllt ist, und bei jedem Schleifendurchgang mindestens um eins kleiner<br />

wird. Wenn man diesen Ausdruck – die sogenannte Variante <strong>der</strong> Schleife – finden und die obengenannten<br />

Eigenschaften beweisen kann, dann ist gezeigt, daß die Schleife abbrechen muß . 29<br />

Für die partielle Korrektheit gilt folgende Überlegung. Will man über das Ergebnis einer Schleife nach <strong>der</strong><br />

Terminierung etwas aussagen, so muß man eine Programmeigenschaft formulieren, die nur von den in die<br />

Schleife verwickelten Variablen abhängt und nach jedem Schleifendurchgang gültig ist. Da aber die Anzahl<br />

<strong>der</strong> Schleifendurchgänge im voraus nicht feststeht, muß man die Gültigkeit dieser Eigenschaft durch eine Art<br />

Induktion beweisen. Dies aber geht nur, wenn man die Eigenschaft so formuliert, daß sie vor dem Beginn <strong>der</strong><br />

eigentlichen Schleife wahr ist (Induktionsanfang) und nach einem einmaligen Schleifendurchlauf immer dann<br />

wahr ist, wenn sie vorher gültig gewesen war (Induktionsschritt). Man sagt daher, daß die Programmeigenschaft<br />

gegenüber einer Schleifendurchführung invariant ist, da sie sich bei dem Durchgang nicht än<strong>der</strong>t.<br />

28 Man hätte beim Entwurf von Eiffel natürlich auch auf den from-Teil verzichten können, da die Initialanweisung ja einfach vor<br />

<strong>der</strong> Schleife genannt werden könnte. Die Verwendung des from sorgt jedoch dafür, daß Anweisungen, <strong>der</strong>en Sinn ausschließlich<br />

in <strong>der</strong> Bereitstellung gewisser Anfangsbedingungen für eine Schleife liegt, auch dieser Schleife zugeordnet werden sollten.<br />

29 Das mathematische Argument, das man üblicherweise mit Wohlordnungen beweist ist grob gesagt das folgende: Ein endlicher<br />

Wert, <strong>der</strong> bei jedem Schleifendurchgang mindestens um eins kleiner wird, wird irgendwann einmal negativ. Dies aber ist nur<br />

möglich, wenn die Abbruchbedingung erfüllt ist, da er an<strong>der</strong>nfalls nach Voraussetzung größer gleich Null sein muß.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!