デモン
制約伝播の際には 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() が呼び出されます。
-
void cs_backtrackExt(CSint *vint, void *ext, void (*backtrack)(CSint *vint, void *ext))
バックトラックが発生し本関数の呼び出しコンテキストに戻った時に、 引数で渡されたCSint 型変数およびポインタを引数として、関数 backtrack() が呼び出されます。
-
void cs_eventConflict(CSint **array, int size, void (*conflict)(CSint *vint, int index, const CSvalueSelection *vs, CSint **array, int size, void *extra), void *extra)
CSint 型変数 array 内の変数で制約伝播が失敗したときに関数 conflict() が呼び出されます。 引数 extra は自由に使うことのできるvoid型変数へのポインタです。
conflict() が呼び出されたとき、引数は以下のようになります。
vint, index :制約伝播を引き起こした変数へのポインタと array での位置
vs : 変数に対して行った領域縮小の操作
その他の引数は、cs_eventConflict 呼び出し時に使用されたものと同じです。