[ library(gfd) | Reference Manual | Alphabetic Index ]

# <ConsistencyModule:> count(+Value, ?Vars, +Rel, ?N)

Constrain the number of occurrence of Value in Vars (Occ) to satisfy the relation Occ Rel N

?Value
  An integer or a (domain) variable (array notation accepted)
?Vars
  A collection (a la collection_to_list/2) of (domain) variables or integers
+Rel
  One of the atom: #>, #>=, #<, #=<, #=, #\=
?N
  An integer or (domain) variable (array notation accepted)

## Description

Constrain the number of occurrences of Value in Vars to satisfy the constraint defined by Rel:

               Rel N

Rel can be one of #>, #>=, #<, #=<, #=, #\= (or equivalently, >, >=, <, =<, =, \=).

occurrences/3, atmost/3, atleast/3 are defined using count/3. For example,

             atmost(N, Vars, Value)

is defined by:

            count(Value, Vars, (#=<), N)

This constraint can be embedded in a constraint expression in its functional form (without the last argument).

ConsistencyModule is the optional module specification to give the consistency level for the propagation for this constraint: gfd_gac the (default) and gfd_bc. Both propagation do not achive bound consistency in all cases, and gfd_bc is different from gfd_gac only if Value is a domain variable, as its domain is not pruned with gfd_bc.

This constraint is known as count in the global constraint catalog. It is implemented using gecode's count() constraint (variants with int or IntVar for argument representing Value).

### Modes and Determinism

- count(+, +, +, +)
- count(?, +, +, +)
- count(?, +, +, ?)
- count(+, +, +, ?)

## Examples

    [eclipse 33]: count(5, [](4,5,5,4,5), (#>=), 2).   % succeed

    [eclipse 34]:  count(5, [](4,5,5,4,5), (#>), 2).   % succeed

    [eclipse 35]: count(5, [](4,5,5,4,5), (#=), 2).    % fail

    [eclipse 36]: count(5, [](4,5,5,4,5), (#\=), 2).   % succeed

    [eclipse 37]: count(5, [](4,5,5,4,5), (#=<), 2).   % fail

    [eclipse 38]: count(5, [](4,5,5,4,5), (#<), 2).    % fail

    [eclipse 39]: count(5, [](4,5,5,4,5), (#>=), 3).   % succeed

    [eclipse 40]: count(5, [](4,5,5,4,5), (#>), 3).    % fail

    [eclipse 41]: count(5, [](4,5,5,4,5), (#=), 3)     % succeed

    [eclipse 42]: N :: [3,5], count(3, [3,A,3,5,3,3], (#=), N).

    N = 5
    A = 3

    [eclipse 43]:  N :: [3,5], count(3, [3,A,3,5,3], (#=), N).

    N = 3
    A = A{[-1000000 .. 2, 4 .. 1000000]}

    [eclipse 44]:  N :: [3,5], count(3, [3,A,3,5,3], (#<), N).

    N = 5
    A = A{[-1000000 .. 1000000]}

    [eclipse 45]:  N :: [3,5], count(3, [3,A,3,5,3], (#>), N).

    N = 3
    A = 3

    [eclipse 46]:  N :: [3,5], count(3, [3,A,3,5,3], (#>=), N).

    N = 3
    A = A{[-1000000 .. 1000000]}

    [eclipse 47]: N :: [3,5], count(3, [3,A,3,5,3], (#=<), N).

    N = N{[3, 5]}
    A = A{[-1000000 .. 1000000]}

    [eclipse 48]: N :: [3,5], count(3, [3,A,3,5,3], (#\=), N).

    N = N{[3, 5]}
    A = A{[-1000000 .. 1000000]}