File: fzn_alldifferent_except_0.mzn

package info (click to toggle)
gecode-snapshot 6.2.0%2Bgit20240207-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 35,308 kB
  • sloc: cpp: 475,516; perl: 2,077; makefile: 1,816; sh: 198
file content (24 lines) | stat: -rw-r--r-- 801 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
include "global_cardinality_low_up_closed.mzn";

/**  @group globals.alldifferent
  Constrain the array of integers \a vs to be all different except those
  elements that are assigned the value 0.
*/
predicate fzn_alldifferent_except_0(array[int] of var int: vs) =
    if length(vs)==0 then true
    else
    let {
      int: l = lb_array(vs);
      int: u = ub_array(vs);
    } in
    if l != -infinity /\ u != infinity then
    global_cardinality_low_up_closed(vs, [i | i in l..u],
                                     [0 | i in l..u],
                                     [if i==0 then length(vs) else 1 endif | i in l..u]
                                     )
    else
    forall(i, j in index_set(vs) where i < j) (
       (vs[i] != 0 /\ vs[j] != 0) -> vs[i] != vs[j]
    )
    endif
    endif;