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