PROLOG CLPFD如何通过约束来表达这一点?

use*_*978 6 constraints prolog minimize clpfd

给出以下代码示例:

example(Ls) :-
    Ls = [X,Y],
    Ls ins 1..2,
    Cost #= max((X #= 1)*3 + (Y #= 1)*5,
                (X #= 2)*3 + (Y #= 2)*5),
    labeling([minimize(Cost)], Ls).
Run Code Online (Sandbox Code Playgroud)

我们的想法是找到最小化成本的Ls变量的赋值(在这个简单的例子中,它将是X = 1和Y = 2,或X = 2和Y = 1).

我试图使用约束#=/2是可恢复的这一事实,这意味着将它们的真值反映为由整数0和1表示的布尔值.(取自手册http://www.swi-prolog.org /man/clpfd.html).

但是,它不起作用.我收到以下错误:

ERROR: Domain error: `clpfd_expression' expected, found `_G3154#=1'
Run Code Online (Sandbox Code Playgroud)

什么是等效的,正确的版本?

mat*_*mat 5

物化包括独立的限制(#<==>/2,#==>/2等等),你可以使用它们,例如像:

example(Ls) :-
    Ls = [X,Y],
    Ls ins 1..2,
    X #= 1 #<==> B1,
    Y #= 1 #<==> B2,
    X #= 2 #<==> B3,
    Y #= 2 #<==> B4,
    Cost #= max(B1*3 + B2*5, B3*3 + B4*5),
    labeling([min(Cost)], Ls).
Run Code Online (Sandbox Code Playgroud)

示例查询及其结果:

?- example(Ls).
Ls = [1, 2] ;
Ls = [2, 1] ;
Ls = [1, 1] ;
Ls = [2, 2] ;
false.
Run Code Online (Sandbox Code Playgroud)