This commit is contained in:
Vitor Santos Costa 2019-05-12 15:40:29 +01:00
parent 46b9b46bca
commit babf3dd77d
1 changed files with 68 additions and 21 deletions

View File

@ -9,7 +9,7 @@ in a more CLP like style. It requires
~~~~~{.prolog}
:- use_module(library(gecode/clpfd)).
~~~~~
Several example programs are available with the distribution.
Several example programs are available with the distributionv.
Integer variables are declared as:
@ -96,7 +96,8 @@ Constraints supported are:
in_dfa/2,
in_dfa/4, /*
tuples_in/2, */
labeling/2 /*,
labeling/2,
bool_labeling/2 /*,
label/1,
indomain/1,
serialized/2,
@ -306,6 +307,8 @@ process_constraints((B0,B1), (NB0, NB1), Env, L) :-
process_constraints(B1, NB1, Env,L).
process_constraints(labeling(A,B),labeling(A, B), env(_Space),true) :-
!.
process_constraints(bool_labeling(A,B),bool_labeling(A, B), env(_Space),true) :-
!.
process_constraints(B, B, env(_Space),_) :-
constraint(B), !.
process_constraints(B, B, _Env,_).
@ -552,37 +555,37 @@ clause( or, Ps, Ns, V ) :-
bool_labeling(Opts, Xs) :-
get_home(Space-Map),
foldl2( processs_bool_lab_opt, Opts, 'BOOL_VAR_DEGREE_MIN', BranchVar, 'BOOL_VAL_MIN', BranchVal),
foldl2( process_bool_lab_opt, Opts, 'BOOL_VAR_DEGREE_MIN', BranchVar, 'BOOL_VAL_MIN', BranchVal),
term_variables(Xs, Vs),
check( Vs, X1s ),
( X1s == [] -> true ;
maplist(ll(Map), X1s, NXs),
Space += branch(NXs, BranchVar, BranchVal) ).
processs_bool_lab_opt(leftmost, _, 'BOOL_VAR_NONE', BranchVal, BranchVal).
processs_bool_lab_opt(min, _, 'BOOL_VAR_DEGREE_MIN', BranchVal, BranchVal).
processs_bool_lab_opt(max, _, 'BOOL_VAR_DEGREE_MAX', BranchVal, BranchVal).
processs_bool_lab_opt(min_step, BranchVar, BranchVar, _, 'BOOL_VAL_MIN').
processs_bool_lab_opt(max_step, BranchVar, BranchVar, _, 'BOOL_VAL_MIN').
processs_bool_lab_opt(enum, BranchVar, BranchVar, _, 'BOOL_VALUES_MIN').
process_bool_lab_opt(leftmost, _, 'BOOL_VAR_NONE', BranchVal, BranchVal).
process_bool_lab_opt(min, _, 'BOOL_VAR_DEGREE_MIN', BranchVal, BranchVal).
process_bool_lab_opt(max, _, 'BOOL_VAR_DEGREE_MAX', BranchVal, BranchVal).
process_bool_lab_opt(min_step, BranchVar, BranchVar, _, 'BOOL_VAL_MIN').
process_bool_lab_opt(max_step, BranchVar, BranchVar, _, 'BOOL_VAL_MIN').
process_bool_lab_opt(enum, BranchVar, BranchVar, _, 'BOOL_VALUES_MIN').
labeling(Opts, Xs) :-
get_home(Space-Map),
foldl2( processs_lab_opt, Opts, 'INT_VAR_SIZE_MIN', BranchVar, 'INT_VAL_MIN', BranchVal),
foldl2( process_lab_opt, Opts, 'INT_VAR_SIZE_MIN', BranchVar, 'INT_VAL_MIN', BranchVal),
term_variables(Xs, Vs),
check( Vs, X1s ),
( X1s == [] -> true ;
maplist(ll(Map), X1s, NXs),
Space += branch(NXs, BranchVar, BranchVal) ).
processs_lab_opt(leftmost, _, 'INT_VAR_NONE', BranchVal, BranchVal).
processs_lab_opt(min, _, 'INT_VAR_SIZE_MIN', BranchVal, BranchVal).
processs_lab_opt(max, _, 'INT_VAR_SIZE_MAX', BranchVal, BranchVal).
processs_lab_opt(ff, _, 'INT_VAR_DEGREE_MIN', BranchVal, BranchVal).
processs_lab_opt(min_step, BranchVar, BranchVar, _, 'INT_VAL_MIN').
processs_lab_opt(max_step, BranchVar, BranchVar, _, 'INT_VAL_MIN').
processs_lab_opt(bisect, BranchVar, BranchVar, _, 'INT_VAL_MED').
processs_lab_opt(enum, BranchVar, BranchVar, _, 'INT_VALUES_MIN').
process_lab_opt(leftmost, _, 'INT_VAR_NONE', BranchVal, BranchVal).
process_lab_opt(min, _, 'INT_VAR_SIZE_MIN', BranchVal, BranchVal).
process_lab_opt(max, _, 'INT_VAR_SIZE_MAX', BranchVal, BranchVal).
process_lab_opt(ff, _, 'INT_VAR_DEGREE_MIN', BranchVal, BranchVal).
process_lab_opt(min_step, BranchVar, BranchVar, _, 'INT_VAL_MIN').
process_lab_opt(max_step, BranchVar, BranchVar, _, 'INT_VAL_MIN').
process_lab_opt(bisect, BranchVar, BranchVar, _, 'INT_VAL_MED').
process_lab_opt(enum, BranchVar, BranchVar, _, 'INT_VALUES_MIN').
maximize(V) :-
@ -601,7 +604,6 @@ extensional_constraint( Tuples, TupleSet) :-
dfa( S0, Transitions, Finals, DFA) :-
DFA := dfa( S0, Transitions, Finals ).
check(V, NV) :-
( var(V) -> V = NV ;
number(V) -> V = NV ;
@ -711,7 +713,23 @@ post( rel( sum(L0), Op, Out), Space-Map, Reify):-
).
post( rel(A1+A2, Op, B), Space-Map, Reify):-
( var(B) ; B = _ + _ ; B = _-_), !,
var( B ), !,
linearize(A1+A2, 1, As, [], CAs, [], 0, A0, Space-Map),
l(B, B0, Map),
gecode_arith_op( Op, GOP ),
(var(Reify) ->
( checklist(is_one, CAs) ->
Space += linear(As, GOP, B0);
Space += linear(CAs, As, GOP, B0)
)
;
( checklist(is_one, CAs) ->
Space += linear(As, GOP, B0, Reify);
Space += linear(CAs, As, GOP, B0, Reify)
)
).
post( rel(A1+A2, Op, B), Space-Map, Reify):-
( B = _ + _ ; B = _-_), !,
linearize(A1+A2, 1, As, Bs, CAs, CBs, 0, A0, Space-Map),
linearize(B, -1, Bs, [], CBs, [], A0, B0, Space-Map),
gecode_arith_op( Op, GOP ),
@ -728,7 +746,24 @@ post( rel(A1+A2, Op, B), Space-Map, Reify):-
).
post( rel(A1-A2, Op, B), Space-Map, Reify):-
( var(B) ; B = _ + _ ; B = _-_), !,
( var(B) ), !,
linearize(A1-A2, 1, As, [], CAs, [], 0, A0, Space-Map),
l(B, B0, Map),
gecode_arith_op( Op, GOP ),
(var(Reify) ->
( checklist(is_one, CAs) ->
Space += linear(As, GOP, B0);
Space += linear(CAs, As, GOP, B0)
)
;
( checklist(is_one, CAs) ->
Space += linear(As, GOP, B0, Reify);
Space += linear(CAs, As, GOP, B0, Reify)
)
).
post( rel(A1-A2, Op, B), Space-Map, Reify):-
( B = _ + _ ; B = _-_), !,
linearize(A1-A2, 1, As, Bs, CAs, CBs, 0, A0, Space-Map),
linearize(B, -1, Bs, [], CBs, [], A0, B0, Space-Map),
gecode_arith_op( Op, GOP ),
@ -887,24 +922,36 @@ linearize(V, C, [A|As], As, [C|CAs], CAs, I, I, _-Map) :-
var(V), !,
l(V, A, Map).
linearize(A+B, C, As, Bs, CAs, CBs, I, IF, Env) :-
!,
linearize(A, C, As, A1s, CAs, CA1s, I, I1, Env),
linearize(B, C, A1s, Bs, CA1s, CBs, I1, IF, Env).
linearize([], _C, As, As, CAs, CAs, I, I, _) :-
!.
linearize([A|B], C, As, Bs, CAs, CBs, I, IF, Env) :-
!,
linearize(A, C, As, A1s, CAs, CA1s, I, I1, Env),
linearize(B, C, A1s, Bs, CA1s, CBs, I1, IF, Env).
linearize(A-B, C, As, Bs, CAs, CBs, I, IF, Env) :-
!,
NC is -C,
linearize(A, C, As, A1s, CAs, CA1s, I, I1, Env),
linearize(B, NC, A1s, Bs, CA1s, CBs, I1, IF, Env).
linearize(A, C, As, As, CAs, CAs, I, IF, _) :-
!,
integer(A), !,
IF is I-C*A.
linearize(A, C, As, As, CAs, CAs, I, IF, _) :-
!,
ground(A),
catch( (B is eval(A)), _, fail ), !,
IF is I-C*B.
linearize(C1*B, C, As, Bs, CAs, CBs, I, IF, Env) :-
!,
integer(C1), !,
NC is C*C1,
linearize(B, NC, As, Bs, CAs, CBs, I, IF, Env).
linearize(B*C1, C, As, Bs, CAs, CBs, I, IF, Env) :-
!,
integer(C1), !,
NC is C*C1,
linearize(B, NC, As, Bs, CAs, CBs, I, IF, Env).