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