算術制約

以下の制約では、すでに存在するCSint 型変数間の算術的な関係により定義される新しいCSint 型変数が作成されます。 これらの制約は、設定されたときにはフェイルしません。

CSint *cs_Add(CSint *vint1, CSint *vint2)

その領域がvint1 と vint2 の和と等しいCSint 型変数を返します。

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

cs_VAdd()は可変長引数を受け付けます(引数として与えられるCSint型変数の数は第1引数 nbVarsで指定されます。)

引数として与えられたCSint型変数の和であるようなCSint型変数を返します。

cs_VAdd(n, V1, V2, ..., Vn) = V1 + V2 + … + Vn

CSint *cs_Sub(CSint *vint1, CSint *vint2)

その領域がvint1 から vint2 を引いた値に等しいCSint 型変数を返します。

<注意!> この制約は、関数名の通り、返されるCSint型変数をv とすると、 vint1 = v + vint2 と等しくなります。 vint1 と vint2 は可換ではなく、v はvint1 と vint2 の差(絶対値)ではありません。

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

cs_VSub()は可変長引数を受け付けます(引数として与えられるCSint型変数の数は第1引数 nbVarsで指定されます。)

引数として与えられたCSint型変数 V1, V2, V3, … , Vn について、V1 - V2 - V3 - … - Vn であるようなCSint型変数を返します。

cs_VSub(n, V1, V2, V3, ..., Vn) = V1 - V2 - V3 - … - Vn

CSint *cs_Mul(CSint *vint1, CSint *vint2)

その領域がvint1 と vint2 の積と等しいCSint 型変数を返します。

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

cs_VMul()は可変長引数を受け付けます(引数として与えられるCSint型変数の数は第1引数 nbVarsで指定されます。)

引数として与えられたCSint型変数の積であるCSint型変数を返します。

cs_VMul(n, V1, V2, ..., Vn) = V1 * V2 * … * Vn

CSint *cs_Div(CSint *vint1, CSint *vint2)

vint1 を vint2で割った商になるような CSint 型変数を返します。

<注意!>この制約は、返されるCSint 型変数をvとすると、vint1 = v * vint2 として実装されています。 整数間の割り算(であって有理数ではない)のため、実装の方法の違いは結果の違いになりえます。 また、vint2 が 0 の場合にも本関数はフェイルしません。このときvは(INTMIN..INTMAX)の領域を持つものとして作成されます。

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

cs_VDiv()は可変長引数を受け付けます(引数として与えられるCSint型変数の数は第1引数 nbVarsで指定されます。)

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

要素数が size のCSint 型変数の配列array の和に等しいCSint型変数を返します。.

CSint *cs_ScalProd(CSint **array, int *vector, int size)

要素数が size のCSint 型変数のベクトルarray と同じ要素数の整数のベクトル vector のスカラ積に等しいCSint型変数を返します。

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

cs_VScalProd() は可変長引数を受け付けます(CSin型変数および整数の数は第1引数nbVarsで指定されます)。

cs_VScalProd(n, V1, V2, …, Vn, c1, c2, …, cn) はCSint型変数のベクトル(V1, V2, …, Vn)と 整数のベクトル(c1, c1, …, cn)のスカラ積を返します。

CSint *cs_Abs(CSint *vint)

CSint 型変数 vint の絶対値と等しい CSint型変数を返します。