領域変数と基本的な関数

CSint型の変数は整数の領域変数です。定義済みのiZ-Cの関数では、CSintへのポインタ (CSint*)のみが使用されます。 領域変数はライブラリの管理下にあるため、作成した領域変数を利用者が解放することはできません。

コンストラクタ

CSint 型の領域変数は、以下の関数によって構築することができます。

CSint *cs_createCSint(int min, int max)

{ min .. max } を領域とするCSint 型変数を作成します。

CSint *cs_createNamedCSint(int min, int max, char *name)

{ min .. max } を領域とするCSint 型変数を作成し、名前をつけます。 (cs_createCSint() の後にcs_setName()を用いるのと同じです。)

CSint *CSINT(int n)

すでに即値化された(つまり、その領域の要素が1つしかない)CSint 型変数を作成するのに使います。 この関数は、cs_createCSint(n , n)と等価です。

CSint *cs_createCSintFromDomain(int *array, int size)

size の大きさをもつ array により定義される領域を持つCSint型変数を作成します。

CSint **cs_createCSintArray(int nbVars, int min, int max)

nbVars 個の CSint 型変数よりなる配列を作成します。各変数の領域は、すべて { min .. max }になります。

<注意> 本APIの返り値は領域変数の実装であるCSintへのポインタの配列です。 ポインタを格納した配列も制約処理系の管理下となるため、作成した配列を利用者が解放することはできません。

領域変数の情報にアクセスするための関数

CSint 型の領域変数に関する情報にアクセスするためには、以下の基本的な関数を使用します。

int cs_getMin(CSint *vint)

vint の領域の最小値を返します。

int cs_getMax(CSint *vint)

vint の領域の最大値を返します。

int cs_getNbElements(CSint *vint)

vint の領域に含まれる要素数を返します。

int cs_getNbConstraints(CSint *vint)

vint に設定されている制約の数を返します。設定されたときに失敗した制約は数に含まれません。

char *cs_getName(CSint *vint)

cs_setName() を用いて vint に設定された名前を返します。

CSint型の変数の名前は、cs_printf()cs_fprintf() でフォーマット記述子 %T を使った場合にも表示されます。

int cs_getNextValue(CSint *vint, int val)

vint の領域に含まれる値の集合の中で、val よりも大きい最初の要素を返します。

val が cs_getMax( vint ) で返る値より大きい場合には、本関数はINT_MAX (int 型の最大値)を返します。

以下の例では、cs_getNextValue() は for 文中で使われています。:

void display(CSint *vint)
{
  int val;
  for (val = cs_getMin(vint); val <= cs_getMax(vint); val = cs_getNextValue(vint, val))
      printf("%d ", val);
}

上記の関数 display() は CSint 型の変数のとりうる値(=領域に含まれる値)をすべて、標準出力に昇順に出力します。

int cs_getPreviousValue(CSint *vint, int val)

vint の領域に含まれる値の集合の中で、val よりも小さい最初の要素を返します。

val が cs_getMin( vint ) で返る値より小さい場合には、本関数はINT_MIN (int 型の最小値)を返します。

int *cs_getDomain(CSint *vint)

vint の領域の要素を長さcs_getNbElements(vint) の配列の各要素の値として返します。 返された配列のメモリは不要になったら cs_freeDomain で解放する必要があります。

void cs_freeDomain(int *array)

cs_getDomain() で取得した配列のメモリを解放します。

IZBOOL cs_isIn(CSint *vint, int val)

valvint の領域の要素であれば TRUE を返します。そうでなければ FALSE を返します。

void cs_setName(CSint *vint, char *name)

CSint型変数に名前を付けるために使います。 CSint型変数が表示されるとき(cs_printf() あるいは cs_fprintf() を使用します)、 付けられた名前も一緒に表示されます。(書式指定子 %T が指定された場合)

IZBOOL cs_isFree(CSint *vint)

vint がまだ即値化されていなければ TRUE を返します。 そうでなければFALSEを返します。

「即値かされていない」とはすなわち、cs_getNbElements( vint ) > 1 あるいは cs_getMin( vint ) < cs_getMax( vint ) であるような状態です。

IZBOOL cs_isInstantiated(CSint *vint)

vint が即値化されていれば TRUEを返します 。そうでなければFALSEを返します。

「即値かされている」とはすなわち、cs_getNbElements( vint ) == 1 あるいは cs_getMin( vint ) == cs_getMax( vint ) であるような状態です。

int cs_getValue(CSint *vint)

CSint 変数 vint が即値化されていれば、その値を返します。vint がまだ即値化されていない場合にはエラーが発生し (cs_getErr()を呼び出すとCS_ERR_GETVALUEが返ります。)、 cs_getValue( vint )は cs_getMin( vint )を返します。(デフォルトの動作の場合)

void cs_printf(const char *control, ...)

この関数は、CSint 型の変数およびCSint 型の変数の配列用の変換指定が3種類追加された以外は、C言語で標準のprintf()関数と同じです。

  • cs_printf("%T", vint)vint の名前を (名前があれば)表示し、ついでその領域を標準出力に出力します。

  • cs_printf("%D", vint)vint の領域のみを標準出力に出力します。

  • cs_printf("%A", array, size)size 個の要素よりなるCSint型変数の配列 array に含まれる各変数を表示します。もし名前があれば名前も表示します。変数間はコンマで区切られます。

void cs_fprintf(FILE *f, const char *control, ...)

この関数は引数として出力先のファイルを示すFILE ポインタ f をとる以外は cs_printf() と同じです。

領域に関する制約

以下の関数は制約であり、設定した時点でフェイルする(つまり、FALSE を返す)ことがあります。

IZBOOL cs_InArray(CSint *vint, int *array, int size)

CSint型変数 vint が長さ size の整数の配列 array に含まれる値を領域として持つように制約します。

IZBOOL cs_NotInArray(CSint *vint, int *array, int size)

CSint型変数 vintarray 配列に含まれる値を領域として持たないように制約します。 array に含まれるすべての値は vint の領域から取り除かれます。

これは以下のように定義できるでしょう。:

IZBOOL cs_notInArray(CSint *vint, int *array, int size) {
  int i;
  for (i = 0; i < size; i++)
   if (!cs_NEQ(vint, array[i])
     return FALSE;

  return TRUE;
}
IZBOOL cs_InInterval(CSint *vint, int min, int max)

CSint型変数 vint が{ min .. max }に含まれるような領域を持つように制約します。 (つまり cs_getMin( vint ) >= min かつ cs_getMax( vint ) <= max が成立する。)

これは以下のように定義できるでしょう。:

IZBOOL cs_InInterval(CSint *vint, int min, int max) {
  return(cs_GE(vint, min) && cs_LE(vint, max));
}
IZBOOL cs_NotInInterval(CSint *vint, int min, int max)

CSint 型変数 vint が区間{ min .. max }に含まれる値を領域として持たないように制約します。 vint の領域で区間{ min .. max }に含まれる値はすべて取り除かれます。

これは以下のように定義できるでしょう。:

IZBOOL cs_NotInInterval(CSint *vint, int min, int max) {
  int i;
  for (i = min; i <= max; i++)
    if (!cs_NEQ(vint, i))
      return FALSE;

  return TRUE;
}