В библиотеке ограничений library(ic_global)
действительно отсутствует ограничение; он должен предоставить lex_ne/2
, аналогично lex_lt / 2 . Это будет иметь такое же логическое и рабочее поведение, как и код, который вы написали, то есть распространяться, когда в его списках аргументов остается только одна переменная:
?- B#::0..1, lex_ne([1,0,1], [1,B,1]).
B = 1
Для сравнения, вы можете попробовать оператор различия звука ~ = / 2 (в некоторых прологах он называется dif / 2). Это эффективно реализовано, но оно не знает о доменах и поэтому не будет распространяться; он просто ждет, пока обе стороны будут созданы, а затем потерпит неудачу или преуспеет:
?- B#::0..1, [1,0,1] ~= [1,B,1].
B = B{[0, 1]}
There is 1 delayed goal.
?- B#::0..1, [1,0,1] ~= [1,B,1], B = 0.
No (0.00s cpu)
Будет ли это в целом быстрее, зависит от вашего приложения.