A constraint handling rule has one or more heads, an optional guard, a body and an optional name. A Head is a Constraint. A constraint is a callable Prolog term, whose functor is a declared constraint. The Guard is a Prolog goal. The Body of a rule is a Prolog goal (including constraints). A rule can be named with a Name, which can be any Prolog term (including variables from the rule).
There are three kinds of constraint handling rules:
Rule | ::= ?(Name @)
|
(Simplification | Propagation | Simpagation)
| |
?(pragma Pragma)
| |
Simplification | ::= Heads <=> ?(Guard | ) Body
|
Propagation | ::= Heads ==> ?(Guard | ) Body
|
Simpagation | ::= Heads \ Heads <=> ?(Guard | ) Body
|
Heads | ::= Head | Head , Heads
|
Head | ::= Constraint | Constraint # Id
|
Constraint | ::= {a callable term declared as constraint}
|
Id | ::= {a unique variable}
|
Guard | ::= Ask | Ask & Tell
|
Ask | ::= Goal
|
Tell | ::= Goal
|
Goal | ::= {a callable term, including conjunction and disjunction etc.}
|
Body | ::= Goal
|
Pragma | ::= {a conjunction of terms usually referring to one or more heads identified via #/2 }
|
The symbol |
separates the guard (if present) from the body
of a rule. Since |
is read as ;
(disjunction) by
the reader, care has to be taken when using disjunction in the
guard or body of the rule. The top-level disjunction will
always be interpreted as guard-body separator |
, so proper
bracketing has to be used, e.g. a <=> (b;c) | (d;e)
instead of
a <=> b;c | d;e
and a <=> true | (d;e)
instead of a
<=> (d;e)
.
In simpagation rules, \
separates the heads of the rule
into two parts.
Individual head constraints may be tagged with variables via
#
, which may be used as identifiers in pragma declarations, for
example. Constraint identifiers must be distinct variables, not
occurring elsewhere in the heads.
Guards test the applicability of a rule. Guards come in two parts, tell
and ask, separated by &
. If the &
operator is not
present, the whole guard is assumed to be of the ask type.
Declaratively, a rule relates heads and body provided
the guard is true. A simplification rule means that the heads
are true if and only if the body is true. A propagation rule
means that the body is true if the heads are true. A
simpagation rule combines a simplification and a propagation rule. The
rule Heads1 \ Heads2 <=> Body
is equivalent to the simplification
rule Heads1, Heads2 <=> Heads1, Body
. However, the simpagation
rule is more compact to write, more efficient to execute and has better
termination behavior than the corresponding simplification rule, since
the constraints comprising Heads1
will not be removed and
inserted again.