[ library(repair) | The ECLiPSe Libraries | Reference Manual | Alphabetic Index ]

+Constraint r_conflict ?ConflictSet

Annotate Constraint as a repair constraint and monitor it for conflicts.
Constraint
Constraint to be monitored for conflict (Goal)
ConflictSet
Handle for the conflict set (atom or varibale) argument can alternatively be ConflictSet-ConflictData

Description

Repair constraints are constraints that are monitored by the repair library for conflicts caused by the tentative values of variables in the constraints. r_conflict/2 annotates a constraint to be a repair constraint, and performs the simplest form of monitoring for violation: the repair constraint is passive in that it simply waits for constraint to become violated due to bindings to its variables or their tentative values. In such a case, the constraint will show up in the ConflictSet, from where it can be retrieved using conflict_constraints/2.

Note that setting up a repair constraint does not propagate the constraint as a normal constraint as well. Call the constraint again without the annotation to propagate the constraint.

Constraint can be any goal that works logically, it should be useable as a ground check, and work on any instantiation pattern. Typically, it will be a constraint from some solver library.

ConflictSet can be a user-defined name (an atom) or it can be a variable in which case the system returns a conflict set handle that can later be passed to conflict_constraints/2.

Note that using different conflict sets for different groups of constraints will often make the search algorithm easier and more efficient. A second allowed form of the r_conflict annotation is Constraint r_conflict ConflictSet-ConflictData. If this is used, f ConflictData will appear in the conflict set instead of the Constraint itself. This feature can be used to pass additional information to the search algorithm.

Modules

This predicate is sensitive to its module context (tool predicate, see @/2).

Resatisfiable

no

Examples

% lib(fd) is loaded
[eclipse 17]:  A #= B r_conflict c , B tent_set 11, A tent_set 5,  conflict_constraints(c, X).

B = B{11}
A = A{5}
X = [A{5} #= B{11}]  % the constraint is in conflict due to tentative values

[eclipse 18]: A #= B r_conflict c , B = 11, A = 5, conflict_constraints(c, X).

B = 11
A = 5
X = [5#=11] % the constraint is in conflict due to the values of the variables

 A #= B r_conflict c, B tent_set 11, conflict_constraints(c, X).

A = A
B = B{11}
X = []  % the constraint is not in conflict

 A::[1..10],  A #= B r_conflict c, B tent_set 11, conflict_constraints(c, X).

A = A{[1..10]}
B = B{11}
X = [A{[1..10]} #= B{11}]

[eclipse 26]:  A::[1..10],  A #= B r_conflict c, A #= B, B = 11, conflict_constraints(c, X).

no (more) solution. 
% fails because A #= B is also set up as a normal constraint

[eclipse 23]: A::[1..10],  A #= B r_conflict c, A #= B, B tent_set 11, conflict_constraints(c, X).

A = A{fd:[1..10], repair:11}
B = A{fd:[1..10], repair:11}
X = [A{fd:[1..10], repair:11} #= A]
% does not fail because the normal A #= B does not consider tenative values

See Also

conflict_constraints / 2, r_conflict_prop / 2