library(clpb)
в настоящее время доступен в SICStus (исходная версия) и SWI (по мату). Позвольте мне прийти к сути довольно быстро:
?- X = 1+1, sat(X), X = 1+1.
X = 1+1.
?- sat(X), X = 1+1.
false.
Итак, это аналогичная проблема, поскольку она существует в состоянии по умолчанию library(clpfd)
.
Что делать в такой ситуации?
Обновление: в library(clpfd)
мата для этого теперь есть функтор # /1
. В идеале, с объявлением оператора op(100,fx,#)
, мы можем теперь написать:
?- X = 1+1, #X #= Y.
ERROR: Type error: `integer' expected, found `1+1' (a compound)
Чтобы обеспечить полные алгебраические свойства, нужно объявить:
:- set_prolog_flag(clpfd_monotonic, true).
Теперь переменные, которые остаются двусмысленными (таким образом, будучи либо целыми, либо выражениями), создают ошибки создания экземпляра:
?- 1 + 1 #= Y.
ERROR: Arguments are not sufficiently instantiated
?- 1 + 1 #= #Y.
Y = 2.