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.
from Init invariant Inv variant Var until Abbruch loop Anweisung end<br />
nie<strong>der</strong>zuschreiben, weil dies die Verwendung <strong>der</strong> Verifikationsregel erheblich erleichtert. Abbildung 4.11 faßt<br />
alle Komponenten dieser Regel zusammen.<br />
{ pre} Init { Inv ∧ Var≥0} ,<br />
{ Inv ∧ ¬Abbruch ∧ Var≥0 ∧ Var=x} Anweisung { Inv ∧ Var≥0 ∧ Var0} fakultäts-berechnung { Result=arg!}<br />
Result=arg! ist die gewünschte Nachbedingung. Sie muß nun mithilfe von Wissen über die Ordnung<br />
<strong>der</strong> natürlichen Zahlen an die Form Inv ∧ Abbruch, also die Nachbedingungsform <strong>der</strong> Schleife, angepaßt<br />
werden. Dabei geht natürlich schon eine gewisse Vorstellung über die vorgesehene Berechnung <strong>der</strong><br />
Fakultät mit ein, nämlich daß wir die Fakultät durch eine schrittweise Annäherung <strong>der</strong> Eingabe arg<br />
durch eine Zahl n von unten bestimmen und versuchen, in jedem Durchlauf die Eigenschaft Result=n!<br />
zu garantieren. Für n=arg ist dann Result=arg!. Wir spalten nun noch n=arg auf in n≤arg ∧ n≥arg,<br />
um eine mögliche Abbruchbedingung für die Annäherung von unten zu beschreiben und erhalten als<br />
äquivalente Beschreibung für die gewünschte Nachbedingung<br />
Result=arg! ≡ Result=n! ∧ n≤arg ∧ n≥arg<br />
Dies ist <strong>der</strong> eigentlich kreative Anteil an <strong>der</strong> Programmentwicklung. Die Abbruchsbedingung n≥arg<br />
und die Invariante Result=n! ∧ n≤arg sind somit festgelegt und müssen nun bei <strong>der</strong> weiteren Entwicklung<br />
eingehalten werden. Gemäß <strong>der</strong> Verifikationsregel für Schleifen müssen wir nun noch eine<br />
Initialanweisung Init festlegen mit <strong>der</strong> Eigenschaft<br />
{ arg>0} Init { Result=n! ∧ n≤arg}<br />
und eine Schleifenanweisung Anweisung mit<br />
{ Result=n! ∧ n≤arg ∧ ¬(n≥arg)} Anweisung { Result=n! ∧ n≤arg}<br />
o<strong>der</strong> vereinfacht<br />
{ Result=n! ∧ n