implies
implies |
Purpose
This composite constraint states an implication 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 implies C2 -------------------------- false false true false true true true false false true true true
Synopsis
function implies(C1:cpctr, C2:cpctr) : cpctr
Arguments
|
C1
|
the left member constraint of the implication
|
|
C2
|
the right member constraint of the implication
|
Return value
An implication constraint over C1 and C2
Example
The following example shows how to use the implication 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
