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

# exclude_range(?Var, ++Lo, ++Hi)

Exclude the elements Lo..Hi from the domain of Var.

Var
  Integer variable or integer
Lo
  Integer lower bound of range to exclude
Hi
  Integer upper bound of range to exclude

## Description

Primitive for excluding the integers between Lo and Hi (inclusive) from the domain of an integer variable. The call may fail (when the domain of Var has no elements outside the range Lo..Hi), succeed (possibly updating the variable's domain), or instantiate the variable (in the case where the domain gets restricted to a singleton value).

Note that this predicate is intended for use only in implementing constraint propagators, and should not be called from ordinary user code. It differs from the usual constraint predicates with respect to the execution of delayed goals. If the call to exclude_range/3 results in a domain change, any delayed goals suspended on that change will be scheduled for execution, as normal. However, exclude_range/3 does not call the woken goal scheduler (wake/0), so these goals may not be executed immediately. (It is possible that under some circumstances the goals will be executed, if wake/0 is called indirectly - one example would be by the unify handler if the variable becomes ground - but this should not be relied upon.) To ensure that the goals are eventually executed, the caller should arrange for wake/0 to be called at some appropriate point in the subsequent execution. Please see the "Advanced Control Features" section of the User Manual for more information about woken goal management.

## Examples

    [eclipse 3]: X :: 0..10, exclude_range(X, 4, 7).
    X = X{[0 .. 3, 8 .. 10]}
    Yes (0.00s cpu)

    [eclipse 4]: X :: 0..10, exclude_range(X, 9, 20).
    X = X{0 .. 8}
    Yes (0.00s cpu)

    [eclipse 5]: X :: [2, 4, 6 .. 10], exclude_range(X, 4, 12).
    X = 2
    Yes (0.00s cpu)

## See Also

exclude / 2, impose_min / 2, impose_max / 2, impose_domain / 2