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.

8.1. DATENREGELN 171<br />

Das obige Programm spezifiziert keinesfalls den intendierten Test auf 0. Die Funktion isZero ist<br />

noch nicht einmal eine Funktion über den ganzen Zahlen! Aus den Regeln folgt beispielsweise<br />

Succ(Zero) ∼ isZero(Zero) ∼ isZero(Succ(Pred(Zero))) ∼ Zero,<br />

und allgemein, daß alle Konstruktorgrundterme semantisch gleich sind. Das Programm ist nicht<br />

konsistent, d.h. durch die Programmregeln werden Konstruktorterme semantisch gleichgesetzt, die<br />

in dem durch die Datenregeln spezifizierten Basisdatentypen nicht semantisch gleich sind. Die Forderung<br />

der Konsistenz ist auf dem Gebiet der algebraischen Spezifikationen wohlbekannt ([Gut77],<br />

[Gut&Hor78], 3.2 in [Der&Jou90], [Wir90]), aber diese Eigenschaft ist für allgemeine Termersetzungssysteme<br />

unentscheidbar (vgl. [Gut&Hor78]).<br />

Sinnvoll, je nach Form der zugelassenen Datenregeln allerdings noch nicht hinreichend für die Konsistenz,<br />

ist mit Sicherheit eine Anpassung der Eindeutigkeitsbedingung der Programmregeln (vgl. Def.<br />

3.2, S. 38): Wenn zwei linke Programmregelseiten bezüglich der durch die Datenregeln erzeugten<br />

Kongruenz unifizierbar sind, sollten auch die zugehörigen rechten Programmregelseiten bezüglich<br />

dieser Kongruenz unifizierbar sein (für Unifikation bezüglich einer Kongruenz siehe [Der&Jou90],<br />

[Jou&Kir91]). Das obige Beispiel 8.3 erfüllt diese Bedingung nicht. Die Unifizierbarkeit ist jedoch<br />

selbst für durch konfluente, terminierende Termersetzungssysteme gegebene Kongruenzen nur semientscheidbar<br />

(das Problem ist leicht auf Hilberts zehntes Problem der Lösbarkeit diophantischer<br />

Gleichungen reduzierbar; siehe 6.3 in [Der&Jou90], auch 6. in [Huet&Op80]).<br />

Für unsere Programme mit Pattern und Programme mit Hilfsfunktionen folgt die Konsistenz übrigens<br />

direkt aus der Konfluenz. Diese ist bei der Verwendung von Datenregeln aber auch im allgemeinen<br />

nicht mehr gegeben, so auch in Beispiel 8.3 nicht, obwohl die Datenregeln und die Programmregeln<br />

jeweils für sich konfluent sind. Da die Konfluenz beliebiger Termersetzungssysteme<br />

unentscheidbar ist, sie aber für operationelle Semantiken im allgemeinen benötigt wird, stellt dies<br />

ein weiteres Problem dar.<br />

Nach all diesen, mehr theoretische Aspekte betreffenden Nachteilen bringen wir schließlich noch<br />

einen ganz pragmatischen Einwand vor: Das folgende Beispiel zeigt eine korrekte, konsistente Spezifikation<br />

des Tests auf 0.<br />

Beispiel 8.4 Datenregeln und Test auf 0 für ganz Zahlen, II<br />

Die Datenregeln seien die gleichen wie in Beispiel 8.2.<br />

isZero(x) → h(Zero,Zero,x)<br />

h(x,y,Pred(z)) → h(x,Succ(y),z)<br />

h(x,y,Succ(z)) → h(Succ(x),y,z)<br />

h(Succ(x),Succ(y),Zero) → h(x,y,Zero)<br />

h(Succ(x),Zero,Zero) → Zero<br />

h(Zero,Succ(x),Zero) → Zero<br />

h(Zero,Zero,Zero) → Succ(Zero)<br />

Prinzip des Algorithmus:hzählt die im dritten Argument auftretendenSucc’s und Pred’s im ersten<br />

respektive zweiten Argument. ✷<br />

Zur Wahrung der Konsistenz ist diese äußerst umständliche und komplizierte Spezifikation nötig!<br />

Die Funktionen müssen beliebige Konstruktorterme als Argumente ” korrekt verarbeiten“. Die dadurch<br />

gegebene korrekte Spezifikation des nicht-freien Datentyps ist für die Praxis jedoch nur von<br />

geringem Interesse.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!