【发布时间】:2016-05-24 15:17:24
【问题描述】:
我使用 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)).
如果我打电话给constr(3,Y,Z).,我会得到Z #= 1或Z #= 2。
这是因为一些中间变量(相对于mod 表达式)仍然需要计算。
当然理想的情况是只获得Z #= 1。
这是怎么做到的?
我知道如果我改写
((X #= 3)) #==> ((Z #= 1)),
((Z #= 1)) #<==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)).
一切都按预期进行。
但是这种物化是强制性的吗?我的意思是,每次我的约束中有这种模式时,我是否必须创建一个具体化变量:
(A mod n1 #= 0) #\/ (B mod n2 #= 0) #\/ ... #\/ (Z mod n26 #= 0)
提前感谢您的想法。
【问题讨论】: