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.

156 KAPITEL 7. SEQUENTIALITÄT<br />

f(B,undef)<br />

∗<br />

−−→<br />

cbn<br />

da das 1. Argument B nicht zum Pattern A der ersten Gleichung paßt, aber die zweite Gleichung<br />

anwendbar ist.<br />

Der Term f(B,undef) demonstriert auch, von welcher Bedeutung die Richtung des Patternmatchings<br />

von links nach rechts ist. Würde das Patternmatching von rechts nach links durchgeführt<br />

werden, würde zuerst versucht werden, undef mit B zu matchen. Dafür müßte undef ausgewertet<br />

werden. Da diese Reduktion nicht terminiert, würde die Berechnung des Gesamtterms f(B,undef)<br />

nie terminieren. Genau dies geschieht hier bei dem Term f(undef,A):<br />

f(undef,A) −−→<br />

cbn<br />

B,<br />

f(undef,A) −−→<br />

cbn . . .<br />

Offensichtlich sind bei einer derartigen Semantik des Patternmatchings Programme mit Pattern<br />

leicht semantikerhaltend in Programme mit Hilfsfunktionen übersetzbar. Diese Leichtigkeit der<br />

Implementierung wird aber mit einer weitaus komplizierteren denotationellen oder gar deklarativen<br />

Semantik erkauft. In [Tho89] und [Tho94] wird ein Verfahren zur Verifikation von Miranda-<br />

Programmen durch eine Übersetzung dieser in eine Gleichungslogik und Verwendung eines allgemeinen<br />

Theorembeweisers entwickelt. Es zeigt sich dort, daß die Übersetzung für das Pattermatching<br />

äußerst komplex ist.<br />

Unser einfaches semantisches cbn-Matchen ist dagegen weitaus intuitiver und, wie wir in Kapitel<br />

6 gesehen haben, leicht deklarativ definierbar. Dafür ist bei unseren ς-Semantiken die Übersetzung<br />

von Programmen mit Pattern in Programme mit Hilfsfunktionen im allgemeinen nicht mehr<br />

möglich:<br />

Beispiel 7.3 Paralleles And (vgl. Bsp. 4.7, S. 67)<br />

and(False,x) → False<br />

and(x,False) → False<br />

and(True,True) → True<br />

and DP,cbn ⊥ False True<br />

⊥ ⊥ False ⊥<br />

False False False False<br />

True ⊥ False True<br />

Dieses Programm mit Pattern ist nicht in ein äquivalentes Programm mit Hilfsfunktionen übersetzbar,<br />

da mit Hilfe der Verzweigungssymbole die zwei Argumente von and nur nacheinander mit<br />

True und False verglichen werden können:<br />

oder<br />

Dies bedeutet aber<br />

wogegen<br />

and1(x,y) → condFalse(x,False,condFalse(y,False,True))<br />

and2(x,y) → condFalse(y,False,condFalse(x,False,True))<br />

and DP1 ,cbn<br />

1 (⊥,False) = ⊥,<br />

and DP2 ,cbn<br />

2 (False, ⊥) = ⊥<br />

and DP,cbn (⊥,False) = False,<br />

and DP,cbn (False, ⊥) = False.<br />

✷<br />

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!