:-use_module(library(clpfd)). labeling(Xs):-labeling([],Xs). :-op(700,xfx,'::'). Xs :: D :- nonvar(Xs), Xs=[_|_],!, dom_constrs(Xs,D). X :: D :- dom_constr(X,D). dom_constrs([],D). dom_constrs([X|Xs],D):- dom_constr(X,D), dom_constrs(Xs,D). dom_constr(X,D):-D=(L..U),!,X in L..U. dom_constr(X,D):-D=[_|_],!, list_to_set(D,S), X in S. list_to_set([],Set):-!,Set={}. list_to_set(List,Set):- Set={And}, list_to_and(List,And). list_to_and([X],G):-!, G=X. list_to_and([X|Xs],G):- G=(X,G1), list_to_and(Xs,G1).