The implementation achieves domain consistency iff C is instantiated at call time, otherwise only bounds consistency.
?- [X,Y] &:: weekday, shift(X, 1, Y). X = X{[mo, tu, we, th, fr, sa]} Y = Y{[tu, we, th, fr, sa, su]} There is 1 delayed goal. Yes (0.00s cpu) [eclipse 4]: [X,Y]&::weekday, shift(X,C,Y). X = X{[mo, tu, we, th, fr, sa, su]} C = C{-6 .. 6} Y = Y{[mo, tu, we, th, fr, sa, su]} There are 3 delayed goals. Yes (0.00s cpu) ?- shift(we, 1, th). Yes (0.00s cpu) ?- shift(we, 2, fr). Yes (0.00s cpu) ?- shift(X, -1, th). X = fr Yes (0.00s cpu) ?- shift(tu, X, fr). X = 3 Yes (0.00s cpu) ?- shift(tu,X,Y). X = X{-1 .. 5} Y = Y{[mo, tu, we, th, fr, sa, su]} Delayed goals: ... ?- shift(tu, 1, th). No (0.00s cpu) ?- shift(X, 1, Y). Arguments have no domains in shift(X, 1, Y) in module eclipse Abort ?- X &:: weekday, shift(X, 1, red). Arguments have different domains (weekday,colour) in shift(X, 1, red) ... Abort