Syntax of Sugar CSP description

Last modified: Tue Jun 29 13:09:26 2010 JST

Introduction

This document explains the syntax of CSP (Constraint Satisfaction Problem) files for Sugar constraint solver. The syntax is designed to cover the abridged notation of the XCSP 2.1 format used at the International CSP Solver Competitions.

Preliminaries

Integer ::=
    Digit+ | -Digit+
Digit ::=
    0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Symbol ::=
    SymbolCharacter+  /* except sequences interpreted as integers */
SymbolCharacter ::=
    /* any character from A-Z a-z 0-9 _ . + - * / % = < > ! & | and \u00080-\u10FFFF */
Comment ::=
    ; /* followed by characters until the end of line */

Domain Definitions

Syntax

DomainDefinition ::=
    (domain DomainName LowerBound UpperBound) |
    (domain DomainName (Range+)) |
    (domain DomainName Value)
DomainName ::=
    Symbol
LowerBound ::=
    Integer
UpperBound ::=
    Integer
Value ::=
    Integer
Range ::=
    Integer | (Integer Integer)

Remarks

Examples

(domain d0 1000 2000)         ; d0 = { x | 1000 ≤ x ≤ 2000 }
(domain d1 ((1 3) 5 (10 12))) ; d1 = { 1, 2, 3, 5, 10, 11, 12 }
(domain d2 1000)              ; d2 = { 1000 }

Integer Variable Definitions

Syntax

IntegerVariableDefinition ::=
    (int IntegerVariableName DomainName) |
    (int IntegerVariableName LowerBound UpperBound) |
    (int IntegerVariableName (Range+)) |
    (int IntegerVariableName Value)
IntegerVariableName ::=
    Symbol

Remarks

Examples

(int x0 d0)                ; x0 ∈ d0
(int x1 1000 2000)         ; x1 ∈ { x | 1000 ≤ x ≤ 2000 }
(int x2 ((1 3) 5 (10 12))) ; x2 ∈ { 1, 2, 3, 5, 10, 11, 12 }
(int x3 1000)              ; x3 ∈ { 1000 }, i.e. x3 = 1000

Boolean Variable Definitions

Syntax

BooleanVariableDefinition ::=
    (bool BooleanVariableName)
BooleanVariableName ::=
    Symbol

Remarks

Examples

(bool p0)

Terms

Syntax

Term ::=
    Integer |
    IntegerVariableName |
    (abs Term) |
    (neg Term) | (- Term) |
    (add Term*) | (+ Term*) |
    (sub Term Term+) | (- Term Term+) |
    (mul Term Term) | (* Term Term) |
    (div Term Term) | (/ Term Term) |
    (mod Term Term) | (% Term Term) |
    (pow Term Term) |
    (min Term Term) |
    (max Term Term) |
    (if LogicalFormula Term Term)

Remarks

Examples

(- x y z)  ; means x-y-z

Relation Definitions

Syntax

RelationDefinition ::=
    (relation RelationName Arity RelationBody)
RelationName ::=
    Symbol
Arity ::=
    Integer
RelationBody ::=
    (RelationType Tuple*)
RelationType ::=
    supports | conflicts
Tuple ::=
    (Integer+)

Examples

(relation r0 2 (conflicts (0 0) (1 1) (2 2)))

Predicate Definitions

Syntax

PredicateDefinition ::=
    (predicate PredicateHead PredicateBody)
PredicateHead ::=
    (PredicateName Parameter*)
PredicateName ::=
    Symbol
Parameter ::=
    IntegerVariableName
PredicateBody ::=
    LogicalFormula

Remarks

Examples

(predicate (p0 x1 x2) (<= x1 (+ x2 1))  ; (p0 x1 x2) ⇔ x1 ≤ x2+1

Constraints

Syntax

Constraint ::=
    LogicalFormula

LogicalFormula ::=
    AtomicFormula |
    (not LogicalFormula) | (! LogicalFormula) |
    (and LogicalFormula*) | (&& LogicalFormula*) |
    (or LogicalFormula*) | (|| LogicalFormula*) |
    (imp LogicalFormula LogicalFormula) | (=> LogicalFormula LogicalFormula) |
    (xor LogicalFormula LogicalFormula) |
    (iff LogicalFormula LogicalFormula)

AtomicFormula ::=
    false | true | BooleanVariableName |
    (eq Term Term) | (= Term Term) |
    (ne Term Term) | (!= Term Term) |
    (le Term Term) | (<= Term Term) |
    (lt Term Term) | (< Term Term) |
    (ge Term Term) | (>= Term Term) |
    (gt Term Term) | (> Term Term) |
    (RelationName Term*) |
    (PredicateName Term*) |
    AllDifferentConstraint |
    WeightedSumConstraint |
    CumulativeConstraint |
    ElementConstraint |
    DisjunctiveConstraint |
    Lex_lessConstraint |
    Lex_lesseqConstraint |
    NvalueConstraint |
    Global_cardinalityConstraint |
    Global_cardinality_with_costsConstraint |
    CountConstraint

Remarks

Examples

(or p0 (r0 x4 x5) (>= x0 (+ x0 1))

AllDifferent Constraints

Syntax

AllDifferentConstraint ::=
    (alldifferent Term*) |
    (alldifferent (Term*))

Remarks

Examples

(alldifferent (+ x1 1) (+ x2 2) (+ x3 3) (+ x4 4))
(alldifferent ((+ x1 1) (+ x2 2) (+ x3 3) (+ x4 4)))

WeightedSum Constraints

Syntax

WeightedSumConstraint ::=
    (weightedsum (WeightedPair*) ComparisonName Term)
WeightedPair ::=
    (Weight Term)
Weight ::=
    Integer
ComparisionName ::=
    eq | ne | le | lt | ge | gt

Examples

(weightedsum ((1 v0) (2 v1) (-3 v2)) gt 12)  ; means 1*v0+2*v1-3*v3 > 12

Cumulative Constraints

Syntax

CumulativeConstraint ::=
    (cumulative (Task*) Limit) |
Task ::=
    (Origin Duration End Height)
Origin ::=
    Term | nil
Duration ::=
    Term | nil
End ::=
    Term | nil
Height ::=
    Term
Limit ::=
    Term

Remarks

Examples

(cumulative ((s0 2 nil 1) (s1 2 nil 1) (s2 2 nil 1) (s3 2 nil 1)) 2)

Element Constraints

Syntax

ElementConstraint ::=
    (element Index (Term+) Value)
Index ::=
    Term
Value ::=
    Term

Remarks

Examples

(element i (x1 x2 x3 x4) xi)

Disjunctive Constraints

Syntax

DisjunctiveConstraint ::=
    (disjunctive (Task+))
Task ::=
    (Origin Duration)
Origin ::=
    Term
Duration ::=
    Term

Remarks

Examples

(disjunctive ((s1 3) (s2 0) (s3 2) (s4 1)))

Lex_less Constraints

Syntax

Lex_lessConstraint ::=
    (lex_less Vector Vector)
Vector ::=
    (Term+)

Remarks

Examples

(lex_less (x1 x2 x3) (y1 y2 y3))

Lex_lesseq Constraints

Syntax

Lex_lesseqConstraint ::=
    (lex_lesseq Vector Vector)
Vector ::=
    (Term+)

Remarks

Examples

(lex_lesseq (x1 x2 x3) (y1 y2 y3))

Nvalue Constraints

Syntax

NvalueConstraint ::=
    (nvalue Term (Term+))

Remarks

Examples

(nvalue count (x1 x2 x3))

Global_cardinality Constraints

Syntax

Global_cardinalityConstraint ::=
    (global_cardinality (Term+) (Cardinality+))
Cardinality ::=
    (Value Count)
Value ::=
    Integer
Count ::=
    Term

Remarks

Examples

(global_cardinality (x1 x2 x3) ((1 c1) (2 c2)))

Global_cardinality_with_costs Constraints

Syntax

Global_cardinality_with_costsConstraint ::=
    (global_cardinality_with_costs (Term+) (Cardinality+) (CostTable+) Cost)
Cardinality ::=
    (Value Count)
Value ::=
    Integer
Count ::=
    Term
CostTable ::=
    (Integer Integer Integer)
Cost ::=
    Term

Remarks

Examples

(global_cardinality_with_costs (x1 x2 x3) ((1 c1) (2 c2))
  ((1 1 2) (1 2 3) (2 1 1) (2 2 4)) cost)

Count Constraints

Syntax

CountConstraint ::=
    (count Value (Term+) ComparisonName Term)
Value ::=
    Term
ComparisionName ::=
    eq | ne | le | lt | ge | gt

Remarks

Examples

(count 2 (x1 x2 x3) eq 1)

Objective Declaration

Syntax

ObjectiveDeclaration ::=
    (objective Goal IntegerVariableName)
Goal ::=
    minimize | maximize

Remarks

Examples

(objective minimize x0)  ; The objective is minimizing the value of x0.
(objective maximize x1)  ; The objective is maximizing the value of x1.

CSP

Syntax

CSP ::=
    Statement*

Statement ::=
    DomainDefinition |
    IntegerVariableDefinition |
    BooleanVariableDefinition |
    RelationDefinition |
    PredicateDefinition |
    ObjectiveDeclaration |
    Constaint

Remarks

Examples

; Magic Square 3 x 3
(int x_1_1 1 9)
(int x_1_2 1 9)
(int x_1_3 1 9)
(int x_2_1 1 9)
(int x_2_2 1 9)
(int x_2_3 1 9)
(int x_3_1 1 9)
(int x_3_2 1 9)
(int x_3_3 1 9)
(alldifferent x_1_1 x_1_2 x_1_3 x_2_1 x_2_2 x_2_3 x_3_1 x_3_2 x_3_3)
(= (+ x_1_1 x_1_2 x_1_3) 15)
(= (+ x_2_1 x_2_2 x_2_3) 15)
(= (+ x_3_1 x_3_2 x_3_3) 15)
(= (+ x_1_1 x_2_1 x_3_1) 15)
(= (+ x_1_2 x_2_2 x_3_2) 15)
(= (+ x_1_3 x_2_3 x_3_3) 15)
(= (+ x_1_1 x_2_2 x_3_3) 15)
(= (+ x_1_3 x_2_2 x_3_1) 15)
; END
; Golomb ruler of 4 marks
(int length 6 7)
(objective minimize length)
(int m_0 0 0)
(int m_1 0 7)
(int m_2 0 7)
(int m_3 0 7)
(< m_0 m_1)
(< m_1 m_2)
(< m_2 m_3)
(<= m_3 length)
(int d_1_0 0 7)
(= d_1_0 (- m_1 m_0))
(int d_2_0 0 7)
(= d_2_0 (- m_2 m_0))
(int d_3_0 0 7)
(= d_3_0 (- m_3 m_0))
(int d_2_1 0 7)
(= d_2_1 (- m_2 m_1))
(int d_3_1 0 7)
(= d_3_1 (- m_3 m_1))
(int d_3_2 0 7)
(= d_3_2 (- m_3 m_2))
(alldifferent d_1_0 d_2_0 d_3_0 d_2_1 d_3_1 d_3_2)
; END
; 4-Queens Problem
(int q_1 1 4)
(int q_2 1 4)
(int q_3 1 4)
(int q_4 1 4)
(alldifferent q_1 q_2 q_3 q_4)
(alldifferent (+ q_1 1) (+ q_2 2) (+ q_3 3) (+ q_4 4))
(alldifferent (- q_1 1) (- q_2 2) (- q_3 3) (- q_4 4))
; END
; Open-Shop Scheduling Problem gp03-01
(int makespan 1000 1509)
(objective minimize makespan)
(int s_0_0 0 1509)
(<= (+ s_0_0 661) makespan)
(int s_0_1 0 1509)
(<= (+ s_0_1 6) makespan)
(int s_0_2 0 1509)
(<= (+ s_0_2 333) makespan)
(int s_1_0 0 1509)
(<= (+ s_1_0 168) makespan)
(int s_1_1 0 1509)
(<= (+ s_1_1 489) makespan)
(int s_1_2 0 1509)
(<= (+ s_1_2 343) makespan)
(int s_2_0 0 1509)
(<= (+ s_2_0 171) makespan)
(int s_2_1 0 1509)
(<= (+ s_2_1 505) makespan)
(int s_2_2 0 1509)
(<= (+ s_2_2 324) makespan)
(or (<= (+ s_0_0 661) s_0_1) (<= (+ s_0_1 6) s_0_0))
(or (<= (+ s_0_0 661) s_0_2) (<= (+ s_0_2 333) s_0_0))
(or (<= (+ s_0_1 6) s_0_2) (<= (+ s_0_2 333) s_0_1))
(or (<= (+ s_1_0 168) s_1_1) (<= (+ s_1_1 489) s_1_0))
(or (<= (+ s_1_0 168) s_1_2) (<= (+ s_1_2 343) s_1_0))
(or (<= (+ s_1_1 489) s_1_2) (<= (+ s_1_2 343) s_1_1))
(or (<= (+ s_2_0 171) s_2_1) (<= (+ s_2_1 505) s_2_0))
(or (<= (+ s_2_0 171) s_2_2) (<= (+ s_2_2 324) s_2_0))
(or (<= (+ s_2_1 505) s_2_2) (<= (+ s_2_2 324) s_2_1))
(or (<= (+ s_0_0 661) s_1_0) (<= (+ s_1_0 168) s_0_0))
(or (<= (+ s_0_0 661) s_2_0) (<= (+ s_2_0 171) s_0_0))
(or (<= (+ s_1_0 168) s_2_0) (<= (+ s_2_0 171) s_1_0))
(or (<= (+ s_0_1 6) s_1_1) (<= (+ s_1_1 489) s_0_1))
(or (<= (+ s_0_1 6) s_2_1) (<= (+ s_2_1 505) s_0_1))
(or (<= (+ s_1_1 489) s_2_1) (<= (+ s_2_1 505) s_1_1))
(or (<= (+ s_0_2 333) s_1_2) (<= (+ s_1_2 343) s_0_2))
(or (<= (+ s_0_2 333) s_2_2) (<= (+ s_2_2 324) s_0_2))
(or (<= (+ s_1_2 343) s_2_2) (<= (+ s_2_2 324) s_1_2))
; END

Naoyuki Tamura