The behaviour of minimize/2 is such that the cost bound is tightened whenever a better solution is found, but this tightening does not trigger an automatic check. It can therefore be advantageous and lead to earlier failure when minimize_bound_check/0 is called after every labeling step.
labeling([]). labeling([X|Xs]) :- % do the check urgently, before any propagation happens call_priority((indomain(X), minimize_bound_check), 2), labeling(Xs).