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.
tm_fp3.one = fp3_it.one.TransitionSegment <strong>and</strong><br />
tm_fp3.two = fp3_it.two.TransitionSegment<br />
) <strong>and</strong><br />
exists pm_fp3:port_map . (<br />
fp3_it.one.Port.Model = pm_fp3.one <strong>and</strong><br />
fp3_it.two.Port.Model = pm_fp3.two<br />
)) .<br />
Die so berechneten Vereinigungen werden wir sogleich einsetzen um die notwendigen<br />
Vereinigungen von Konstruktoren zu berechnen.<br />
5.4.5 Unifikation der Datendefinitionen<br />
Als letzten Teil setzen wir die Unifikation der Datendefinitionen in ODL um. Wir<br />
werden dazu die Ein-/Ausgaberelationen verwenden. Für deren Terme führen<br />
wir eine Strukturunifikation, ähnlich der prädikatenlogischen Unifikation, wie<br />
wir sie in Kapitel 3 gesehen haben, durch. Wie in Abschnitt 2.5 festgelegt bestehen<br />
Terme nur aus Konstruktoren, die aus Datendefinitionen stammen. Wir<br />
beginnen daher die Termunifikation mit ihnen.<br />
Berechnung der Konstruktorenvereinigungen<br />
Für die Vereinigung der Konstruktoren sammeln wir zunächst alle Paare von<br />
Termelementen (Appl), die Funktionsapplikationen von Konstruktoren darstellen<br />
auf. Diese Paare erhalten wir entweder direkt aus den Termen der unifizierten<br />
Ein- bzw. Ausgabeausdrücke (Input/Output) oder rekursiv als Parameter<br />
aus bereits gefundenen Paaren. Deshalb verwenden wir einen Fixpunktausdruck<br />
um diese rekursive Suche durchzuführen. Die resultierende Menge stellt<br />
gewissermaßen wieder eine Unifikationsrelation dar, denn sie enthält die Paare<br />
von Appl-Elementen, die durch die Termstruktur und die unifizierten Ein-<br />
/Ausgabeausdrücke zuein<strong>and</strong>er korrespondieren.<br />
exists appl_fixpoint: lfp FP_Appl set<br />
fpappl_it:(one:Appl, two:Appl)<br />
with (<br />
exists im_fpa:input_map . (<br />
im_fpa.one.Pattern.Model = fpappl_it.one <strong>and</strong><br />
im_fpa.one.Pattern.Model = fpappl_it.two<br />
) or<br />
exists om_fpa:output_map . (<br />
om_fpa.one.Expression.Model = fpappl_it.one <strong>and</strong><br />
om_fpa.one.Expression.Model = fpappl_it.two<br />
) or<br />
exists fpa_elem:FP_Appl . (<br />
is Args(fpa_elem.one, fpappl_it.one) <strong>and</strong><br />
is Args(fpa_elem.two, fpappl_it.two) <strong>and</strong><br />
indexOf(fpappl_it.one, fpa_elem.one, "Args") =<br />
indexOf(fpappl_it.two, fpa_elem.two, "Args")<br />
)<br />
) .<br />
50