PROLOG CLPFD最小化表达式

PROLOG CLPFD最小化表达式,prolog,label,clpfd,labeling,Prolog,Label,Clpfd,Labeling,我有一个有限域上的变量列表。例如: :- 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

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

:- 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])。

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

标签([min(1)],Ls)

当然,在
labeling/2
过程中,没有任何空间来实际最小化
C

为了实现这一点,您必须制定
pred/2
,以便
C
通过约束与变量
Vs
确定相关。例如:

:- use_module(library(clpfd)).

example :-
    L = [_,_,_],
    L ins 1..10,
    ...
sum(Vs,#=,C),
标签([min(C)],Vs)

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

我将您的示例改写为:

example(Ls) :-
    Ls = [_,_,_],
    Ls ins 1..10,
    pred(Ls, C),
    labeling([min(C)], Ls).
特别注意:

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

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

    标签([min(1)],Ls)

    当然,在
    labeling/2
    过程中,没有任何空间来实际最小化
    C

    为了实现这一点,您必须制定
    pred/2
    ,以便
    C
    通过约束与变量
    Vs
    确定相关。例如:

    :- use_module(library(clpfd)).
    
    example :-
        L = [_,_,_],
        L ins 1..10,
        ...
    
    sum(Vs,#=,C),
    标签([min(C)],Vs)

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

    我将您的示例改写为:

    example(Ls) :-
        Ls = [_,_,_],
        Ls ins 1..10,
        pred(Ls, C),
        labeling([min(C)], Ls).
    
    特别注意:

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

  • 也许这是唯一的解决方案,因为0无法使用?joel76,你在假设Pred的情况也许这是唯一的解决方案,因为0无法使用?joel76,你在假设Pred的情况谢谢,现在我明白为什么它不起作用了。然而,在这种情况下,我认为pred过于复杂,无法通过约束来描述它。约束具体化通常用于表示更复杂的约束。如果所有这些都失败了,您还可以实现一个自定义传播程序。谢谢,现在我明白了为什么它不起作用。然而,在这种情况下,我认为pred过于复杂,无法通过约束来描述它。约束具体化通常用于表示更复杂的约束。如果所有其他操作都失败,还可以实现自定义传播器。