- Function cp::Lexicographic(valueBinding, firstValues, secondValues, allowEqual)
cp::Lexicographic
The function cp::Lexicographic ensures that the data of one
expression comes lexicographically (i.e. according to the set order)
before another expression. This function is often used to reduce
symmetry in two variables.
Mathematical Formulation
cp::Lexicographic(k,x_k,y_k[,e]) is equivalent to
where \(n\) equals card(range(k)).
Function Prototype
cp::Lexicographic(
valueBinding, ! (input) an index binding
firstValues, ! (input/output) an expression
secondValues, ! (input/output) an expression
allowEqual ! (optional input) an expression
)
Arguments
- valueBinding
The index binding over which the next two arguments are defined.
- firstValues
The expression that should lexicographically come before
secondValues. It is defined over index bindingvalueBindingand may involve variables.- secondValues
The expression that should lexicographically come after
firstValues. It is defined over index bindingvalueBindingand may involve variables.- allowEqual
When this optional argument is specified and non-zero, the expressions
firstValuesandsecondValuesare allowed to be equal. TheallowEqualexpression may not involve variables. The default of this argument is 0.
Return Value
This function returns 1 if the above condition is met. When the index binding
valueBindingis empty, this function returns
0 if allowEqual is 0
1 if allowEqual is not 1.
Note
Please note that the comparison between the two expressions is done, based on the complete specified index binding and not pair-wise for every element in that index domain.
Example
The constraint x_before_y ensures that the identifier x comes
lexicographically before the identifier y.
Constraint x_before_y {
Definition : cp::Lexicographic( i, x(i), y(i) );
}
Suppose
x = data { 'a1' : 1, 'a2' : 2, 'a3' : 2 }
y = data { 'a1' : 1, 'a2' : 3, 'a3' : 1 }
Then the constraint x_before_y is met. Please note that
in the case of ‘a3’, x = 2 and y = 1. Allthough 2 does not come
lexicographically before 1, the constraint is met. The ordering is
based on the whole index domain, and not ‘pair wise’. Because for ‘a2’
2 comes lexicographically before 3, the x- and y-values for ‘a3’
are irrelevant here. Higher dimensional variables can also be compared
using cp::Lexicographic as is illustrated next. Consider the following
declarations:
Set S {
Index : i, j;
InitialData : data { a, b, c };
}
Variable X {
IndexDomain : (i,j);
Range : binary;
}
Variable Y {
IndexDomain : (i,j);
Range : binary;
}
Constraint xylex {
Definition : {
cp::Lexicographic(
(i,j)|ord(i)<=ord(j),
x(i,j), y(i,j))
}
}
Instantiated constraints are presented in the
constraint listing. For the constraint xylex this looks as follows:
---- xylex
xylex .. [ 1 | 1 | after ]
cp::Lexicographic({X(a,a), X(a,b), X(a,c), X(b,b), X(b,c), X(c,c)},
{Y(a,a), Y(a,b), Y(a,c), Y(b,b), Y(b,c), Y(c,c)},
allowEqual: 0)
name lower level upper
X(a,a) 0 0 1
X(a,b) 0 0 1
X(a,c) 0 0 1
X(b,b) 0 0 1
X(b,c) 0 0 1
X(c,c) 0 0 1
Y(a,a) 0 1 1
Y(a,b) 0 0 1
Y(a,c) 0 0 1
Y(b,b) 0 0 1
Y(b,c) 0 0 1
Y(c,c) 0 0 1
Here AIMMS visits all elements of the two dimensional
variables x and y, by varying the indices i and j in the
index binding (i,j) and adhering to the index domain condition
ord(i)<=ord(j). In the index binding (i,j) the index j comes
after the index i and thus the index j is varied more.
See also
The help text associated with the option . This option can be found via the AIMMS menu category .
Constraint Programming on Constraint Programming in the Language Reference.
The Global Constraint Catalog, which references this function as
lex_lessandlex_lesseq.