高水準制約

以下の制約は、今までのものに比べてより複雑なものです。 これらは、これまでに述べてきたプリミティブとデモン(デモン 参照)により実現することができます。

<注意!>実際のiZ-Cにおける実装では、以下の制約は既述のプリミティブとデモンの組み合わせによるのではなく、 独自の実現方式を持ちます。

IZBOOL cs_IfEq(CSint *vint1, CSint *vint2, int val1, int val2)

vint1 が値 val1に即値化されたら、vint2 をval2 に即値化します。

vint2 が値 val2に即値化されたら、vint1 をval1 に即値化します。

IZBOOL cs_IfNeq(CSint *vint1, CSint *vint2, int val1, int val2)

CSint 型変数の組(vint1, vint2)は値(val1, val2)を持つことができません。

CSint *cs_Occur(CSint *vint, int val, CSint **array, int size)

値 val は vint 回array 中に出現しなくてはなりません。

<注意!>旧バージョンでは実装に不備がありました。本来ならば返り値は値 val が vint 回array 中に出現する (TRUE)かしない(FALSE)かを返す必要がありました。

旧バージョンとの互換性のため返り値は変更しませんが、 今後は cs_OccurConstraints() を使ってください。本APIは将来削除する予定です。

CSint *cs_OccurDomain(int val, CSint **array, int size)

array 中に値 val となりうる個数の範囲を返します。

IZBOOL cs_OccurConstraints(CSint *vint, int val, CSint **array, int size)

値 val は vint 回array 中に出現しなくてはなりません。

CSint *cs_Index(CSint **array, int size, int val)

返されるCSint 型変数をIndexとすると、長さ sizeの配列 arrayに対して要素制約 array[Index] = val が設定されます。

i ∈ domain(Index) ⇔ val ∈ domain(array[i])

CSint *cs_Element(CSint *index, int *values, int size)

返されるCSint 型変数をElementとすると、長さsizeの整数配列value について、Element = values[index]が設定されます。

CSint *cs_VarElement(CSint *index, CSint **array, int size)

返されるCSint 型変数をElementとすると、長さsizeの領域変数の配列array について、Element = array[index]が設定されます。

CSint *cs_Min(CSint **array, int size)

array により参照されるCSint 型変数のうち最小のものの値と等しいCSint 型変数を返します。

CSint *cs_VMin(int nbVars, CSint *vint, ...)

cs_VMin() は可変長引数をとります(引数の数は最初の引数nbVarsに指定されます)。

CSint *cs_Max(CSint **array, int size)

array により参照されるCSint 変数のうち最大のものの値と等しいCSint 型変数を返します。

CSint *cs_VMax(int nbVars, CSint *vint, ...)

cs_VMax() は可変長引数をとります(引数の数は最初の引数nbVarsに指定されます)。