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 ...
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