prolog constraints minimize clpfd

PROLOG CLPFD ¿Cómo expresar esto a través de restricciones?



constraints minimize (2)

La reificación implica restricciones separadas ( #<==>/2 , #==>/2 etc.), puede usarlas, por ejemplo, como:

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).

Consulta de muestra y su resultado:

?- example(Ls). Ls = [1, 2] ; Ls = [2, 1] ; Ls = [1, 1] ; Ls = [2, 2] ; false.

Dada la siguiente muestra de código:

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).

La idea es encontrar la asignación a variables de L que minimice el Costo (en este ejemplo simple, sería X = 1 e Y = 2, o X = 2 e Y = 1).

Estoy tratando de usar el hecho de que la restricción # = / 2 es reificable, lo que significa que refleja sus valores de verdad en valores booleanos representados por los enteros 0 y 1. (tomado del manual http://www.swi-prolog.org /man/clpfd.html ).

Sin embargo, no funciona. Obtuve el siguiente error:

ERROR: Domain error: `clpfd_expression'' expected, found `_G3154#=1''

¿Cuál sería una versión equivalente y correcta?


Como alternativa al uso de la reificación, también puede usar restricciones aritméticas adicionales para "capturar" la igualdad en una expresión:

example([X,Y]) :- X in 1..2, Y in 1..2, Cost #= max(3*(1-min(1,abs(X-1))) + 5*(1-min(1,abs(Y-1))), 3*(1-min(1,abs(X-2))) + 5*(1-min(1,abs(Y-2)))), labeling([min(Cost)], [X,Y]).

Tenga en cuenta que la expresión dentro de Cost #= max(...) se puede simplificar levemente.

Uso de muestra:

?- example(Ls). Ls = [1,2] ; Ls = [2,1] ; Ls = [1,1] ; Ls = [2,2] ; false.