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)
什么是等效的,正确的版本?
物化包括独立的限制(#<==>/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)