Download (1405Kb)
Download (1405Kb)
Download (1405Kb)
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
3.1. DIE ABSTRAKTE SYNTAX 39<br />
In üblichen funktionalen Programmiersprachen wie Miranda oder Haskell ist jedoch auch<br />
beispielsweise 1<br />
f(A) = A<br />
f(A) = B<br />
ein syntaktisch korrektes Programm. Die Mehrdeutigkeit der Funktionsspezifikation wird bei Berechnungen<br />
durch die Wahl der jeweils ersten passenden Gleichung aufgelöst. f(A) hat also den<br />
Wert A und nicht B. Da unsere Programme jedoch Mengen von Programmregeln sind, existiert<br />
in ihnen gar keine Reihenfolge von Programmregeln. Dieses Nichtvorhandensein einer Reihenfolge<br />
wird übrigens erst durch die abstrakte Syntax deutlich; jeder Programmtext ist linear angeordnet.<br />
Die funktionale Programmiersprache Hope setzt unsere Eindeutigkeitsbedingung auch nicht<br />
voraus und verwendet trotzdem keine Regelreihenfolge. Bei Berechnungen wird die ” speziellste“<br />
Regel verwendet, diejenige, die zu den gegebenen Argumenten am besten paßt. Diese Vorgehensweise<br />
stellt jedoch auch gewisse (Ordnungs-)Bedingungen an die linken Seiten der Regeln eines<br />
Funktionssymbols.<br />
Wir wollen vollkommen auf derartige künstliche Prioritäten verzichten. Es ist intuitiv einsichtig,<br />
daß aufgrund der Eindeutigkeitsbedingung durch unsere Programme wirklich Funktionen spezifiziert<br />
werden, die jedem Argument(tupel) (höchstens) einen Funktionswert zuordnen. Freilich kann<br />
die Forderung der Eindeutigkeitsbedingung und auch der Linkslinearität erst bei der Betrachtung<br />
der Semantik vollständig begründet werden. Auf die Eindeutigkeitsbedingung und Prioritäten in<br />
üblichen funktionalen Programmiersprachen werden wir in Kapitel 7 auch nochmals ausführlicher<br />
eingehen.<br />
Das obige Beispiel 3.1 besitzt überhaupt keine überlappenden linken Programmregelseiten. Das<br />
folgende Programm nutzt dagegen die bei der Eindeutigkeitsbedingung noch gegebenen Freiheiten<br />
wirklich aus.<br />
Beispiel 3.2 (Striktes) And<br />
and(True,x) → x<br />
and(y,True) → y<br />
and(False,False) → False<br />
Dieses Programm mit Pattern spezifiziert die (strikte; siehe auch später) logische ∧-Verknüpfung<br />
kürzer als durch die näherliegenden 4 Programmregeln.<br />
Es ist<br />
and(True,x)[True/x] = and(True,True) = and(y,True)[True/y]<br />
aber auch<br />
x[True/x] = True = y[True/y].<br />
Die Grundtermersetzungsregeland(True,True)→True ist also eine Instanz beider Programmregeln.<br />
✷<br />
1 Aus Gründen der Analogie zu unseren Programmen erster Ordnung verwenden wir für alle Miranda-Beispiele<br />
in dieser Arbeit eine für Miranda ungewöhnliche Schreibweise. Miranda (und Haskell) besitzen keine echt mehrstelligen<br />
Funktionen, sondern realisieren diese üblicherweise durch Currying. Der hier erfolgte Einsatz von teilweise<br />
redundanten Klammerungen und Tupeln ist jedoch auch korrekt.