# Module Gcc

module Gcc: `sig`

.. `end`

Global Cardinality Constraint

`type `

level =

val cstr : `?level:level -> Var.Fd.t array -> (Var.Fd.t * int) array -> Cstr.t`

`cstr (?level:High) vars distribution`

returns a constraint ensuring
that for each pair `(c,v)`

of cardinal variable `c`

and integer
value `v`

in the list `distribution`

, `c`

variables in the array
`vars`

will be instantiated to `v`

, i.e. `card {vi = v | vi in vars} = c`

.
All values `v`

in `distribution`

must be different otherwise the exception
`Invalid_argument`

is raised. Three levels of propagation are provided :
`Basic`

is the quickest, `High`

performs the highest amount of propagation.
`level`

default value is `High`

.
The constraint posts the redundant constraint stating that the sum of the
cardinals is equal to the number of variables. This constraint is also
known as the "distribute" constraint.
Not reifiable.