デモン

制約伝播の際には CSint型変数の領域の変化を表わす幾つかのイベントが発生します。イベントは排他的な以下の4種類に分類されます。

Known:

領域は1つの値に縮小された (CSint型変数が即値化された場合です。)

Ex.: cs_EQ(vint, 0); /* Knownイベントが発生する例 */

NewMin:

領域の下限が変更された (必ず以前より大きな値に変化します。)

Ex.: cs_GT(vint, 0);

NewMax:

領域の上限が変更された (必ず以前より小さな値に変化します。)

Ex: cs_LT(vint, 0);

Neq:

領域から1つの値が取り除かれた

Ex: cs_NEQ(vint, 0);

これらのイベントが排他的であるとは、以下のことを意味します。

  • known イベント発生する場合には、newMin, newMax, neq イベントは発生しません。
  • newMinイベントおよびnewMaxイベントが発生する場合には、neq イベントは発生しません。
IZBOOL cs_eventAllKnown(CSint **array, int size, IZBOOL (*allKnown)(CSint **array, int size, void *extra), void *extra)

allKnown()関数はarrayによって参照されるすべてのCSint型変数が即値化した (つまりknownイベントが発生した)時に呼び出されます。

cs_eventAllknown()が呼び出されたときにすでにarrayで参照できるCSint型変数がすべて即値化されている場合には、 直ちにallKnown()が呼ばれ、その結果が返ります。 そうでなければ、本関数は単にTRUEを返します。

引数extraは自由に使うことのできるvoid型変数へのポインタです。allKnown(array, size, extra) が呼ばれる時に、 引数extraとしてcs_eventAllKnown(array, size, allKnown, extra)で渡されたextraが渡されます。

IZBOOL cs_eventKnown(CSint **array, int size, IZBOOL (*known)(int val, int index, CSint **array, int size, void *extra), void *extra)

CSint 型変数array[index]が即値化された時に、関数 known()が呼び出されます。

引数extraは自由に使うことのできるvoid型変数へのポインタです。known(val, index, array, size, extra) が 呼ばれる時に、引数extraとしてcs_eventKnown(array, size, known, extra) で渡されたextraが渡されます。

void cs_eventNewMin(CSint **array, int size, IZBOOL (*newMin)(CSint *vint, int index, int oldMin, CSint **array, int size, void *extra), void *extra)

CSint 型変数array[index]の領域の下限が増大するたびに関数newMin()が呼び出されます。

引数extraは自由に使うことのできるvoid型変数へのポインタです。 newMin(vint, index, oldMin, array, size, extra) が呼ばれる時に、 引数extraとしてcs_eventNewMin(array, size, newMin, extra) で渡されたextraが渡されます。

void cs_eventNewMax(CSint **array, int size, IZBOOL (*newMax)(CSint *vint, int index, int oldMax, CSint **array, int size, void *extra), void *extra)

CSint 型変数array[index]の領域の上限が減少するたびに関数newMax()が呼び出されます。

引数extraは自由に使うことのできるvoid型変数へのポインタです。 newMax(vint, index, oldMax, array, size, extra) が呼ばれる時に、 引数extraとしてcs_eventNewMax(array, size, newMax, extra) で渡されたextraが渡されます。

void cs_eventNeq(CSint **array, int  size, IZBOOL (*neq)(CSint *vint, int index, int neqValue, CSint **array, int size, void *extra), void *extra)

CSint 型変数array[index]の領域の上限・下限以外の値が取り除かれるたびに関数neq()が呼び出されます。 (ただし即値化された時を除きます。)

引数extraは自由に使うことのできるvoid型変数へのポインタです。 neq(vint, index, neqValue, array, size, extra) が呼ばれる時に、 引数extraとしてcs_eventNeq(array, size, neq, extra) で渡されたextraが渡されます。

void cs_backtrack(CSint *vint, int i, void (*backtrack)(CSint *vint, int i))

バックトラックが発生し本関数の呼び出しコンテキストに戻った時に、 引数で渡されたCSint 型変数および整数を引数として、backtrack()関数が呼び出されます。