equiv
| equiv | 
  Purpose
 
 
 This composite constraint states an equivalence between two constraints C1 and C2 (
 C1 ⇒ C2), which are not individually posted. The satisfaction of the resulting constraint is given by the following truth table:
 
 C1 C2 C1 equiv C2 -------------------------- false false true false true false true false false true true true
  Synopsis
 
 function equiv(C1:cpctr,C2:cpctr) : cpctr
 
  Arguments
 
 | 
     C1 
     | 
     the left member constraint of the equivalence
     | 
| 
     C2 
     | 
     the right member constraint of the equivalence
     | 
  Return value
 
 
 An equivalence constraint over C1 and C2
 
  Example
 
 
 The following example shows how to use the equivalence constraint
 
 model "Logical constraints"
 uses "kalis"
! Default bounds for all variables
 setparam("KALIS_DEFAULT_LB", 0); setparam("KALIS_DEFAULT_UB", 5)
 declarations
  A, B, C, D, E: cpctr
  x,y,z,b: cpvar
 end-declarations
 setname(b, "b"); setname(x, "x")
 setname(y, "y"); setname(z, "z")
 b <= 1
! Definition of constraints (without posting)
 A:= x >= y + 5 + z + b
 B:= b = 1
 C:= all_different({x, y, z})    ! Cannot be used with 'equiv'
 D:= y <= z
 E:= distance(y,z) <= 2
 writeln("Original domains: ", b, " ", x, " ", y, " ", z)
! If x, y and z are all different then b equals 1 (C=>B),
! if b equals 1 then x, y and z are all different (B=>C).
 implies(C, B)
 implies(B, C)
! E<=>B: b equals 1 if and only if |y-z| <= 2
 equiv(E, B)
! A<=>D: x >= y + 5 + z + b if and only if y <= z
 equiv(A, D)
 writeln("With constraints: ", b, " ", x, " ", y, " ", z)
 while (cp_find_next_sol)
  writeln("Solution: ", b, " ", x, " ", y, " ", z)
end-model
 
  Related topics
 
  
