1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
on-restart-benchmarks/share/minizinc/std/global_cardinality_low_up_closed.mzn
Jip J. Dekker fad1b07018 Squashed 'software/minizinc/' content from commit 4f10c8205
git-subtree-dir: software/minizinc
git-subtree-split: 4f10c82056ffcb1041d7ffef29d77a7eef92cf76
2021-06-16 14:06:46 +10:00

32 lines
1.4 KiB
MiniZinc

include "fzn_global_cardinality_low_up_closed.mzn";
include "fzn_global_cardinality_low_up_closed_reif.mzn";
/** @group globals.counting
Requires that for all \p i, the value \a cover[\p i] appears at least \a lbound[\p i]
and at most \a ubound[\p i] times in the array \a x.
The elements of \a x must take their values from \a cover.
*/
predicate global_cardinality_low_up_closed(array[$X] of var int: x,
array[$Y] of int: cover,
array[$Y] of int: lbound,
array[$Y] of int: ubound) =
assert(
index_sets_agree(cover,lbound) /\ index_sets_agree(cover,ubound),
"global_cardinality_low_up_closed: " ++
"cover, lbound and ubound must have identical index sets",
if length(x) == 0 then
assert(forall(l in array1d(lbound))( l <= 0) /\ forall(u in array1d(ubound))( u >= 0)
\/ length(cover) == 0,
"global_cardinality_low_up_closed: " ++
"lbound and ubound must allow a count of 0 when x is empty, or also be empty",
true)
elseif length(cover) == 0 then
assert(false,"global_cardinality_low_up_closed: " ++
"cover must be empty when x is empty",
false)
else
fzn_global_cardinality_low_up_closed(array1d(x), array1d(cover), array1d(lbound), array1d(ubound))
endif
);