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.
Der vollständige Korrektheitsbeweis ergibt sich direkt aus einer Umsetzung des obigen Argumentes und<br />
ist daher nicht mehr sehr schwer. Darüber hinaus ist <strong>der</strong> Algorithmus auch viel effizienter. Die Anzahl<br />
<strong>der</strong> Rechenschritte für Folgen <strong>der</strong> Länge n liegt nun in <strong>der</strong> Größenordnung von n – also nur etwa 300<br />
für Folgen <strong>der</strong> Länge 100.<br />
Das obige Beispiel zeigt, daß man durch das Prinzip, den Beweis als Leitlinie zur Implementierung zu verwenden,<br />
zu erheblich effizienteren und auch leichter zu verifizierenden Lösungen kommt. 46 Am folgenden Beispiel<br />
wollen wir nun demonstrieren, daß manche Probleme überhaupt nicht gelöst werden können, wenn man sich<br />
nicht zuvor eine Beweisidee zurechtlegt.<br />
Beispiel 4.5.3 (Das Kaffebohnen Problem)<br />
In einer Kaffedose befinden sich helle und dunkle Kaffebohnen. Aus dieser greife man sich zufällig zwei<br />
Bohnen heraus. Sind sie gleich, so werden beide herausgenommen und eine dunkle wie<strong>der</strong> hineingetan<br />
(es sind genügend dunkle Bohnen vorhanden). Sind sie unterschiedlich, so wird die helle zurückgelegt<br />
und die dunkle herausgenommen. Das Ganze wird wie<strong>der</strong>holt, bis nur noch eine Bohne in <strong>der</strong> Dose ist.<br />
Die Frage lautet nun, wie die Anzahl <strong>der</strong> hellen und dunklen Bohnen damit zusammenhängt, welche<br />
Farbe die letze Bohne hat. Was bleibt z.B. übrig, wenn ursprünglich 43 helle und 32 dunkle Bohnen in<br />
<strong>der</strong> Dose waren?<br />
Nach einigen Versuchen stellt sich heraus, daß Experimente bei <strong>der</strong> Beantwortung dieser Frage überhaupt<br />
nicht weiterhelfen. Es gibt Leute, die Stunden damit vergeudet haben, die verschiedensten Kombinationen<br />
durchzuprobieren, ohne zu einem tragfähigen Ergebnis zu kommen. 47<br />
Das einzige, was hier weiter hilft, ist die Überlegung, daß es irgendeine Eigenschaft geben muß, die durch<br />
das Herausnehmen <strong>der</strong> Bohnen nicht verän<strong>der</strong>t wird, also invariant bleibt. Diese Eigenschaft, zusammen<br />
mit <strong>der</strong> Tatsache, daß nur eine Bohne übrigbleibt, kann dann die Antwort geben.<br />
Nun, in jedem Zug verschwinden entwe<strong>der</strong> zwei helle Bohnen aus <strong>der</strong> Dose o<strong>der</strong> keine und entwe<strong>der</strong><br />
verschwindet eine dunkle Bohne o<strong>der</strong> es kommt eine hinzu. Nach einigem Nachdenken fällt auf, daß<br />
Zwei und Null jeweils gerade Zahlen sind. Das bedeutet, daß bei einer geraden Anzahl von hellen Bohnen<br />
nach einem Zug wie<strong>der</strong> eine geraden Anzahl von hellen Bohnen in <strong>der</strong> Dose liegt und ähnliches für eine<br />
ungerade Anzahl gilt. Die Eigenschaft, ob eine gerade o<strong>der</strong> ungerade Anzahl heller Bohnen vorhanden<br />
ist, bleibt also bei jedem Zug unverän<strong>der</strong>lich.<br />
Als Konsequenz wissen wir nun, daß zum Schluß genau dann eine dunkle Bohne übrigbleibt, wenn zu<br />
Beginn eine gerade Anzahl von hellen Bohnen in <strong>der</strong> Dose war.<br />
Beide Beispiele zeigen, wie wichtig es ist, die Eigenschaften <strong>der</strong>jenigen Objekte zu kennen, mit denen das<br />
Programm zu tun haben soll. Je mehr Zusammenhänge man formulieren kann, um so größer ist die Chance,<br />
ein gutes und effizientes Programm zu schreiben.<br />
Entwurfsprinzip 4.5.4<br />
Mache Dir die Eigenschaften <strong>der</strong> Objekte klar, die von einem Programm manipuliert werden sollen.<br />
Auch wenn wir die Bedeutung von Korrektheitsbeweisen beson<strong>der</strong>s hervorheben, sei dennoch darauf hingewiesen,<br />
daß eine vollständige Formalisierung <strong>der</strong> Beweise in einem Kalkül meist we<strong>der</strong> notwendig noch<br />
erstrebenswert ist, solange keine Werkzeuge zur Unterstützung des Kalküls bereitstehen. Zu viel Formalismus<br />
führt dazu, daß die wesentlichen Ideen in einem Übermaß an unverständlichen Details verlorengehen.<br />
46Man mag hier natürlich einwenden, daß man eventuell auch auf an<strong>der</strong>en Wegen zu einer ähnlich guten Lösung gekommen<br />
wäre. Ich persönlich halte dies aber für sehr unwahrscheinlich.<br />
47Dies sagt auch etwas aus über die Aussagekraft von Tests bei <strong>der</strong> Analyse von Programmen. Man kann Tausende von<br />
Testläufen durchführen ohne dadurch eine sichere Aussage über die Korrektheit des Programms zu gewinnen. Man kann mit<br />
Tests oft nicht einmal den Gründen für die Fehler auf die Spur kommen, die man am äußeren Verhalten bereits entdeckt hat.