我有一个有限区域上变量L的列表。例如:
:- use_module(library(clpfd)).
example :-
L = [_,_,_],
L ins 1..10,
...此外,我还有一个谓词
pred(L,C)对于任何将L赋值给域的值,这就给出了一个成本C。
问题是如何利用CLPFD的标记特性找到L的赋值,从而使C值最小化。
example :-
L = [_,_,_],
L ins 1..10,
pred(L,C),
labeling([min(C)],L),
write(L).不起作用。它只是选择第一个任务(即1,1,1)。
发布于 2014-01-12 12:47:30
很可能,在本例中调用C时,labeling/2已经被实例化了。然后,目标读起来类似于:
labeling([min(1)], Ls)
当然,在labeling/2期间,这里没有任何空间可以将labeling/2最小化。
要做到这一点,您必须制定pred/2,使C通过约束与变量Vs有决定性的关联。例如:
sum(Vs, #=, C), labeling([min(C)], Vs)
如果成本函数是有限域变量Vs的和,则按预期工作。
我通过改写您的示例说明我的进一步建议如下:
example(Ls) :-
Ls = [_,_,_],
Ls ins 1..10,
pred(Ls, C),
labeling([min(C)], Ls).特别是通知:
write/1,因为当我查询?- example(Ls)时,Prolog将为我显示解决方案。https://stackoverflow.com/questions/21072820
复制相似问题