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

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!