Een leuke manier om deze problemen op te lossen, is door een beperkende oplosser te gebruiken voor eindige domeinen.
Gebruik bijvoorbeeld GNU-Prolog:
solve(Out):-
People = [Jon, Mary, Alice, Smith, Dick, George, Betty, Lucy],
fd_domain(People, 0, 3), % people lives in buildings 0 to 3.
fd_atmost(4, People, 0), % at most, 4 people may live in building 0
fd_atmost(3, People, 1), % at most, 3 people may live in building 1
fd_atmost(2, People, 2), % etc.
fd_atmost(1, People, 3),
Jon #\= Mary, % Jon hates Mary
Alice #\= Smith, % etc.
Betty #\= Lucy,
Jon #\= Alice,
Dick #\= George,
fd_labeling(People), % iterate until an acceptable combination is found.
People = Out.
:- solve(O), write(O), nl.
Vanuit een complexiteitsperspectief blijft dit NP-compleet. Maar de constraint solver kan de manier waarop de toewijzingen worden uitgevoerd op de labelstap opnieuw ordenen zodat dead ends vroeg worden gevonden, wat resulteert in een kleinere zoekboom.