我使用CLP(FD)和SWI-Prolog编写了一个CSP程序.
我认为当我在谓词中使用mod运算符时,我需要改进约束的写法#\/.
一个简短的例子:
:- use_module(library(clpfd)).
constr(X,Y,Z) :-
X in {1,2,3,4,5,6,7},
Y in {3,5,7},
Z in {1,2},
((X #= 3)) #==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)),
((Z #= 1)) #<==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)).
Run Code Online (Sandbox Code Playgroud)
如果我打电话constr(3,Y,Z).,我得到Z #= 1或Z #= 2.这是因为mod仍然需要评估一些中间变量(相对于表达式).
当然理想只是获得Z #= 1.
怎么可以这样做?
我知道如果我写的话
((X #= 3)) #==> ((Z #= 1)),
((Z #= 1)) …Run Code Online (Sandbox Code Playgroud)