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.
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 />
✷