Download (1405Kb)
Download (1405Kb)
Download (1405Kb)
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 />
✷