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.
Um diese Bestandteile deutlich genug vom Programmtext abzugrenzen, hat sich eingebürgert, sie in geschweifte<br />
Klammern zu setzen. Bei einer einfachen Folge von Anweisungen sähe dann ein durch logische Bestandteile<br />
ergänztes Programm wie folgt aus<br />
.<br />
is -require<br />
pre<br />
do { pre}<br />
Anweisung1; { Aussage1}<br />
Anweisung2; { Aussage2}<br />
.<br />
Anweisungn<br />
ensure post<br />
end<br />
{ post}<br />
Aussage1 ist dabei zugleich die Nachbedingung von Anweisung1 als auch die Vorbedingung von Anweisung2.<br />
Ähnliches gilt für Aussage2, Aussage3 usw. pre ist als Vorbedingung <strong>der</strong> ganzen Routine insbeson<strong>der</strong>e<br />
auch Vorbedingung von Anweisung1, post als Nachbedingung <strong>der</strong> ganzen Routine auch Nachbedingung von<br />
Anweisungn. Wir haben bei dieser Vorgehensweise die Schreibweise des sogenannten Hoare-Kalküls verwendet.<br />
Definition 4.2.1 (Notation des Hoare-Kalküls)<br />
Die Schreibweise { pre} instruction { post} ,<br />
bezeichnet einen Satz des Kalküls für Programmbeweise.<br />
Er ist wahr genau dann, wenn pre eine Vorbedingung dafür ist, daß die Anweisung instruction<br />
terminiert und daß nach Ausführung von instruction die Aussage post gilt.<br />
Für die Aussagen pre und post sind Ausdrücke <strong>der</strong> Prädikatenlogik erlaubt, ergänzt um die Zusicherungssprache<br />
von Eiffel. instruction muß eine korrekte Eiffel Anweisung sein.<br />
{ pre} instruction { post} besagt also, daß die Berechnung <strong>der</strong> Anweisung instruction immer zu einem<br />
Ergebnis führt (terminiert) und daß im Anschluß daran die Aussage post gilt, vorausgesetzt, daß vor<br />
<strong>der</strong> Ausführung von instruction die Aussage pre gültig war. Ist dies nicht <strong>der</strong> Fall, so wird gemäß den<br />
üblichen Regeln <strong>der</strong> logischen Implikation überhaupt nichts gefor<strong>der</strong>t. Die Anweisung braucht nicht einmal<br />
zu terminieren. Die Anweisung instruction darf auch eine komplexere Anweisung (ein Compound gemäß <strong>der</strong><br />
Syntaxbeschreibung in Abschnitt 4.3.12.1) sein.<br />
Beispiel 4.2.2<br />
Ein einfacher wahrer Satz des Kalküls für Programmbeweise ist<br />
{ x=0 ∧ y≥4} x:=y+3; y:=y-4 { x≥5 ∧ y≥0}<br />
An diesem Beispiel sieht man, daß Vor- und Nachbedingungen nicht unbedingt “optimal” sein müssen.<br />
Nach Ausführung von x:=y+3 wissen wir nämlich sogar, daß x≥7 gilt. Die Nachbedingung ist also<br />
schwächer als das, was wir beweisen könnten, – o<strong>der</strong> die Vorbedingung ist stärker als das, was wir<br />
benötigen.<br />
Die Terminierungsbedingung in Definition 4.2.1 ist wichtig, weil es durchaus <strong>der</strong> Fall sein kann, daß die<br />
Berechnung von Anweisungen, die Schleifen enthalten, bei bestimmten Eingaben niemals endet. In diesem<br />
Fall kann man natürlich auch keine Nachbedingung mehr beweisen. Deswegen unterscheidet man auch zwei<br />
Formen von Korrektheit einer Anweisung mit Vorbedingung pre und Nachbedingung post. Verlangt man, daß<br />
{ pre} instruction { post} wahr ist im Sinne <strong>der</strong> Definition 4.2.1, so spricht man von totaler Korrektheit.<br />
Schwächt man die Definition dahingehend ab, daß aus <strong>der</strong> Vorbedingung pre nicht die Terminierung <strong>der</strong><br />
Anweisung folgen muß, und post nur gelten muß, wenn pre gilt und die Anweisung terminiert, dann spricht<br />
man von partieller Korrektheit.<br />
Da aus Terminierung und partieller Korrektheit die totale Korrektheit folgt, hat es sich für die Beweisführung<br />
als zweckmäßig herausgestellt, den Beweis <strong>der</strong> Terminierung von dem <strong>der</strong> partiellen Korrektheit zu trennen.