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.
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ß.