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 ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
• Compilerbau<br />
Compiler führen üblicherweise mehrere Optimierungen durch, um die Effizienz des<br />
compilierten Codes zu verbessern. Eine der gr<strong>und</strong>legenden Optimierungstechniken ist<br />
das common subexpression problem [DST80], bei dem versucht wird, mehrfach auftretende<br />
Teilausdrücke (d.h., Teilterme) zu erkennen <strong>und</strong> nur einmal auszuwerten.<br />
Hierbei sind zwei Teilausdrücke nicht nur dann “gleich”, wenn sie syntaktisch identisch<br />
sind, sondern auch dann, wenn dies aus den durch den vorangegangenen Code<br />
gegebenen Gleichungen folgt.<br />
• Programmverifikation<br />
Ähnliche Fragestellungen treten natürlich auch bei der Programmverifikation <strong>und</strong><br />
beim automatischen Beweisen auf. Aus dem Kongruenzabschluss-Verfahren kannman<br />
ein Entscheidungsverfahren für die Allgemeingültigkeit universeller prädikatenlogischer<br />
Formeln erhalten [NO80]. Darüber hinaus lässt sich auf diese Weise auch ein<br />
Entscheidungsverfahren für universelle Aussagen über rekursiv definierte Datenstrukturen<br />
(wie Listen, Bäume, natürliche Zahlen, etc.) gewinnen [Opp80, NO80].<br />
• Kombination von Entscheidungsverfahren<br />
EinesderzurZeitaktuellstenForschungsbereiche (insbesondereinderautomatisierten<br />
Programmverifikation) ist die Frage, wie man Entscheidungsverfahren für verschiedene<br />
Theorien kombiniert. Hierzu werden Verfahren verwendet, die ebenfalls auf dem<br />
Kongruenzabschluss basieren [NO79, Sho84, Zha92, RS02].<br />
Definition 3.2.1 (Gr<strong>und</strong>identität) Eine Termgleichung s ≡ t ist eine Gr<strong>und</strong>identität,<br />
falls sie keine Variablen enthält, d.h., falls V(s) = V(t) = ∅.<br />
Beispiel 3.2.2 Betrachten wir ein imperatives Programm, bei dem i, j, k, l, m Variablen<br />
(für natürliche Zahlen) <strong>und</strong> f <strong>und</strong> g Variablen für Arrays sind. Das Programm habe nun<br />
folgenden Programmtext:<br />
...<br />
i = j;<br />
k = l;<br />
f[i] = g[k];<br />
if (j == f[j]) {<br />
}<br />
...<br />
m = g[l];<br />
... (*)<br />
Die Frage ist nun, ob an der Stelle (*) der Zusammenhang f[m] = g[k] gilt. Dies kann<br />
zum einen für die Verifikation des Programms interessant sein <strong>und</strong> zum anderen für den<br />
Compiler, der dannweiß, dass er beimVorkommen der beiden Teilausdrücke f[m] <strong>und</strong>g[k]<br />
nur einen davon auswerten muss, da der andere denselben Wert hat.