08.10.2013 Aufrufe

Download (1405Kb)

Download (1405Kb)

Download (1405Kb)

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!