我有一个有限域上的变量列表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])。
最佳答案
很可能,在本示例中调用 labeling/2
时,C
已经实例化。目标类似于:
标签([min(1)], Ls)
当然,在 labeling/2
期间,没有空间实际最小化 C
。
要实现此目的,您必须制定 pred/2
,以便 C
通过约束与变量 Vs
确定性相关。例如:
sum(Vs, #=, C),
标签([分钟(C)],Vs)
如果成本函数是有限域变量 Vs
之和,则按预期工作。
我通过将您的示例重写为来说明我的进一步建议:
example(Ls) :-
Ls = [_,_,_],
Ls ins 1..10,
pred(Ls, C),
labeling([min(C)], Ls).
特别注意:
- 我不需要使用
write/1
,因为当我查询?- example(Ls)
时,Prolog 顶层会为我显示解决方案。 - 我让表示列表的变量名称以 s 结尾,类似于构建英语复数形式。
关于PROLOG CLPFD 最小化表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072820/