git-subtree-dir: software/minizinc git-subtree-split: 4f10c82056ffcb1041d7ffef29d77a7eef92cf76
83 lines
4.0 KiB
MiniZinc
83 lines
4.0 KiB
MiniZinc
/***
|
|
@groupdef stdlib.enum Functions for enums
|
|
*/
|
|
|
|
%TODO: Document these
|
|
function set of int: anon_enum(int: n) = 1..n;
|
|
|
|
function set of int: anon_enum(array[int] of string: x);
|
|
|
|
|
|
/** @group stdlib.enum Return next greater enum value of \a x in enum \a e */
|
|
function $$E: enum_next(set of $$E: e, $$E: x);
|
|
/** @group stdlib.enum Return next greater enum value of \a x in enum \a e */
|
|
function opt $$E: enum_next(set of $$E: e, opt $$E: x) =
|
|
if occurs(x) then enum_next(e,deopt(x)) else <> endif;
|
|
/** @group stdlib.enum Return next greater enum value of \a x in enum \a e */
|
|
function var $$E: enum_next(set of $$E: e, var $$E: x) =
|
|
let { constraint x < max(e) } in x+1;
|
|
/** @group stdlib.enum Return next greater enum value of \a x in enum \a e */
|
|
function var opt $$E: enum_next(set of $$E: e, var opt $$E: x) =
|
|
if occurs(x) then enum_next(e,deopt(x)) else <> endif;
|
|
|
|
/** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */
|
|
function $$E: enum_prev(set of $$E: e, $$E: x);
|
|
/** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */
|
|
function opt $$E: enum_prev(set of $$E: e, opt $$E: x) =
|
|
if occurs(x) then enum_prev(e,deopt(x)) else <> endif;
|
|
/** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */
|
|
function var $$E: enum_prev(set of $$E: e, var $$E: x) =
|
|
let { constraint x > min(e) } in x-1;
|
|
/** @group stdlib.enum Return next smaller enum value of \a x in enum \a e */
|
|
function var opt $$E: enum_prev(set of $$E: e, var opt $$E: x) =
|
|
if occurs(x) then enum_prev(e,deopt(x)) else <> endif;
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function $$E: to_enum(set of $$E: X, int: x);
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function opt $$E: to_enum(set of $$E: X, opt int: x) =
|
|
if occurs(x) then to_enum(X, deopt(x)) else <> endif;
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function var $$E: to_enum(set of $$E: X, var int: x) =
|
|
let { constraint x in X } in x;
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function var opt $$E: to_enum(set of $$E: X, var opt int: x) =
|
|
if occurs(x) then to_enum(X, deopt(x)) else <> endif;
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function array[$U] of $$E: to_enum(set of $$E: X, array[$U] of int: x) =
|
|
let { array[int] of int: xx = array1d(x) } in
|
|
arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]);
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function array[$U] of opt $$E: to_enum(set of $$E: X, array[$U] of opt int: x) =
|
|
let { array[int] of opt int: xx = array1d(x) } in
|
|
arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]);
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function array[$U] of var $$E: to_enum(set of $$E: X, array[$U] of var int: x) =
|
|
let { array[int] of var int: xx = array1d(x) } in
|
|
arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]);
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function array[$U] of var opt $$E: to_enum(set of $$E: X, array[$U] of var opt int: x) =
|
|
let { array[int] of var opt int: xx = array1d(x) } in
|
|
arrayXd(x, [ to_enum(X,xx[i]) | i in index_set(xx)]);
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function set of $$E: to_enum(set of $$E: X, set of int: x) = { to_enum(X,i) | i in x };
|
|
|
|
%/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function var set of $$E: to_enum(set of $$E: X, var set of int: x) =
|
|
let { var set of X: y; constraint x subset X; constraint forall (i in X) (i in x <-> i in y); } in y;
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function array[$U] of set of $$E: to_enum(set of $$E: X, array[$U] of set of int: x) =
|
|
let { array[int] of set of int: xx = array1d(x) } in
|
|
arrayXd(x, [ to_enum(X, xx[i]) | i in index_set(xx)]);
|
|
|
|
/** @group stdlib.enum Convert \a x to enum type \a X */
|
|
function array[$U] of var set of $$E: to_enum(set of $$E: X, array[$U] of var set of int: x) =
|
|
let { array[int] of var set of int: xx = array1d(x) } in
|
|
arrayXd(x, [ to_enum(X, xx[i]) | i in index_set(xx)]);
|