PROLOG CLPFD最小化表达

时间:2014-01-12 08:40:01

标签: prolog label clpfd labeling

我在有限域上有一个变量列表 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] )。

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).

特别注意:

  1. 我不需要使用write/1,因为当我查询?- example(Ls)时,Prolog toplevel将为我显示解决方案。
  2. 我将表示列表的变量名称以 s 结尾,类似于构建英语复数。