CDL文
CDLで記述されたルール定義は、ルールの目的を定義する1つ以上の文で構成されます。
次の2種類の文があります:
-
明示的な文
-
イテレータ文
明示文とイテレータ文の違いは、関係する関係者のタイプにあります。
明示的な文
明示的な文は、明示的に識別された参加者間の関係を表し、ルールの実行をそれらの参加者およびそれらの参加者を含むモデルに制限します。
明示的な文では、モデル構造にそのロケーションを指定して、ルールに参加する各ノードおよび属性を識別する必要があります。 明示的な文は特定のモデルに適用されるため、明示的な文のすべての参加者がルール定義に明示的に記述されます。
CDLでは、キーワードCONSTRAIN、COMPATIBLE、ADD...TOおよびSUBTRACT...FROMで識別される複数の種類の明示的な文がサポートされています。
次の例は、論理IMPLIES関係の単一の式で構成される明示的な文を示しています。
CONSTRAIN a IMPLIES b;
CONSTRAIN (a+b) * c > 10 NEGATES d;
イテレータ文
イテレータは、定数、モデル参照、これらの式などの要素に対して反復(反復)する問合せに似た文です。 イテレータは、コレクションのモデル・ノード要素である参加者、またはその属性で識別される参加者間の関係を表し、同じ属性を持つオプション機能またはオプション・クラスの子のオプションにルールを適用できるようにします。 イテレータを使用すると、モデル・ノードの属性を使用して、制約またはコントリビューションの参加者を指定できます。 これは、モデル構造またはその属性が頻繁に変更される場合に、永続的な制約セットを保持する場合に特に役立ちます。 イテレータは、互換性ルールなど、参加者の組合せ間の関係を表すためにも使用できます。
イテレータ文では、コレクションを介して1つ以上のイテレータにバインドされたローカル変数を使用できます。 これは、複数の制約またはコントリビューションを1つの暗黙的な形式で表す方法です。 コンパイル中、1つのイテレータ文が1つ以上の制約またはコントリビューションに展開されます。
ルール文をイテレータ文にするために使用できるイテレータは次のとおりです:
-
ALL....INの場合
-
WHERE
1つの文に複数のイテレータ
FOR ALL句の構文では、複数のイテレータを使用できます。 この文は、2つ以上のコレクションのデカルト積に展開できます。
次の例では、Glass子モデルのTintオプション・クラスのすべての品目と、WindowモデルのFrame子モデルのColorオプション・クラスのすべての品目に対してルールが反復処理されるときに、デカルト積を生成します。 色オプション区分の品目のユーザー定義属性の保持がTintオプション区分の品目にあるユーザー定義属性の保持と等しい場合、選択した色によって対応する染色がTRUEにプッシュされます。 そのため、たとえば、&color.userAttrs["Paints_AG.Stain"]
と&tint.userAttrs["Paints_AG.Stain"]
の両方がクリアの場合、白オプションを選択するとクリア・オプションが選択されます。
例: 1つのCONSTRAIN文に複数のイテレータ
COMPATIBLE
&color OF Frame.Color,
&tint OF Glass.Tint
WHERE &color.userAttrs["Paints_AG.Stain"] = &tint.userAttrs["Paints_AG.Stain"];
これと互換性のルールの違いは、このコードでは、過度に制約されることなく参加者が選択され、互換性テストではテストに合格しない参加者が選択解除される点です。
次の例では、ユーザー定義属性UDA2の値が等しい場合、機能aの数値は、aおよびbのすべてのオプションについて、機能bに寄与します。
1つのADD...TO文に複数のイテレータ
ADD &var1 TO &var2
FOR ALL &var1 IN {OptionsOf(a)}, &var2 IN {OptionsOf(b)}
WHERE &var1.userAttrs["UDA2"] = &var2.userAttrs["UDA2"];