Spezifikationsmodule - Software and Systems Engineering - TUM
Spezifikationsmodule - Software and Systems Engineering - TUM
Spezifikationsmodule - Software and Systems Engineering - TUM
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
unifziert werden. Der Unifikator kann dann benutzt werden um die unifzierte<br />
Typdefinition automatisch zu erzeugen. In Abschnitt 3.4 führen wie die Definition<br />
eines solchen Unifikators interaktiv durch, d.h. der Nutzer wird festgelegen,<br />
welche Konstruktoren und Selektoren unifziert werden sollen, wobei die<br />
Namensgleichheit nicht mehr erforderlich ist.<br />
Um die Frage der Vereinbarkeit zweier Typdefinitionen zu beantworten, konstruieren<br />
wir mit Hilfe eines Fixpunktes die Menge aller vereinbarbaren Typtupel<br />
über zwei Typmodulen (DTDModule im Metamodell). Durch Prüfen, ob ein<br />
gegebenes Paar von Typen in dieser Menge enthalten ist, kann die Frage der<br />
Vereinbarkeit dieser beiden entschieden werden.<br />
In diesem Beispiel lassen wir zu Demonstrationszwecken den Benutzer bestimmen,<br />
von welchen beiden DTD-Modulen (den Sammelbehältern für Datentypdefinitionen)<br />
eine Vereinbarkeitsmenge berechnet werden soll und zeigen ihm<br />
diese am Ende an.<br />
Wir beginnen also mit der Auswahl der beiden DTDModule-Instanzen.<br />
context module1:DTDModule . context module2:DTDModule .<br />
Wir nutzen nun den Fixpunktoperator für die rekursive Mengenkonstruktion.<br />
Die Elemente der Menge sind dabei Tupel aus zwei TConst-Instanzen, je eine<br />
aus einem der beiden DTD-Module. TConst ist die MM-Superklasse, die atomare<br />
Typdefinitionen zusammenfasst (vgl. hierzu Abbildung 3.2).<br />
exists eqTypeSet: lfp fp1 set<br />
fp1_it:(mod1Type:(module1.TConsts), mod2Type:(module2.TConsts))<br />
with (<br />
In die Fixpunktmenge nehmen wir als erstes die identischen Tupel auf.<br />
Dies sind hier nur die AutoFocus 2-Grundtypen (also (Int, Int) und (Boolean,<br />
Boolean), usw.). Die Grundtypen sind in jedem DTD-Modul automatisch eingefügt.<br />
fp1_it.mod1Type = fp1_it.mod2Type or (<br />
Der zweite Teil der Konstruktionsvorschrift für den Fixpunkt übernimmt<br />
nun die Überprüfung, ob zwei nutzerdefinierte Datentypen vereinbar sind. Hierzu<br />
suchen wir die zu dem betrachteten Tupel gehörenden Datendefinitionen<br />
(DataDef-Instanzen). Für Grundtypen existieren, wie bereits gesagt keine Datentypdefinitionen,<br />
weshalb sie auch nur mit sich selbst vereinbar sind.<br />
exists mod1dd:DataDef . (<br />
mod1dd = fp1_it.mod1Type.TypeDef <strong>and</strong><br />
exists mod2dd:DataDef . (<br />
mod2dd = fp1_it.mod2Type.TypeDef <strong>and</strong><br />
Konnten wir entsprechende DataDef-Instanzen für beide Tupelteile finden,<br />
überprüfen wir nun sämtliche Konstruktorkombinationen, ob es namensgleiche<br />
Konstruktoren gibt.<br />
forall con1:(mod1dd.Constructors) .<br />
forall con2:(mod2dd.Constructors) . (<br />
(con1.Name = con2.Name) implies (<br />
25