PROLOG CLPFD 最小化表达

标签 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])。

最佳答案

很可能,在本示例中调用 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).

特别注意:

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

关于PROLOG CLPFD 最小化表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072820/

相关文章:

prolog - 在序言中查找两个列表之间不重复的交集

prolog - 为 L0 程序术语生成 WAM 代码的正确顺序是什么?

prolog - 不要在 Prolog 中重复解决方案

Prolog 回溯 VS Rete 回溯

html5-canvas - 将标签添加到角度上的 jqplot 圆环图

numbers - prolog 将数字转换为罗马数字

colors - 如何为 Chart.js 工具提示标签设置颜色

ios - Swift:在 AppDelegate 中设置标签文本

prolog - Prolog 中的 bool 赋值

prolog - 使用 CLP 获取间隔