Overview
Formally, constraint logic programs are like regular logic programs, but the body of clauses can contain constraints, in addition to the regular logic programming literals. As an example, X>0
is a constraint, and is included in the last clause of the following constraint logic program.
Like in regular logic programming, evaluating a goal such as A(X,1)
requires evaluating the body of the last clause with Y=1
. Like in regular logic programming, this in turn requires proving the goal B(X,1)
. Contrary to regular logic programming, this also requires a constraint to be satisfied: X>0
, the constraint in the body of the last clause.
Whether a constraint is satisfied cannot always be determined when the constraint is encountered. In this case, for example, the value of X
is not determined when the last clause is evaluated. As a result, the constraint X>0
is not satisfied nor violated at this point. Rather than proceeding in the evaluation of B(X,1)
and then checking whether the resulting value of X
is positive afterwards, the interpreter stores the constraint X>0
and then proceeds in the evaluation of B(X,1)
; this way, the interpreter can detect violation of the constraint X>0
during the evaluation of B(X,1)
, and backtrack immediately if this is the case, rather than waiting for the evaluation of B(X,1)
to conclude.
In general, the evaluation of a constraint logic program proceeds like for a regular logic program, but constraint encountered during evaluation are placed in a set called constraint store. As an example, the evaluation of the goal A(X,1)
proceeds by evaluating the body of the first clause with Y=1
; this evaluation adds X>0
to the constraint store and requires the goal B(X,1)
to be proved. While trying to prove this goal, the first clause is applicable, but its evaluation adds X<0
to the constraint store. This addition makes the constraint store unsatisfiable, and the interpreter backtracks, removing the last addition from the constraint store. The evaluation of the second clause adds X=1
and Y>0
to the constraint store. Since the constraint store is satisfiable and no other literal is left to prove, the interpreter stops with the solution X=1, Y=1
.
Read more about this topic: Constraint Logic Programming