Die Implementationsbeschreibungen Domain Specification Language (DSL) Die Gesamtstruktur

Die Domain-Gleichungen

Für jeden benötigten ADT muß dessen interne Struktur mit Hilfe der VDM-Basistypen, die ja Typgeneratoren  darstellen, angegeben werden -- dazu dienen die Domain-Gleichungen.

Nomenklatur Die Nomenklatur empfiehlt für Namen von Domains normale C-Bezeichner mit einigen Einschränkungen: der erste Buchstabe muß groß sein, alle weiteren klein, der Unterstrich darf ebenfalls vorkommen. Die Beispielsnamen wurden entsprechend dieser Regel möglichst ,,sprechend`` gewählt.

Hier sind nun die Formate der Domain-Gleichungen für die VDM-Basistypen, Beispielen. Die Bedeutung der ADT wird dabei kurz beschrieben. Die ADT sind Typgeneratoren , weil die Datentypen ihrer Elemente frei gewählt werden können.

Set  Der Set ist die Klasse von Mengen (im mathematischen Sinn) von Elementen.

Set = Element -set
*[2ex]

Tuple  Der Tuple ist die Klasse von Sequenzen von gleichartigen Elementen.

Tuple = Element tex2html_wrap_inline6338 oder
*[1ex] Tuple = Element +
*[2ex]

Map  Die Map ist die Klasse von endlichen Mengen von Paaren von Elementen (partielle, funktionale Zuordnung).

Map = Argumentwert -m-> Map-Wert
*[2ex]

Tree  Der Tree ist die Klasse von endlichen geordneten Sammlungen einzeln benannter Komponenten eventuell unterschiedlichen Typs.

Selektornamen Alle Komponenten müssen benannt sein. In der VDM-Spezifikation ist das nicht gefordert; Sie müssen dies jetzt nachholen. Ein Komponentenname  (Selektorname)  beginnt immer mit der Zeichenfolge ,,s_``, darauf folgt zunächst ein Kleinbuchstabe, dann können noch weitere Kleinbuchstaben, Ziffern oder Unterstriche folgen.

 Tree :: s_eins : Element1 \+ 
 *[0.5ex]
s_zwei		: Element2 
 *[0.5ex]
 tex2html_wrap_inline6814  
 *[0.5ex]
s_n		: Elementn 
 *[0.5ex]

Union  Die Union ist die Klasse von Objekten, die mehrere Datentypen haben können; zu jeder Zeit enthält ein Union-Objekt genau ein Objekt mit einem der möglichen Datentypen.

 Union1 = s_eins : Typ1 | \+ 
 *[0.5ex]
s_zwei : Typ2 | 
 *[0.5ex]
 tex2html_wrap_inline6814  
 *[0.5ex]
s_n : Typn 
 *[1ex]

Bei Unions ist es erlaubt, die Elemente anonym zu lassen; der VDM-Compiler generiert in diesem Fall Namen, indem er vor den (in Kleinbuchstaben umgewandelten) Elementnamen die Zeichen ,,s_`` stellt. Das ist natürlich nur möglich, wenn nicht eine andere anonyme Union die gleichen Datentypen verwendet, da sonst doppelte Bezeichner auftreten!

 Union2 = Ēlement1 | \+ 
 *[0.5ex]
Element2 | 
 *[0.5ex]
 tex2html_wrap_inline6814  
 *[0.5ex]
Elementn 
 *[2ex]

Optional Das Optional  ist eine Klasse von Objekten, die zu einem bestimmten Zeitpunkt entweder ein Objekt des Elementtyps oder den speziellen Wertnil enthalten.

Optional = [ Element ]
*[2ex]

Elementare Elementare Datentypen (Elementary) gibt es in VDM auch: es sind Zeichen, Zahlen (mit verschiedenen Wertebereichen) und logische Wahrheitswerte. Außerdem gibt es einen vordefinierten Datentyp ,,String``, der als Tuple von Zeichen vereinbart ist; er ist zwar nicht elementar, steht aber immer zur Verfügung.

      
Nat1 Natürliche Zahlen ab 1
Nat0 Natürliche Zahlen ab 0
Intg Ganze Zahlen
Bool true und false
Char ASCII-Zeichen
Str Zeichenketten

Token Ein Token  ist ein Typ, für den nur Konstruktoren und Tests auf Gleichheit / Ungleichheit existieren. Eine Repräsentation ist nicht definiert; Sie können damit z.B. Pointer oder Unterbereichstypen definieren (Anwendungen finden Sie im Abschnitt 5.3.4).

Token = ELEMENTARY
*[4ex]

Es gibt eine Restriktion bezüglich der Verschachtelung von Domains innerhalb einer Domain-Gleichung: Komponenten von zusammengesetzten Domains dürfen nicht ebenfalls zusammengesetzt sein. Dies müssen Sie bei der Umsetzung Ihrer VDM-Spezifikation beachten; dort ist die Verschachtelung von ADT ja beliebig möglich. Die Zerlegung sollten Sie trotzdem erst während der Erstellung der DSL-Spezifikation vornehmen, da die Struktur des von Ihnen geschaffenen ADT klarer ist, wenn sie ,,komplett`` in einer Domain-Gleichung vorliegt! Warum müssen Verschachtelungen zerlegt werden ? Weil Sie für jeden beteiligten VDM-Basistyp festlegen müssen, wie er implementiert werden soll -- dafür muß aber jeder VDM-Basistyp auch einen Namen haben!

Beispiel: Aus der Definition

A = [ Nat0 | Intg ] tex2html_wrap_inline6338
*[1ex]

müssen Sie die folgenden drei Definitionen machen:

A = B tex2html_wrap_inline6338
* B = [ C ]
* C = Nat0 | Intg
*[1.5ex]

Die Implementationsbeschreibungen Domain Specification Language (DSL) Die Gesamtstruktur

VDM Class Library