20.01.2015 Aufrufe

Skript (Fassung vom 4.4.2011) - Lehr- und Forschungsgebiet ...

Skript (Fassung vom 4.4.2011) - Lehr- und Forschungsgebiet ...

Skript (Fassung vom 4.4.2011) - Lehr- und Forschungsgebiet ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Folgende Fragestellungen sind typisch bei der Programmanalyse <strong>und</strong> -verifikation <strong>und</strong><br />

in der Vorlesung werden wir Techniken kennen lernen, um diese Fragen automatisch zu<br />

untersuchen:<br />

• Ist das Resultat eines Programms immer eindeutig (Konfluenz)<br />

Die Frage ist hierbei, ob man trotz verschiedener möglicher Anwendungen von Gleichungen<br />

stets zu demselben Ergebnis kommt. Im obigen Programm ist dies der Fall.<br />

So kann man zwar zur Auswertung des Terms<br />

plus(O,plus(succ(O),O))<br />

Gleichungen auf verschiedene Weise anwenden. Es stellt sich aber heraus, dass das<br />

Programm trotzdem deterministisch ist, d.h., das Ergebnis zum Schluss ist immer das<br />

Gleiche.<br />

Im allgemeinen ist dies aber natürlich nicht garantiert. Hierzu ergänzen wir das Programm<br />

um die folgende Gleichung.<br />

plus(succ(x),y) ≡ plus(x,succ(y))<br />

Auf Gr<strong>und</strong>termen (d.h., Termen ohne Variablen, die nur aus plus, succ, <strong>und</strong> O bestehen)<br />

bleibt die Konfluenz erhalten, aber auf beliebigen Termen nicht. So kann man<br />

nun plus(succ(x),y) sowohl zu plus(x,succ(y)) als auch zu succ(plus(x,y)) auswerten<br />

<strong>und</strong> danach ist keine weitere Auswertung möglich. Die Auswertung hat also zwei<br />

unterschiedliche Ergebnisse. Wir werden Verfahren kennen lernen, die die Konfluenz<br />

eines Programms automatisch untersuchen.<br />

• Hält ein Programm immer nach endlich vielen Schritten an (Terminierung)<br />

Dies bedeutet, dass das Programm keine unendlichen Auswertungsfolgen haben darf.<br />

Im obigen Beispiel erkennt man, dass bei jedem rekursiven Aufruf das erste Argument<br />

kleiner wird. Bei der Auswertungsfolge für “2+1” ist das erste Argument zunächst<br />

2 (d.h. succ(succ(O))), dann 1 (succ(O)) <strong>und</strong> zuletzt 0 (d.h. O). Da Argumente nie<br />

unendlich oft kleiner werden können, bedeutet das, dass immer nur endlich viele<br />

rekursive Aufrufe möglich sind. Daher terminiert der Algorithmus plus.<br />

Würde man hingegen das Programm um die weitere Gleichung<br />

plus(x,y) ≡ plus(y,x)<br />

ergänzen, so würde das Programm nicht mehr terminieren, denn es gibt (unter anderem)<br />

die folgende unendliche Auswertung:<br />

plus(succ(O),O) → plus(O,succ(O)) → plus(succ(O),O) → plus(O,succ(O)) → ...<br />

Wir werden Techniken vorstellen, die die Terminierung von Programmen automatisch<br />

nachweisen können.<br />

• Erfüllt ein Programm seine Spezifikation (Korrektheit)<br />

Die Frage hierbei ist, ob gewünschte Aussagen über ein Programm wahr sind (oder

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!