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.