Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Programmkonstruktion keine Rolle, da die Nachbedingung die Wirkung eines Programmstücks festlegt und<br />
damit im Programm “zurückgerechnet” wird. Die “Vorwärtsrechnung” von <strong>der</strong> Vorbedingung (zumeist true)<br />
zur Nachbedingung wirkt ziellos, da die Vorbedingung keine Information über das Ziel in sich trägt.<br />
Bei all diesen Überlegungen wurden die folgenden Regeln ohne weitere Begründung verwendet:<br />
pre ⇒ pre’, { pre’} instruction { post}<br />
{ pre} instruction { post}<br />
{ pre} instruction { post’} , post’ ⇒ post<br />
{ pre} instruction { post}<br />
Verstärkung <strong>der</strong> Vorbedingung (VV)<br />
Abschwächung <strong>der</strong> Nachbedingung (AN)<br />
Abbildung 4.1: Verstärkungs- und Abschwächungsregeln für Programmbeweise<br />
Die Verstärkung <strong>der</strong> Vorbedingung bzw. die Abschwächung <strong>der</strong> Nachbedingung erlaubt uns, einen Programmbeweis<br />
in folgen<strong>der</strong> Form zu beschreiben:<br />
Programm Zusicherungen Prämissen<br />
{ pre} pre ⇒ pre’<br />
{ pre’}<br />
instruction<br />
{ post’} post’ ⇒ post<br />
{ post}<br />
Vor je<strong>der</strong> und nach je<strong>der</strong> Anweisung instruction steht eine Reihe von Zusicherungen, die sich von oben nach<br />
unten jeweils abschwächen. Am rechten Rand wird zusätzlich angegeben, warum diese Abschwächung zulässig<br />
ist. Das Lesen (und meist das Erzeugen) des Programmbeweises erfolgt dann von unten nach oben. Folgt<br />
oberhalb einer Zusicherung wie<strong>der</strong> eine Zusicherung, so beschreiben die Anmerkungen <strong>der</strong> oberen Bedingung,<br />
warum diese Verschärfung zulässig ist. Folgt eine Instruktion, so ist <strong>der</strong>en Vorbedingung über die jeweilige<br />
Regel für diesen Instruktionstyp z.B. über die schwächste Vorbedingung nachzuweisen.<br />
Zwei weitere Regeln sind sinnvoll, falls die Prädikate zu kompliziert werden:<br />
{ pre} instruction { post} , { pre’} instruction { post}<br />
{ pre ∨ pre’} instruction { post}<br />
Kombination <strong>der</strong> Vorbedingungen<br />
{ pre} instruction { post} , { pre} instruction { post’}<br />
{ pre} instruction { post ∧ post’}<br />
Kombination <strong>der</strong> Nachbedingungen<br />
Abbildung 4.2: Regeln für die Kombination von Zusicherungen in Programmbeweisen<br />
Diese beiden Regeln erlauben es, ein Programm einzeln für Teilzusicherungen zu prüfen. Die erste Regel<br />
gibt an, daß bei mehreren alternativen Vorbedingungen (pre ∨ pre’), die zweite Regel, daß bei mehreren<br />
Anfor<strong>der</strong>ungen (post ∧ post’) <strong>der</strong> Beweis einzeln geführt werden kann.<br />
Wir wollen nun im folgenden Abschnitt für alle Programmkonstrukte <strong>der</strong> Sprache Eiffel weitere formale Regeln<br />
angeben, die uns sagen, wie die Korrektheit einer komplexeren Anweisung aus Eigenschaften ihrer Bestandteile<br />
abgeleitet werden kann. Diese Regeln reichen aber noch nicht aus, um ein Programm zu beweisen. Hinzu<br />
kommen müssen die Regeln aus den jeweiligen Anwendungsgebieten. Soll etwas numerisch berechnet werden,<br />
so benötigen wir natürlich die Regeln <strong>der</strong> Arithmetik mit dem zusätzlichen Wissen über die Eigenschaften<br />
<strong>der</strong> Funktionen, die verwendet und berechnet werden sollen: z.B. a>b ⇒ ggt(a-b,b) = ggt(a,b). Diese<br />
Regeln werden im folgenden als bekannt vorausgesetzt, ohne <strong>der</strong>en Kalkül explizit anzugeben.<br />
Als Schlußbemerkung wollen wir noch anfügen, daß alle bisherigen Verifikationsmechanismen ausschließlich für<br />
Programme mit Copy-Semantik entwickelt wurden. Die Regeln, die wir im folgenden angeben werden, können