機械翻訳について

CDLイテレータ文およびCOLLECT演算子

COLLECT演算子はイテレータ文をサポートしています。

このセクションの内容は次のとおりです:

  • 演算子COLLECTの構文

  • イテレータがCOLLECT演算子を使用して、集計関数に渡されるコレクションのドメインを指定する方法。

  • DISTINCTキーワードを使用した属性からの個別値の収集

COLLECT演算子

Min(...)、Max(...)、Sum(...)、AnyTrue(...)などの集計関数は、値のコレクションをオペランドとして受け入れます。 イテレータは、COLLECT演算子を使用して、集計関数に渡されるコレクションのドメインを指定できます。 多くの場合、FOR ALLはその目的を果たします。 次の例は、COLLECT演算子およびFOR ALLイテレータを使用するオプション機能aの子のコレクションの最大値の単一の貢献を示しています。

COLLECT演算子、単一貢献

ADD Max({COLLECT &var FOR ALL &var IN {OptionsOf(a)}}) TO d;

前述の例の結果は、次の例と同じです:

ADD Max &var TO d
FOR ALL &var IN {OptionsOf(a)} ;

集計を制限する場合は、COLLECT演算子が必要です。 次の例は、FOR ALL句およびWHERE句の反復によって、ユーザー定義属性UDA1を含まないコレクション {Option11, Option32, OptionsOf(Feature1)} のすべての要素でエラーが発生するルールを示しています

CONSTRAIN &varA IMPLIES model.optionClass.item
FOR ALL &varA IN {Option11, Option32, OptionsOf(optionFeature1)}
WHERE &varA.userAttrs["UDA1"] = 5;

次の例では、COLLECTを使用してエラーが回避されます。

COLLECT演算子拠出金

CONSTRAIN &varA IMPLIES model.optionClass.item
FOR ALL &varA IN {Option11, Option32, {COLLECT &varB
    FOR ALL &varB IN OptionsOf(optionFeature2)
WHERE &varB.userAttrs["UDA1"] = 5}};

COLLECTは、コレクションを想定する任意のコンテキストで使用できます。 COLLECT演算子は、複雑な式およびWHERE句とともに使用して、コレクションのソース・ドメインの要素をフィルタ処理できます。

COLLECTはコレクションを返す演算子であるため、コレクション・リテラルに有効な推測データ型があるかぎり、コレクション・リテラルの内部でも使用できます。 コンフィギュレータ・コンパイラは、論理生成時にコレクション・リテラルをフラット化します。これにより、コレクションを連結できます。 詳細は、コレクション・リテラルを参照してください。

戻り型はシングルトンのコレクションであるため、COLLECT演算子には1つのイテレータのみを指定できます。 CDLでは、COLLECT演算子を使用したデカルト積の使用はサポートされていません。

COLLECT演算子はIN句とWHERE句に動的変数を入れることができません。これにより、コンパイル時に不明なコレクションが発生する可能性があります。

COLLECT演算子では、次の例に示すように、DISTINCTキーワードを使用してユーザー定義属性から個別の値を収集できます。これにより、ユーザー定義属性Shapeに対してオプション・クラスoptionClass3から異なる値を選択できなくなります。optionClass3には最小数量はゼロで、最大数量に制限はありません。

DISTINCTを使用したCOLLECT演算子

AnyTrue({COLLECT &opt1
        FOR ALL &opt1 IN {'optionClass3'.Options()}
        WHERE &opt1.userAttrs["Physical.Shape"] = &shape}) 
EXCLUDES 
AnyTrue({COLLECT &opt2  
        FOR ALL &opt2 IN {'optionClass3'.Options()} 
        WHERE &opt2.userAttrs["Physical.Shape"] <> &shape}) 
FOR ALL &shape IN 
        {COLLECT DISTINCT &node.userAttrs["Physical.Shape"]
        FOR ALL &node IN 'optionClass3'.Options()}