2.2.3. Restrictions

When defining the arguments of a global constraint, it is often the case that one needs to express additional conditions that refine the type declarations of its arguments. For this purpose we provide restrictions that allow for specifying these additional conditions. Each restriction has a name and a set of arguments and is described by the following items:

  • A small paragraph first describes the effect of the restriction,

  • An example points to a constraint using the restriction,

  • Finally, a ground instance, preceded by the symbol , which satisfies the restriction is given. Similarly, a ground instance, preceded by the symbol , which violates the restriction is proposed. In this latter case, a bold font may be used for pointing to the source of the problem.

Currently the list of restrictions is:

  • 𝚒𝚗_𝚕𝚒𝚜𝚝(𝙰𝚛𝚐,𝙻𝚒𝚜𝚝𝙰𝚝𝚘𝚖𝚜)

    • 𝙰𝚛𝚐 is an argument of type 𝚊𝚝𝚘𝚖,

    • 𝙻𝚒𝚜𝚝𝙰𝚝𝚘𝚖𝚜 is a non-empty list of distinct atoms.

    This restriction forces 𝙰𝚛𝚐 to be one of the atoms specified in the list 𝙻𝚒𝚜𝚝𝙰𝚝𝚘𝚖𝚜.

    EXAMPLE: An example of use of such restriction can be found in the 𝚌𝚑𝚊𝚗𝚐𝚎(𝙽𝙲𝙷𝙰𝙽𝙶𝙴,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂,𝙲𝚃𝚁) constraint: 𝚒𝚗_𝚕𝚒𝚜𝚝(𝙲𝚃𝚁,[=,,<,,>,]) forces the last argument 𝙲𝚃𝚁 of the 𝚌𝚑𝚊𝚗𝚐𝚎 constraint to take its value in the list of atoms [=,,<,,>,].

    𝚌𝚑𝚊𝚗𝚐𝚎(1,𝚟𝚊𝚛-4,𝚟𝚊𝚛-4,𝚟𝚊𝚛-4,𝚟𝚊𝚛-6,)

    𝚌𝚑𝚊𝚗𝚐𝚎(1,𝚟𝚊𝚛-4,𝚟𝚊𝚛-4,𝚟𝚊𝚛-4,𝚟𝚊𝚛-6,3)

  • 𝚒𝚗_𝚕𝚒𝚜𝚝(𝙰𝚛𝚐,𝙰𝚝𝚝𝚛,𝙻𝚒𝚜𝚝𝙸𝚗𝚝𝙾𝚛𝙰𝚝𝚘𝚖)

    • 𝙰𝚛𝚐 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛 is an attribute of type 𝚒𝚗𝚝 or of type 𝚊𝚝𝚘𝚖 of the collection denoted by 𝙰𝚛𝚐,

    • When 𝙰𝚝𝚝𝚛 is an attribute of type 𝚒𝚗𝚝, 𝙻𝚒𝚜𝚝𝙸𝚗𝚝𝙾𝚛𝙰𝚝𝚘𝚖 is a non-empty list of distinct integers; otherwise, when 𝙰𝚝𝚝𝚛 is an attribute of type 𝚊𝚝𝚘𝚖, 𝙻𝚒𝚜𝚝𝙸𝚗𝚝𝙾𝚛𝙰𝚝𝚘𝚖 is a non-empty list of distinct atoms.

    This restriction forces for all items of the collection 𝙰𝚛𝚐, the attribute 𝙰𝚝𝚝𝚛 to take its value within the list 𝙻𝚒𝚜𝚝𝙸𝚗𝚝𝙾𝚛𝙰𝚝𝚘𝚖.

  • 𝚒𝚗_𝚊𝚝𝚝𝚛(𝙰𝚛𝚐1,𝙰𝚝𝚝𝚛1,𝙰𝚛𝚐2,𝙰𝚝𝚝𝚛2)

    • 𝙰𝚛𝚐1 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛1 is an attribute of type 𝚍𝚟𝚊𝚛 or of type 𝚒𝚗𝚝 of the collection denoted by 𝙰𝚛𝚐1,

    • 𝙰𝚛𝚐2 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛2 is an attribute of type 𝚒𝚗𝚝 of the collection denoted by 𝙰𝚛𝚐2.

    Let 𝒮 2 denote the set of values assigned to the 𝙰𝚝𝚝𝚛2 attributes of the items of the collection 𝙰𝚛𝚐2. This restriction forces the following condition: for all items of the collection 𝙰𝚛𝚐1, the attribute 𝙰𝚝𝚝𝚛1 takes its value in the set 𝒮 2 .

    EXAMPLE: An example of use of such restriction can be found in the 𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎𝚜(𝚃𝙰𝚂𝙺𝚂,𝙼𝙰𝙲𝙷𝙸𝙽𝙴𝚂,𝙲𝚃𝚁) constraint: 𝚒𝚗_𝚊𝚝𝚝𝚛(𝚃𝙰𝚂𝙺𝚂, 𝚖𝚊𝚌𝚑𝚒𝚗𝚎, 𝙼𝙰𝙲𝙷𝙸𝙽𝙴𝚂, 𝚒𝚍) forces that the 𝚖𝚊𝚌𝚑𝚒𝚗𝚎 attribute of each task of the 𝚃𝙰𝚂𝙺𝚂 collection correspond to a machine identifier (i.e., an 𝚒𝚍 attribute of the 𝙼𝙰𝙲𝙷𝙸𝙽𝙴𝚂 collection).

    𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎𝚜( 𝚖𝚊𝚌𝚑𝚒𝚗𝚎-1 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚖𝚊𝚌𝚑𝚒𝚗𝚎-1 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚖𝚊𝚌𝚑𝚒𝚗𝚎-2 𝚘𝚛𝚒𝚐𝚒𝚗-1 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

    𝚖𝚊𝚌𝚑𝚒𝚗𝚎-1 𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1,

    𝚒𝚍-1 𝚌𝚊𝚙𝚊𝚌𝚒𝚝𝚢-9, 𝚒𝚍-2 𝚌𝚊𝚙𝚊𝚌𝚒𝚝𝚢-8, )

    𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎𝚜( 𝚖𝚊𝚌𝚑𝚒𝚗𝚎-5 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚖𝚊𝚌𝚑𝚒𝚗𝚎-1 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚖𝚊𝚌𝚑𝚒𝚗𝚎-2 𝚘𝚛𝚒𝚐𝚒𝚗-1 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

    𝚖𝚊𝚌𝚑𝚒𝚗𝚎-1 𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1,

    𝚒𝚍-1 𝚌𝚊𝚙𝚊𝚌𝚒𝚝𝚢-9, 𝚒𝚍-2 𝚌𝚊𝚙𝚊𝚌𝚒𝚝𝚢-8, )

  • 𝚍𝚒𝚜𝚝𝚒𝚗𝚌𝚝(𝙰𝚛𝚐,𝙰𝚝𝚝𝚛𝚜)

    • 𝙰𝚛𝚐 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛𝚜 is an attribute of type 𝚒𝚗𝚝 or 𝚍𝚟𝚊𝚛, or a list (possibly empty) of distinct attributes of type 𝚒𝚗𝚝 or 𝚍𝚟𝚊𝚛 of the collection denoted by 𝙰𝚛𝚐.

    For all pairs of distinct items of the collection 𝙰𝚛𝚐 this restriction forces that there be at least one attribute specified by 𝙰𝚝𝚝𝚛𝚜 with two distinct values. When 𝙰𝚝𝚝𝚛𝚜 is the empty list all items of the collection 𝙰𝚛𝚐 should be distinct.

    EXAMPLE: An example of use of such restriction can be found in the 𝚌𝚢𝚌𝚕𝚎(𝙽𝙲𝚈𝙲𝙻𝙴,𝙽𝙾𝙳𝙴𝚂) constraint: 𝚍𝚒𝚜𝚝𝚒𝚗𝚌𝚝(𝙽𝙾𝙳𝙴𝚂,𝚒𝚗𝚍𝚎𝚡) forces that all 𝚒𝚗𝚍𝚎𝚡 attributes of the 𝙽𝙾𝙳𝙴𝚂 collection take distinct values.

    𝚌𝚢𝚌𝚕𝚎(2,𝚒𝚗𝚍𝚎𝚡-1 𝚜𝚞𝚌𝚌-2,𝚒𝚗𝚍𝚎𝚡-2 𝚜𝚞𝚌𝚌-1,𝚒𝚗𝚍𝚎𝚡-3 𝚜𝚞𝚌𝚌-3)

    𝚌𝚢𝚌𝚕𝚎(2,𝚒𝚗𝚍𝚎𝚡-1 𝚜𝚞𝚌𝚌-2,𝚒𝚗𝚍𝚎𝚡-1 𝚜𝚞𝚌𝚌-1,𝚒𝚗𝚍𝚎𝚡-3 𝚜𝚞𝚌𝚌-3)

  • 𝚒𝚗𝚌𝚛𝚎𝚊𝚜𝚒𝚗𝚐_𝚜𝚎𝚚(𝙰𝚛𝚐,𝙰𝚝𝚝𝚛𝚜)

    • 𝙰𝚛𝚐 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛𝚜 is an attribute of type 𝚒𝚗𝚝 or a list of distinct attributes of type 𝚒𝚗𝚝 of the collection denoted by 𝙰𝚛𝚐.

    Let n and m respectively denote the number of items of the collection 𝙰𝚛𝚐, and the number of attributes of 𝙰𝚝𝚝𝚛𝚜. For item i of the collection 𝙰𝚛𝚐 let t i denote the tuple of values v i,1 ,v i,2 ,,v i,m where v i,j is the value of attribute j of 𝙰𝚝𝚝𝚛𝚜 of item i of 𝙰𝚛𝚐. The restriction forces a strict lexicographical ordering on the tuples t 1 ,t 2 ,,t n .

    EXAMPLE: An example of use of such restriction can be found in the 𝚎𝚕𝚎𝚖𝚎𝚗𝚝_𝚖𝚊𝚝𝚛𝚒𝚡(𝙼𝙰𝚇_𝙸,𝙼𝙰𝚇_𝙹,𝙸𝙽𝙳𝙴𝚇_𝙸,𝙸𝙽𝙳𝙴𝚇_𝙹,𝙼𝙰𝚃𝚁𝙸𝚇,𝚅𝙰𝙻𝚄𝙴) constraint:

    𝚒𝚗𝚌𝚛𝚎𝚊𝚜𝚒𝚗𝚐_𝚜𝚎𝚚(𝙼𝙰𝚃𝚁𝙸𝚇,[𝚒,𝚓]) forces that all items of the 𝙼𝙰𝚃𝚁𝙸𝚇 collection be sorted in strictly increasing lexicographic order on the pair (𝚒,𝚓).

    𝚎𝚕𝚎𝚖𝚎𝚗𝚝_𝚖𝚊𝚝𝚛𝚒𝚡(2,2,1,2,𝚒-1 𝚓-1 𝚟-4, 𝚒-1 𝚓-2 𝚟-7,

    𝚒-2 𝚓-1 𝚟-1, 𝚒-2 𝚓-2 𝚟-1,7)

    𝚎𝚕𝚎𝚖𝚎𝚗𝚝_𝚖𝚊𝚝𝚛𝚒𝚡(2,2,1,2,𝚒-1 𝚓-2 𝚟-4, 𝚒-1 𝚓-1 𝚟-7,

    𝚒-2 𝚓-1 𝚟-1, 𝚒-2 𝚓-2 𝚟-1,7)

  • 𝚗𝚘𝚗_𝚒𝚗𝚌𝚛𝚎𝚊𝚜𝚒𝚗𝚐_𝚜𝚒𝚣𝚎(𝙰𝚛𝚐,𝙰𝚝𝚝𝚛)

    • 𝙰𝚛𝚐 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛 is an attribute of the collection denoted by 𝙰𝚛𝚐. This attribute should be of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗.

    This restriction forces for each pair of consecutive items 𝙰𝚛𝚐[i], 𝙰𝚛𝚐[i+1] that the number of items of the collection 𝙰𝚛𝚐[i].𝙰𝚝𝚝𝚛 is greater than or equal to the number of items of the collection 𝙰𝚛𝚐[i+1].𝙰𝚝𝚝𝚛.

    EXAMPLE: An example of use of such restriction can be found in the 𝚔_𝚞𝚜𝚎𝚍_𝚋𝚢(𝚂𝙴𝚃𝚂) constraint: 𝚗𝚘𝚗_𝚒𝚗𝚌𝚛𝚎𝚊𝚜𝚒𝚗𝚐_𝚜𝚒𝚣𝚎(𝚂𝙴𝚃𝚂,𝚜𝚎𝚝) forces for all consecutive pairs of items 𝚂𝙴𝚃𝚂[i], 𝚂𝙴𝚃𝚂[i+1] that the number of items of the collection 𝚂𝙴𝚃𝚂[i].𝚜𝚎𝚝 is not greater than or equal to the number of items of the collection 𝚂𝙴𝚃𝚂[i+1].𝚜𝚎𝚝.

    𝚔_𝚞𝚜𝚎𝚍_𝚋𝚢( 𝚜𝚎𝚝-𝚟𝚊𝚛-5,𝚟𝚊𝚛-1,𝚟𝚊𝚛-1,

    𝚜𝚎𝚝-𝚟𝚊𝚛-5,𝚟𝚊𝚛-1,𝚟𝚊𝚛-1,

    𝚜𝚎𝚝-𝚟𝚊𝚛-5,𝚟𝚊𝚛-1 )

    𝚔_𝚞𝚜𝚎𝚍_𝚋𝚢( 𝚜𝚎𝚝-𝚟𝚊𝚛-5,𝚟𝚊𝚛-1,𝚟𝚊𝚛-1,

    𝚜𝚎𝚝-𝚟𝚊𝚛-5,𝚟𝚊𝚛-1,

    𝚜𝚎𝚝-𝚟𝚊𝚛-5,𝚟𝚊𝚛-1,𝚟𝚊𝚛-1 )

  • 𝚛𝚎𝚚𝚞𝚒𝚛𝚎𝚍(𝙰𝚛𝚐,𝙰𝚝𝚝𝚛𝚜)

    • 𝙰𝚛𝚐 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛𝚜 is an attribute or a list of distinct attributes of the collection denoted by 𝙰𝚛𝚐.

    This restriction forces that all attributes denoted by 𝙰𝚝𝚝𝚛𝚜 be explicitly used within all items of the collection 𝙰𝚛𝚐.

    EXAMPLE: An example of use of such restriction can be found in the 𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎(𝚃𝙰𝚂𝙺𝚂,𝙻𝙸𝙼𝙸𝚃) constraint: 𝚛𝚎𝚚𝚞𝚒𝚛𝚎𝚍(𝚃𝙰𝚂𝙺𝚂,𝚑𝚎𝚒𝚐𝚑𝚝) forces that all items of the 𝚃𝙰𝚂𝙺𝚂 collection mention the 𝚑𝚎𝚒𝚐𝚑𝚝 attribute.

    𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎( 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚘𝚛𝚒𝚐𝚒𝚗-1 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

    𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1, 12)

    𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎( 𝐨𝐫𝐢𝐠𝐢𝐧-2 𝐝𝐮𝐫𝐚𝐭𝐢𝐨𝐧-2 𝐞𝐧𝐝-4,

    𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚘𝚛𝚒𝚐𝚒𝚗-1 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

    𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1, 12)

    The 𝚛𝚎𝚚𝚞𝚒𝚛𝚎𝚍 restriction is usually systematically used for every attribute of a collection. It is not used when some attributes may be implicitly defined according to other attributes. In this context, we use the 𝚛𝚎𝚚𝚞𝚒𝚛𝚎_𝚊𝚝_𝚕𝚎𝚊𝚜𝚝 restriction, which we now introduce.

  • 𝚛𝚎𝚚𝚞𝚒𝚛𝚎_𝚊𝚝_𝚕𝚎𝚊𝚜𝚝(𝙰𝚝𝚕𝚎𝚊𝚜𝚝,𝙰𝚛𝚐,𝙰𝚝𝚝𝚛𝚜)

    • 𝙰𝚝𝚕𝚎𝚊𝚜𝚝 is a positive integer,

    • 𝙰𝚛𝚐 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛𝚜 is a non-empty list of distinct attributes of the collection denoted by 𝙰𝚛𝚐. The length of this list should be strictly greater than 𝙰𝚝𝚕𝚎𝚊𝚜𝚝.

    This restriction forces that at least 𝙰𝚝𝚕𝚎𝚊𝚜𝚝 attributes of the list 𝙰𝚝𝚝𝚛𝚜 be explicitly used within all items of the collection 𝙰𝚛𝚐.

    EXAMPLE: An example of use of such restriction can be found in the 𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎(𝚃𝙰𝚂𝙺𝚂,𝙻𝙸𝙼𝙸𝚃) constraint:

    𝚛𝚎𝚚𝚞𝚒𝚛𝚎_𝚊𝚝_𝚕𝚎𝚊𝚜𝚝(2,𝚃𝙰𝚂𝙺𝚂,[𝚘𝚛𝚒𝚐𝚒𝚗,𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗,𝚎𝚗𝚍]) forces that all items of the 𝚃𝙰𝚂𝙺𝚂 collection mention at least two attributes from the list of attributes [𝚘𝚛𝚒𝚐𝚒𝚗,𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗,𝚎𝚗𝚍]. In this context, this stems from the equality 𝚘𝚛𝚒𝚐𝚒𝚗+𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗=𝚎𝚗𝚍. This allows for retrieving the third attribute from the values of the two others.

    𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎( 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

    𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1, 12)

    𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎( 𝐨𝐫𝐢𝐠𝐢𝐧-2 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

    𝚘𝚛𝚒𝚐𝚒𝚗-1 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

    𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1, 12)

  • 𝚜𝚊𝚖𝚎_𝚜𝚒𝚣𝚎(𝙰𝚛𝚐,𝙰𝚝𝚝𝚛)

    • 𝙰𝚛𝚐 is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗,

    • 𝙰𝚝𝚝𝚛 is an attribute of the collection denoted by 𝙰𝚛𝚐. This attribute should be of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗.

    This restriction forces that all collections denoted by 𝙰𝚝𝚝𝚛 have the same number of items.

    EXAMPLE: An example of use of such restriction can be found in the 𝚍𝚒𝚏𝚏𝚗(𝙾𝚁𝚃𝙷𝙾𝚃𝙾𝙿𝙴𝚂) constraint𝙾𝚁𝚃𝙷𝙾𝚃𝙾𝙿𝙴𝚂 corresponds to the third item of the example presented at page 2.2.2.: 𝚜𝚊𝚖𝚎_𝚜𝚒𝚣𝚎(𝙾𝚁𝚃𝙷𝙾𝚃𝙾𝙿𝙴𝚂,𝚘𝚛𝚝𝚑) forces all the items of the 𝙾𝚁𝚃𝙷𝙾𝚃𝙾𝙿𝙴𝚂 collection to be constituted from the same number of items (of type 𝙾𝚁𝚃𝙷𝙾𝚃𝙾𝙿𝙴). From a practical point of view, this forces the 𝚍𝚒𝚏𝚏𝚗 constraint to take as its argument a set of points, a set of rectangles, ... , a set of orthotopes.

    𝚍𝚒𝚏𝚏𝚗( 𝚘𝚛𝚝𝚑-𝚘𝚛𝚒-2 𝚜𝚒𝚣-2 𝚎𝚗𝚍-4, 𝚘𝚛𝚒-1 𝚜𝚒𝚣-3 𝚎𝚗𝚍-4,

    𝚘𝚛𝚝𝚑-𝚘𝚛𝚒-4 𝚜𝚒𝚣-4 𝚎𝚗𝚍-8, 𝚘𝚛𝚒-3 𝚜𝚒𝚣-3 𝚎𝚗𝚍-3,

    𝚘𝚛𝚝𝚑-𝚘𝚛𝚒-9 𝚜𝚒𝚣-2 𝚎𝚗𝚍-11, 𝚘𝚛𝚒-4 𝚜𝚒𝚣-3 𝚎𝚗𝚍-7 )

    𝚍𝚒𝚏𝚏𝚗( 𝚘𝚛𝚝𝚑-𝚘𝚛𝚒-2 𝚜𝚒𝚣-2 𝚎𝚗𝚍-4,

    𝚘𝚛𝚝𝚑-𝚘𝚛𝚒-4 𝚜𝚒𝚣-4 𝚎𝚗𝚍-8, 𝚘𝚛𝚒-3 𝚜𝚒𝚣-3 𝚎𝚗𝚍-3,

    𝚘𝚛𝚝𝚑-𝚘𝚛𝚒-9 𝚜𝚒𝚣-2 𝚎𝚗𝚍-11, 𝚘𝚛𝚒-4 𝚜𝚒𝚣-3 𝚎𝚗𝚍-7 )

  • 𝚃𝚎𝚛𝚖 1 𝙲𝚘𝚖𝚙𝚊𝚛𝚒𝚜𝚘𝚗 𝚃𝚎𝚛𝚖 2
    • 𝚃𝚎𝚛𝚖 1 is a term. A term is an expression that can be evaluated to one or possibly several integer values. The expressions we allow for a term are defined in the next paragraph.

    • 𝙲𝚘𝚖𝚙𝚊𝚛𝚒𝚜𝚘𝚗 is one of the following comparison operators , , <, >, =, .

    • 𝚃𝚎𝚛𝚖 2 is a term.

    Let v 1,1 ,v 1,2 ,,v 1,n 1 and v 2,1 ,v 2,2 ,,v 2,n 2 be the values respectively associated with 𝚃𝚎𝚛𝚖 1 and with 𝚃𝚎𝚛𝚖 2 . The restriction 𝚃𝚎𝚛𝚖 1 𝙲𝚘𝚖𝚙𝚊𝚛𝚒𝚜𝚘𝚗 𝚃𝚎𝚛𝚖 2 forces v 1,i 𝙲𝚘𝚖𝚙𝚊𝚛𝚒𝚜𝚘𝚗 v 2,j to hold for every i[1,n 1 ] and every j[1,n 2 ].

    A term is one of the following expressions:

    • e, where e is an integer. The corresponding value is e.

    • |c|, where c is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗. The value of |c| is the number of items of the collection denoted by c.

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚊𝚝𝚕𝚎𝚊𝚜𝚝(𝙽,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂,𝚅𝙰𝙻𝚄𝙴) constraint: 𝙽|𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂| restricts 𝙽 to be less than or equal to the number of items of the 𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂 collection.

      𝚊𝚝𝚕𝚎𝚊𝚜𝚝(2,𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-5,5)

      𝚊𝚝𝚕𝚎𝚊𝚜𝚝(4,𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-5,5)

    • 𝚏𝚒𝚛𝚜𝚝(c.a): 𝚏𝚒𝚛𝚜𝚝(c.a) denotes the value assigned to the attribute a of the first item of the collection denoted by c. It is equal to 0 if the collection is empty.

    • 𝚕𝚊𝚜𝚝(c.a): 𝚕𝚊𝚜𝚝(c.a) denotes the value assigned to the attribute a of the last item of the collection denoted by c. It is equal to 0 if the collection is empty.

    • 𝚜𝚞𝚖(c.a), 𝚜𝚞𝚖(): 𝚜𝚞𝚖(c.a) denotes the sum of the values assigned to the attribute a of the collection denoted by c, it is equal to 0 if the collection is empty; 𝚜𝚞𝚖() where is a list of collections attributes, each of them of the form c i .a i (with i[1,n]), is the sum of the values assigned to the attributes a i of the collections denoted by c i (i[1,n]).

    • 𝚛𝚊𝚗𝚐𝚎(c.a), 𝚛𝚊𝚗𝚐𝚎(): 𝚛𝚊𝚗𝚐𝚎(c.a) denotes the difference between the maximum value and the minimum value plus one of the values assigned to the attribute a of the collection denoted by c, it is equal to 0 if the collection is empty; 𝚛𝚊𝚗𝚐𝚎() where is a list of collections attributes, each of them of the form c i .a i (with i[1,n]), is the difference between the maximum value and the minimum value plus one of the values assigned to the attributes a i of the collections denoted by c i (i[1,n]).

    • 𝚖𝚒𝚗𝚟𝚊𝚕(c.a), 𝚖𝚒𝚗𝚟𝚊𝚕(): 𝚖𝚒𝚗𝚟𝚊𝚕(c.a) denotes the minimum over the values assigned to the attribute a of the collection denoted by c, it is equal to 0 if the collection is empty; 𝚖𝚒𝚗𝚟𝚊𝚕() where is a list of collections attributes, each of them of the form c i .a i (with i[1,n]), is the minimum over the values assigned to the attributes a i of the collections denoted by c i (i[1,n]).

    • 𝚖𝚊𝚡𝚟𝚊𝚕(c.a), 𝚖𝚊𝚡𝚟𝚊𝚕(): 𝚖𝚊𝚡𝚟𝚊𝚕(c.a) denotes the maximum over the values assigned to the attribute a of the collection denoted by c, it is equal to 0 if the collection is empty; 𝚖𝚊𝚡𝚟𝚊𝚕() where is a list of collections attributes, each of them of the form c i .a i (with i[1,n]), is the maximum over the values assigned to the attributes a i of the collections denoted by c i (i[1,n]).

    • 𝚗𝚟𝚊𝚕(c.a), 𝚗𝚟𝚊𝚕(): 𝚗𝚟𝚊𝚕(c.a) denotes the number of distinct values over the values assigned to the attribute a of the collection denoted by c, it is equal to 0 if the collection is empty; 𝚗𝚟𝚊𝚕() where is a list of collections attributes, each of them of the form c i .a i (with i[1,n]), is the number of distinct values over the values assigned to the attributes a i of the collections denoted by c i (i[1,n]).

    • 𝚙𝚛𝚘𝚍(c.a), 𝚙𝚛𝚘𝚍(): 𝚙𝚛𝚘𝚍(c.a) denotes the product of the values assigned to the attribute a of the collection denoted by c, it is equal to 1 if the collection is empty; 𝚙𝚛𝚘𝚍() where is a list of collections attributes, each of them of the form c i .a i (with i[1,n]), is the product of the values assigned to the attributes a i of the collections denoted by c i (i[1,n]).

    • 𝚙𝚏𝚍𝚌(c.a), 𝚙𝚏𝚍𝚌(): 𝚙𝚏𝚍𝚌(c.a), where 𝚙𝚏𝚍𝚌 is a pure functional dependency constraint of the form 𝚙𝚏𝚍𝚌(v,𝑐𝑜𝑙) (e.g. 𝚊𝚖𝚘𝚗𝚐_𝚍𝚒𝚏𝚏_0, 𝚙𝚎𝚊𝚔, 𝚟𝚊𝚕𝚕𝚎𝚢) that computes a value v from a collection of variables 𝑐𝑜𝑙, and where c.a is a collection with attribute a denotes the 𝚙𝚏𝚍𝚌 of the values assigned to the attribute a of the collection denoted by c, it is equal to 0 if the collection is empty; 𝚙𝚏𝚍𝚌() where is a list of collections attributes, each of them of the form c i .a i (with i[1,n]), is the 𝚙𝚏𝚍𝚌 of the values assigned to the attributes a i of the collections denoted by c i (i[1,n]).

    • t, where t is an argument of type 𝚒𝚗𝚝. The value of t is the value of the corresponding argument.

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚊𝚝𝚕𝚎𝚊𝚜𝚝(𝙽,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂,𝚅𝙰𝙻𝚄𝙴) constraint: 𝙽0 forces the first argument of the 𝚊𝚝𝚕𝚎𝚊𝚜𝚝 constraint to be greater than or equal to 0.

      𝚊𝚝𝚕𝚎𝚊𝚜𝚝(2,𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-5,5)

      𝚊𝚝𝚕𝚎𝚊𝚜𝚝(-1,𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-5,5)

    • v, where v is an argument of type 𝚍𝚟𝚊𝚛. The value of v will be the value assigned to variable v.Restrictions are defined on the ground instance of a global constraint.

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚊𝚖𝚘𝚗𝚐(𝙽𝚅𝙰𝚁,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂,𝚅𝙰𝙻𝚄𝙴𝚂) constraint: 𝙽𝚅𝙰𝚁0 forces the first argument of the 𝚊𝚖𝚘𝚗𝚐 constraint to be greater than or equal to 0.

      𝚊𝚖𝚘𝚗𝚐(2,𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-5,𝚟𝚊𝚕-1,𝚟𝚊𝚕-5)

      𝚊𝚖𝚘𝚗𝚐(-9,𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-5,𝚟𝚊𝚕-1,𝚟𝚊𝚕-5)

    • s, where s is an argument of type 𝚜𝚒𝚗𝚝 or 𝚜𝚟𝚊𝚛. The values denoted by s are all the values of the corresponding set.

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚘𝚙𝚎𝚗_𝚊𝚕𝚕𝚍𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚝(𝚂,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂) constraint: 𝚂1 forces all elements of the set corresponding to the first argument of the 𝚘𝚙𝚎𝚗_𝚊𝚕𝚕𝚍𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚝 constraint to be greater than or equal to 1.

      𝚘𝚙𝚎𝚗_𝚊𝚕𝚕𝚍𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚝({1,2,3},𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-3,𝚟𝚊𝚛-8,𝚟𝚊𝚛-9)

      𝚘𝚙𝚎𝚗_𝚊𝚕𝚕𝚍𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚝({0,1,2,3},𝚟𝚊𝚛-5,𝚟𝚊𝚛-8,𝚟𝚊𝚛-3,𝚟𝚊𝚛-8,𝚟𝚊𝚛-9)

    • c.a, where c is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗 and a an attribute of c of type 𝚒𝚗𝚝 or 𝚍𝚟𝚊𝚛. The values denoted by c.a are all the values corresponding to attribute a for the different items of c. When c.a designates a domain variable we consider the value assigned to that variable.

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎(𝚃𝙰𝚂𝙺𝚂,𝙻𝙸𝙼𝙸𝚃) constraint: 𝚃𝙰𝚂𝙺𝚂.𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗0 forces for all items of the 𝚃𝙰𝚂𝙺𝚂 collection that the 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗 attribute be greater than or equal to 0.

      𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎( 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

      𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

      𝚘𝚛𝚒𝚐𝚒𝚗-1 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

      𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1, 12)

      𝚌𝚞𝚖𝚞𝚕𝚊𝚝𝚒𝚟𝚎( 𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗--2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

      𝚘𝚛𝚒𝚐𝚒𝚗-2 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-4 𝚑𝚎𝚒𝚐𝚑𝚝-2,

      𝚘𝚛𝚒𝚐𝚒𝚗-1 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-4 𝚎𝚗𝚍-5 𝚑𝚎𝚒𝚐𝚑𝚝-5,

      𝚘𝚛𝚒𝚐𝚒𝚗-4 𝚍𝚞𝚛𝚊𝚝𝚒𝚘𝚗-2 𝚎𝚗𝚍-6 𝚑𝚎𝚒𝚐𝚑𝚝-1, 12)

    • c.a, where c is an argument of type 𝚌𝚘𝚕𝚕𝚎𝚌𝚝𝚒𝚘𝚗 and a an attribute of c of type 𝚜𝚒𝚗𝚝 or 𝚜𝚟𝚊𝚛. The values denoted by c.a are all the values belonging to the sets corresponding to attribute a for the different items of c. When c.a designates a set variable we consider the values that finally belong to that set.

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚒𝚗𝚟𝚎𝚛𝚜𝚎_𝚜𝚎𝚝(𝚇,𝚈) constraint: 𝚇.𝚡1 forces for all items of the 𝚇 collection that all the potential elements of the set variable associated with the 𝚡 attribute be greater than or equal to 1.

      𝚒𝚗𝚟𝚎𝚛𝚜𝚎_𝚜𝚎𝚝( 𝚒𝚗𝚍𝚎𝚡-1 𝚡-{2,4},

      𝚒𝚗𝚍𝚎𝚡-2 𝚡-{4},

      𝚒𝚗𝚍𝚎𝚡-3 𝚡-{1},

      𝚒𝚗𝚍𝚎𝚡-4 𝚡-{4} ,

      𝚒𝚗𝚍𝚎𝚡-1 𝚢-{3},

      𝚒𝚗𝚍𝚎𝚡-2 𝚢-{1},

      𝚒𝚗𝚍𝚎𝚡-3 𝚢-{},

      𝚒𝚗𝚍𝚎𝚡-4 𝚢-{1,2,4},

      𝚒𝚗𝚍𝚎𝚡-5 𝚢-{} )

      𝚒𝚗𝚟𝚎𝚛𝚜𝚎_𝚜𝚎𝚝( 𝚒𝚗𝚍𝚎𝚡-1 𝚡-{0,2,4},

      𝚒𝚗𝚍𝚎𝚡-2 𝚡-{4},

      𝚒𝚗𝚍𝚎𝚡-3 𝚡-{1},

      𝚒𝚗𝚍𝚎𝚡-4 𝚡-{4} ,

      𝚒𝚗𝚍𝚎𝚡-1 𝚢-{3},

      𝚒𝚗𝚍𝚎𝚡-2 𝚢-{1},

      𝚒𝚗𝚍𝚎𝚡-3 𝚢-{},

      𝚒𝚗𝚍𝚎𝚡-4 𝚢-{1,2,4},

      𝚒𝚗𝚍𝚎𝚡-5 𝚢-{} )

    • min(t 1 ,t 2 ) or max(t 1 ,t 2 ), where t 1 and t 2 are terms. Let 𝒱 1 and 𝒱 2 denote the sets of values respectively associated with the terms t 1 and t 2 . Let min(𝒱 1 ), max(𝒱 1 ) and min(𝒱 2 ), max(𝒱 2 ) denote the minimum and maximum values of 𝒱 1 and 𝒱 2 . The value associated with min(t 1 ,t 2 ) is min(min(𝒱 1 ),min(𝒱 2 )), while the value associated with max(t 1 ,t 2 ) is max(max(𝒱 1 ),max(𝒱 2 )).

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚗𝚒𝚗𝚝𝚎𝚛𝚟𝚊𝚕(𝙽𝚅𝙰𝙻,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂,𝚂𝙸𝚉𝙴_𝙸𝙽𝚃𝙴𝚁𝚅𝙰𝙻) constraint: 𝙽𝚅𝙰𝙻min(1,|𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂|) forces 𝙽𝚅𝙰𝙻 to be greater than or equal to the minimum of 1 and the number of items of the 𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂 collection.

      𝚗𝚒𝚗𝚝𝚎𝚛𝚟𝚊𝚕(2,𝚟𝚊𝚛-3,𝚟𝚊𝚛-1,𝚟𝚊𝚛-9,𝚟𝚊𝚛-1,𝚟𝚊𝚛-9,4)

      𝚗𝚒𝚗𝚝𝚎𝚛𝚟𝚊𝚕(0,𝚟𝚊𝚛-3,𝚟𝚊𝚛-1,𝚟𝚊𝚛-9,𝚟𝚊𝚛-1,𝚟𝚊𝚛-9,4)

    • t 1 𝚘𝚙 t 2 , where t 1 and t 2 are terms and 𝚘𝚙 one of the operators +, -, * or /./ denotes an integer division, a division in which the fractional part is discarded. Let 𝒱 1 and 𝒱 2 denote the sets of values respectively associated with the terms t 1 and t 2 . The set of values associated with t 1 𝚘𝚙 t 2 is 𝒱 12 ={v:v=v 1 𝚘𝚙 v 2 ,v 1 𝒱 1 ,v 2 𝒱 2 }.

      EXAMPLE: This kind of expression is for instance used in the restrictions of the 𝚛𝚎𝚕𝚊𝚡𝚎𝚍_𝚜𝚕𝚒𝚍𝚒𝚗𝚐_𝚜𝚞𝚖(𝙰𝚃𝙻𝙴𝙰𝚂𝚃,𝙰𝚃𝙼𝙾𝚂𝚃,𝙻𝙾𝚆,𝚄𝙿,𝚂𝙴𝚀,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂) constraint: 𝙰𝚃𝙼𝙾𝚂𝚃|𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂|-𝚂𝙴𝚀+1 forces 𝙰𝚃𝙼𝙾𝚂𝚃 to be less than or equal to an arithmetic expression that corresponds to the number of sequences of 𝚂𝙴𝚀 consecutive variables in a sequence of |𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂| variables.

      𝚛𝚎𝚕𝚊𝚡𝚎𝚍_𝚜𝚕𝚒𝚍𝚒𝚗𝚐_𝚜𝚞𝚖(3,4,3,7,4,𝚟𝚊𝚛-2,𝚟𝚊𝚛-4,𝚟𝚊𝚛-2,𝚟𝚊𝚛-0,

      𝚟𝚊𝚛-0,𝚟𝚊𝚛-3,𝚟𝚊𝚛-4)

      𝚛𝚎𝚕𝚊𝚡𝚎𝚍_𝚜𝚕𝚒𝚍𝚒𝚗𝚐_𝚜𝚞𝚖(3,9,3,7,4,𝚟𝚊𝚛-2,𝚟𝚊𝚛-4,𝚟𝚊𝚛-2,𝚟𝚊𝚛-0,

      𝚟𝚊𝚛-0,𝚟𝚊𝚛-3,𝚟𝚊𝚛-4)

  • We can use a disjunction between two restrictions.

    EXAMPLE: This kind of expression is for instance used in the Typical slot of the 𝚊𝚖𝚘𝚗𝚐_𝚕𝚘𝚠_𝚞𝚙(𝙻𝙾𝚆,𝚄𝙿,𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂,𝚅𝙰𝙻𝚄𝙴𝚂) constraint: 𝙻𝙾𝚆>0𝚄𝙿<|𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂| forces the pair 𝙻𝙾𝚆, 𝚄𝙿 to impose a restriction on the variables of the 𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂 collection.Since when both, 𝙻𝙾𝚆0 and 𝚄𝙿|𝚅𝙰𝚁𝙸𝙰𝙱𝙻𝙴𝚂|, the corresponding 𝚊𝚖𝚘𝚗𝚐_𝚕𝚘𝚠_𝚞𝚙 constraint always holds.

    𝚊𝚖𝚘𝚗𝚐_𝚕𝚘𝚠_𝚞𝚙(1,2,9,2,4,5,0,2,4,6,9)

    𝚊𝚖𝚘𝚗𝚐_𝚕𝚘𝚠_𝚞𝚙(0,3,9,2,4,5,0,2,4,6,9)

    𝚊𝚖𝚘𝚗𝚐_𝚕𝚘𝚠_𝚞𝚙(1,4,9,2,4,5,0,2,4,6,9)

    𝚊𝚖𝚘𝚗𝚐_𝚕𝚘𝚠_𝚞𝚙(0,4,9,2,4,5,0,2,4,6,9)

  • Finally, we can also use a constraint C of the catalogue for expressing a restriction as long as that constraint is not defined according to the constraint under consideration. The constraint C should have a graph-based or an automaton-based description so that its meaning is explicitly defined.

    EXAMPLE: An example of use of such restriction can be found in the 𝚜𝚘𝚛𝚝_𝚙𝚎𝚛𝚖𝚞𝚝𝚊𝚝𝚒𝚘𝚗(𝙵𝚁𝙾𝙼,𝙿𝙴𝚁𝙼𝚄𝚃𝙰𝚃𝙸𝙾𝙽,𝚃𝙾) constraint: 𝚊𝚕𝚕𝚍𝚒𝚏𝚏𝚎𝚛𝚎𝚗𝚝(𝙿𝙴𝚁𝙼𝚄𝚃𝙰- 𝚃𝙸𝙾𝙽) is used to express that the variables of the second argument of the 𝚜𝚘𝚛𝚝_𝚙𝚎𝚛𝚖𝚞𝚝𝚊𝚝𝚒𝚘𝚗 constraint should take distinct values.