我在有限域上有一个变量列表 L 。例如:
:- use_module(library(clpfd)).
example :-
L = [_,_,_],
L ins 1..10,
...
此外,我有一个谓词
pred(L,C)
对于 L 到域的值的任何分配,给出成本 C 。
问题是如何使用CLPFD的标签特征来找到最小化C的L的分配。
example :-
L = [_,_,_],
L ins 1..10,
pred(L,C),
labeling([min(C)],L),
write(L).
不起作用。它只选择第一个分配(即 [1,1,1] )。
答案 0 :(得分:3)
最有可能的是,在此示例中,C
已经被labeling/2
实例化。然后,目标类似于:
labeling([min(1)], Ls)
当然,在C
期间,实际上没有留出任何空间来实际减少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 toplevel将为我显示解决方案。