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.
Als Beispiel betrachten wir eine Datenstruktur zur Darstellung der natürlichen Zahlen,<br />
wie sie in funktionalen Programmiersprachen üblich ist. Hierzu verwendet man eine nullstellige<br />
Funktion O <strong>und</strong> eine einstellige Funktion succ. Diese beiden Funktionen werden<br />
als Konstruktoren der Datenstruktur der natürlichen Zahlen benutzt, d.h., man kann mit<br />
ihnen alle Datenobjekte der Datenstruktur darstellen. Hierbei steht O für die Zahl 0 <strong>und</strong><br />
succ für die Nachfolgerfunktion (“successor”). Die Zahl 1 wird also als succ(O) dargestellt,<br />
die Zahl 2 wird als succ(succ(O)) dargestellt, etc.<br />
Auf dieser Datenstruktur kann man nun z.B. den folgenden Additionsalgorithmus definieren.<br />
plus(O,y) ≡ y (1.1)<br />
plus(succ(x),y) ≡ succ(plus(x,y)) (1.2)<br />
Dies ist ein funktionales Programm, das durch zwei Gleichungen spezifiziert wird. Es<br />
bedeutet, dass plus das zweite Argument y zurückliefert, falls das erste Argument die Zahl<br />
O ist. Ansonsten ruft sich plus rekursiv auf, wobei das erste Argument um eins erniedrigt<br />
wird <strong>und</strong> das zweite Argument unverändert bleibt. Das Endresultat wird dabei um eins<br />
erhöht.<br />
“Berechnungen” mit solch einem Programm verlaufen durch “Anwenden” der Gleichungen<br />
von links nach rechts. (Hierbei darf man beliebige Teilausdrücke anhand der Gleichungenersetzen.)<br />
Wennmanalso“2+1”berechnenmöchte, ruftmanplusmitdenArgumenten<br />
succ(succ(O)) <strong>und</strong> succ(O) auf. Die Auswertung verläuft dann wie folgt:<br />
plus(succ(succ(O)),succ(O)) → succ(plus(succ(O),succ(O)))<br />
→ succ(succ(plus(O,succ(O))))<br />
→ succ(succ(succ(O)))<br />
Man erhält also das Ergebnis 3, wie erwünscht.<br />
Systeme von Gleichungen wie oben, die von links nach rechts angewendet werden sollen,<br />
bezeichnet man als Termersetzungssysteme. Hierbei schreibt man üblicherweise anstelle des<br />
Gleichheitszeichens “≡”einenPfeil“→”,umzuverdeutlichen, inwelcher Richtung dieGleichungen<br />
anzuwenden sind. Ausdrücke wie plus(succ(succ(O)),succ(O)) oder plus(succ(x),y)<br />
heißen Terme. Terme sind aus Variablen (wie x <strong>und</strong> y) <strong>und</strong> Funktionssymbolen (wie O, succ<br />
<strong>und</strong> plus) aufgebaut. Die Auswertung von Termen anhand von Gleichungen wie oben bezeichnet<br />
man als Termersetzung. Man erkennt also, dass Termersetzung ein sehr einfacher<br />
<strong>und</strong> natürlicher Mechanismus ist, der vielen Programmiersprachen zugr<strong>und</strong>e liegt, <strong>und</strong> dass<br />
die Sprache der Termersetzungssysteme inder Tat eine (bzw. die) gr<strong>und</strong>legende funktionale<br />
Programmiersprache ist.<br />
Um die Zuverlässigkeit <strong>und</strong> Korrektheit von Programmen zu garantieren, ist es nicht<br />
hinreichend, sie nur zu testen, sondern es werden Techniken benötigt, um sie formal zu analysieren<br />
<strong>und</strong> zu verifizieren. Solche Analysen <strong>und</strong> Verifikationen sind jedoch im allgemeinen<br />
sehr aufwendig — insbesondere bei umfangreichen Programmen, wie sie in der Praxis eingesetzt<br />
werden. Aus diesem Gr<strong>und</strong> wird versucht, diese Aufgaben weitgehend automatisch<br />
durchzuführen. Hierzu erweisen sich Termersetzungssysteme als äußerst wichtiges Werkzeug.