Wie modellieren wir eine solche Stückliste ? Wir erweitern die qualitative Beschreibung, indem wir zu jedem Bestandteil eines Teils auch seine Anzahl speichern. Dies gelingt uns mit einer sogenannten ,,Bag`` Bag , das ist ein Set, in dem ein Element mehrfach vorkommen darf. Wir ordnen also jedem Teil im Set seine Häufigkeit zu, indem wir eine Map von Teilnummern (ganze Zahlen größer als 0) auf Häufigkeiten definieren:
Plist=Nat1
Pnbag
*
Pnbag = Nat1
Nat1
*
Pnset = Nat1 -set
Die Stückliste Plist (Part list) ordnet jedem Teil eine Bag seiner Bestandteile zu, die wiederum jedem Bestandteil die benötigte Anzahl zuordnet. Die Argumentmenge der Bag ist identisch mit dem Bestandteil-Set der qualitativen Stückliste; um sie von der Häufigkeitsinformation zu separieren, führen wir auch wieder den Datentyp Pnset ein.
Speicherung Wir wollen die Stückliste zum Abspeichern in ein Tuple umwandeln; uns kommt dabei gelegen, daß die Teilnummern und die Häufigkeiten den gleichen Datentyp haben, nämlich Nat1. Für ein Tuple mit unstrukturierten Elementen (z.B natürliche Zahlen) gibt es ja Lade- und Speicher-Operationen, nämlich fread und fwrite. Die Speicher-Form der Stückliste modellieren wir:
Pntup=Nat0
*[1ex]
Hier wählen wir (überraschenderweise) den Datentyp Nat0 als Elementtyp; das hat Vorteile für Speichern und Laden, wie Sie dort sehen werden!
Struktur... Die Struktur-Stückliste Slist (Structured part list) ist ein Hierarchiebaum, dessen Knoten beliebig viele Nachfolger haben können, und die jeweilige Teilnummer und seine Häufigkeit enthalten. Also benötigen wir eine rekursive Struktur. Da ein Knoten jeweils durch die Teilnummer ,,charakterisiert`` wird, modellieren wir die Bestandteile eines Teils als Map von Teilnummern auf deren Daten; diese Daten sind die Häufigkeit des Bestandteils im Gesamt-Teil und eine eventuell leere Map von untergeordneten Bestandteilen:
*
Pnrec :: s_times :Nat1
*
s_parts :Slist
Slist= Nat1¯
Pnrec
Implementation Für die diversen Maps kann jeweils die Implementation scaldom gewählt werden, da der Argumenttyp ein Ordinaltyp ist; dann muß der Tree allerdings (wegen der Rekursion) auf Pointern basierend mit ptstruct implementiert werden. Die Implementation des Tuple durch array ist schnell; für Sets gibt es nur die linklist.
Die semantischen Funktionen
Ein größeres Beispiel
Ein größeres Beispiel