RELATION-SPECIFICATION ====================== Syntax: <Relation-Spezifikation> ::= [:GENERAL-RELATIONS (<Rahmen-Relation>*)] [:PART-RELATIONS (<Rahmen-Relation>*)] <Rahmen-Relation> ::= ([:DOCUMENTATION <Dokumentation>] [:EXPLANATION <Erklärung>] [:VALUE-RESTRICTION {<Lisp-Typ: Symbol> | <Rahmen-Typ>}] [:NUMBER-RESTRICTION (<min><max>)] [:INITIAL-VALUE {<Instanz-Name>| <auswerten-nach-Menge> | <Lisp-Typ: T}] [:INITABLE {T | NIL}] [:READ-ONLY {T | NIL}] [:IF-UNDETERMINED <Lisp-Typ: T>] [:READ-DEPENDENTS <Lisp-Typ: T>] [:WRITE-DEPENDENTS <Lisp-Typ: T>]) Warnung: Der Erklärungseintrag wird durch EMA-XPS nicht unterstützt, d.h. :documentation und :explanation werden ignoriert. Mit der Relationsspezifikation können Sie bei der Rahmendefinition das angegebene Merkmal bzw. den angegebenen Bestandteil genauer bestimmen. Unter ':documentation' und ':description' geben Sie den Dokumentations- und Erklärungseintrag an. Mit ':value-restriction' können Sie den Werte- bereich für das angegebene Attribut einschränken. Sie können hier Lisp-Typen angeben, wie string, number, list oder einen Rahmennamen. Geben Sie letzteres an, so können bei der Instanz-Relation nur Instanzen des entsprechenden Rahmens eingetragen werden. Unter ':number-restriction' legen Sie die Anzahl der Werte fest, die bei der Instanz-Relation einge- tragen werden dürfen. Sie geben die minimale und die maximale Anzahl von Werten an. ':initial-value' bezeichnet einen Standardwert, der bei der Initialisierung eingetragen werden soll, wenn bei der Instanzdefinition nichts anderes angegeben wurde. Mit ':initable' legen Sie fest, ob der Initial-Wert bei der Instanziierung überschrieben werden darf oder nicht. Wenn Sie T angeben, darf er über- schrieben werden, bei der Angabe von NIL wird bei der Initialisierung immer der Standardwert ein- getragen. ':read-only' verhindert einen Schreibzugriff auf den bei der Instanziierung gesetzten Wert, d.h. Sie können nur lesend - beispielsweise mit einem ASK - auf den Wert zugreifen. Sie können bei un- bestimmten Werten diese nicht nachträglich ändern oder durch ':if-undetermined' setzen. Unter ':if-undetermined' können Sie angeben, welche Aktionen ausgelöst werden sollen, falls der Wert der jeweiligen Instanzrelation unbekannt ist. Sie geben dazu in einer Liste die gewünschten babylon-Ausdrücke an, die sequentiell nacheinander ausgeführt werden sollen. :read-dependents geben Ihnen die Möglichkeit, Lese- zugriffe auf einen Wert differenzierter zu behandeln. Sie können andere Instanzen benachrichtigen, wenn auf einen Wert lesend zugegriffen wird. Bei dem Wert, der eine Leseabhängigkeit haben soll, müssen Sie lediglich die Instanz angeben, zu der die Nachricht geschickt werden soll. Um die Nachricht zu verar- beiten ist es notwendig, ein Behavior mit dem Namen notify-read-dependent zu beschreiben, das die Nachricht für Instanzen der jeweiligen Klasse behandelt. Mit ':write-dependents' verfahren Sie analog wie mit ':read-dependents', außer daß es sich hier um Schreibzugriffe handelt. Beispiel: >(define-frame Kunde :general-relations (urlaubsinteresse (:value-restriction symbol :if-undetermined (ask (match _x (start 'erfrage-urlaubs-interesse)) (tell [urlaubsinteresse instance _x]))) vorschlag (:value-restriction laender) ziele (:value-restriction laender :if-undetermined (ask [laender _land] (tell [ziele instance _land])))))