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.

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!