08.10.2013 Aufrufe

Download (1405Kb)

Download (1405Kb)

Download (1405Kb)

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.

7.2. GEGENSEITIGE ÜBERSETZBARKEIT DER PROGRAMME 155<br />

Es ist jedoch möglich, auf die Verzweigungssymbole zu verzichten, indem für jedes Vorkommen eines<br />

Verzweigungssymbols ein neues (an allen Stellen erzwungen striktes) Funktionssymbol eingeführt<br />

wird.<br />

Beispiel 7.1 Programm mit Hilfsfunktionen ❀ Programm mit Pattern<br />

wird übersetzt in<br />

add(x,y) → condSucc(y, Succ(add(x, selSucc,1(y))), x)<br />

add(x,y) → new(y,x,y)<br />

new(Succ(y’),x,y) → Succ(add(x, selSucc,1(y)))<br />

new(Zero,x,y) → x<br />

Das mit obigem Beispiel angedeutete Verfahren ließe sich selbstverständlich noch optimieren. Wir<br />

verzichten jedoch überhaupt auf eine Definition des Übersetzungsverfahrens und einen Beweis seiner<br />

Korrektheit. Stattdessen wenden wir uns der umgekehrten, weitaus wichtigeren Übersetzungsrichtung<br />

zu.<br />

Wie schon zur Motivation der Definition der Programme mit Hilfsfunktionen erwähnt, ist Patternmatching<br />

zwar intuitiv eingängig und ermöglicht einfachere Spezifikationen, aber es ist auch schwer<br />

direkt implementierbar. Dagegen ist die Reduktion durch eine Regel, auf deren linker Seite sich nur<br />

Variablen befinden, relativ leicht implementierbar. Die Reduktionen für die Hilfssymbole werden<br />

nicht vermittels der ihnen zugeordneten Reduktionsregeln durchgeführt, sondern direkt implementiert.<br />

Dieses Verfahren wird auch bei modernen funktionalen Programmiersprachen verwendet. Aus<br />

den zu einem Funktionssymbol gehörenden Pattern wird ein sogenannter Matching-Tree generiert<br />

(Kapitel 8 in [Fie&Har88], 5 in [Huet&Lévy79] und [Lav87]), in dem die zu einem bestimmten<br />

Funktionsaufruf passende Gleichung ausgewählt wird. Dies ist im Prinzip eine Übersetzung von<br />

Programmen mit Pattern in Programme mit Hilfsfunktionen.<br />

Wie jedoch auch schon erwähnt, ist das Patternmatching in den verbreiteten funktionalen Programmiersprachen<br />

anders definiert als in unseren Programmiersprachen. In den meisten werden<br />

die linken Gleichungsseiten eines Funktionssymbols von oben nach unten getestet und die erste<br />

passende gewählt. Außerdem erfolgt die (teilweise) Auswertung der Argumente immer von links<br />

nach rechts.<br />

Beispiel 7.2 Patternmatching in verbreiteten funktionalen Programmiersprachen<br />

f(A,B) = A<br />

f(x,y) = B<br />

undef = undef<br />

sei ein funktionales Programm in einer nicht-strikten Sprache wie Miranda oder Haskell.<br />

Da immer die erste passende Gleichung verwendet wird, gilt<br />

Es gilt<br />

f(A,B)<br />

∗<br />

−−→<br />

cbn<br />

A.<br />

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!