2

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

4

1 回答 1

4

最有可能的是,在本例中调用C时已经实例化。labeling/2然后目标类似于:

labeling([min(1)], Ls)

当然,Clabeling/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,因为 Prolog 顶层会在我查询时为我显示解决方案?- example(Ls)
  2. 我让表示列表的变量的名称以s结尾,类似于构建英语复数。
于 2014-01-12T12:47:30.743 回答