首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PROLOG CLPFD最小化表达式

PROLOG CLPFD最小化表达式
EN

Stack Overflow用户
提问于 2014-01-12 08:40:01
回答 1查看 1.5K关注 0票数 2

我有一个有限区域上变量L的列表。例如:

代码语言:javascript
复制
:- use_module(library(clpfd)).

example :-
    L = [_,_,_],
    L ins 1..10,
    ...

此外,我还有一个谓词

代码语言:javascript
复制
pred(L,C)

对于任何将L赋值给域的值,这就给出了一个成本C。

问题是如何利用CLPFD的标记特性找到L的赋值,从而使C值最小化。

代码语言:javascript
复制
example :-
    L = [_,_,_],
    L ins 1..10,
    pred(L,C),
    labeling([min(C)],L),
    write(L).

不起作用。它只是选择第一个任务(即1,1,1)。

EN

回答 1

Stack Overflow用户

发布于 2014-01-12 12:47:30

很可能,在本例中调用C时,labeling/2已经被实例化了。然后,目标读起来类似于:

labeling([min(1)], Ls)

当然,在labeling/2期间,这里没有任何空间可以将labeling/2最小化。

要做到这一点,您必须制定pred/2,使C通过约束与变量Vs有决定性的关联。例如:

sum(Vs, #=, C), labeling([min(C)], Vs)

如果成本函数是有限域变量Vs的和,则按预期工作。

我通过改写您的示例说明我的进一步建议如下:

代码语言:javascript
复制
example(Ls) :-
    Ls = [_,_,_],
    Ls ins 1..10,
    pred(Ls, C),
    labeling([min(C)], Ls).

特别是通知:

  1. 我不需要使用write/1,因为当我查询?- example(Ls)时,Prolog将为我显示解决方案。
  2. 我让表示列表的变量的名称以s结尾,就像构建英语复数一样。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21072820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档