fd_must_be_list(Ls, all_different(Ls)-1),
maplist(fd_variable, Ls),
Orig = original_goal(_, all_different(Ls)),
- all_different(Ls, [], Orig),
- do_queue.
+ new_queue(Q0),
+ phrase((all_different(Ls, [], Orig),do_queue), [Q0], _).
-all_different([], _, _).
-all_different([X|Right], Left, Orig) :-
- ( var(X) ->
- make_propagator(pdifferent(Left,Right,X,Orig), Prop),
- init_propagator(X, Prop),
+all_different([], _, _) --> [].
+all_different([X|Right], Left, Orig) -->
+ ( { var(X) } ->
+ { make_propagator(pdifferent(Left,Right,X,Orig), Prop) },
+ init_propagator_([X], Prop),
trigger_prop(Prop)
; exclude_fire(Left, Right, X)
),
parse_goal(g(Goal)) --> [Goal].
parse_goal(p(Prop)) -->
- [make_propagator(Prop, P)],
{ term_variables(Prop, Vs) },
- parse_init(Vs, P),
- [trigger_once(P)].
-
-parse_init([], _) --> [].
-parse_init([V|Vs], P) --> [init_propagator(V, P)], parse_init(Vs, P).
+ [make_propagator(Prop, P),
+ new_queue(Q0),
+ phrase(init_propagator_(Vs, P), [Q0], [Q]),
+ variables_same_queue(Vs),
+ trigger_once_(P, Q)].
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
?- use_module(library(lists)),
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
trigger_once(Prop) :-
new_queue(Q),
+ trigger_once_(Prop, Q).
+
+trigger_once_(Prop, Q) :-
phrase((trigger_prop(Prop),do_queue), [Q], _).
neq(A, B) :- propagator_init_trigger(pneq(A, B)).
propagator_init_trigger(Vs, P) -->
[p(Prop)],
{ make_propagator(P, Prop),
- maplist(prop_init(Prop), Vs),
+ new_queue(Q0),
+ phrase(init_propagator_(Vs, Prop), [Q0], [Q]),
variables_same_queue(Vs),
- trigger_once(Prop) }.
+ trigger_once_(Prop, Q) }.
variables_same_queue(Vs0) :-
include(var, Vs0, Vs),
match_goal(d(X,Y), _) --> [parse_clpz(X, Y)].
match_goal(g(Goal), _) --> [Goal].
match_goal(p(Prop), _) -->
- [make_propagator(Prop, P)],
{ term_variables(Prop, Vs) },
- parse_init(Vs, P),
- [variables_same_queue(Vs),
- trigger_once(P)].
+ [make_propagator(Prop, P),
+ new_queue(Q0),
+ phrase(init_propagator_(Vs, P), [Q0], [Q]),
+ variables_same_queue(Vs),
+ trigger_once_(P, Q)].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
relation_tuple_b_prop(Relation, Tuple, B, p(Prop)) :-
put_attr(R, clpz_relation, Relation),
make_propagator(reified_tuple_in(Tuple, R, B), Prop),
- tuple_freeze_(Tuple, Prop),
- init_propagator(B, Prop).
+ new_queue(Q0),
+ phrase((tuple_freeze_(Tuple, Prop),
+ init_propagator_([B], Prop),
+ do_queue), [Q0], _).
tuples_in_conjunction(Tuples, Relation, Conj) :-
portray_propagator(propagator(P,_), F) :- functor(P, F, _).
+init_propagator_([], _) --> [].
+init_propagator_([V|Vs], Prop) -->
+ ( { fd_get(V, Dom, Ps0) } ->
+ { insert_propagator(Prop, Ps0, Ps) },
+ fd_put(V, Dom, Ps)
+ ; []
+ ),
+ init_propagator_(Vs, Prop).
+
init_propagator(Var, Prop) :-
( fd_get(Var, Dom, Ps0) ->
insert_propagator(Prop, Ps0, Ps),
must_be(list(list), Tuples),
maplist(maplist(fd_variable), Tuples),
must_be(list(list(integer)), Relation),
- maplist(relation_tuple(Relation), Tuples),
+ new_queue(Q0),
+ phrase(tuples_relation(Tuples, Relation), [Q0], [Q]),
append(Tuples, Vs),
- variables_same_queue(Vs).
-
-relation_tuple(Relation, Tuple) :-
- relation_unifiable(Relation, Tuple, Us, _, _),
- ( ground(Tuple) -> memberchk(Tuple, Relation)
- ; new_queue(Q),
- phrase((tuple_domain(Tuple, Us),do_queue), [Q], _),
+ variables_same_queue(Vs),
+ phrase(do_queue, [Q], _).
+
+tuples_relation([], _) --> [].
+tuples_relation([Tuple|Tuples], Relation) -->
+ { relation_unifiable(Relation, Tuple, Us, _, _) },
+ ( ground(Tuple) -> { memberchk(Tuple, Relation) }
+ ; tuple_domain(Tuple, Us),
( Tuple = [_,_|_] -> tuple_freeze(Tuple, Us)
- ; true
+ ; []
)
- ).
+ ),
+ tuples_relation(Tuples, Relation).
list_first_rest([L|Ls], L, Ls).
),
tuple_domain(Ts, Relation1).
-tuple_freeze(Tuple, Relation) :-
- ( ground(Tuple) -> memberchk(Tuple, Relation)
- ; put_attr(R, clpz_relation, Relation),
- make_propagator(rel_tuple(R, Tuple), Prop),
+tuple_freeze(Tuple, Relation) -->
+ ( ground(Tuple) -> { memberchk(Tuple, Relation) }
+ ; { put_attr(R, clpz_relation, Relation),
+ make_propagator(rel_tuple(R, Tuple), Prop) },
tuple_freeze_(Tuple, Prop)
).
-tuple_freeze_([], _).
-tuple_freeze_([T|Ts], Prop) :-
+tuple_freeze_([], _) --> [].
+tuple_freeze_([T|Ts], Prop) -->
( var(T) ->
- init_propagator(T, Prop),
+ init_propagator_([T], Prop),
trigger_prop(Prop)
- ; true
+ ; []
),
tuple_freeze_(Ts, Prop).
distinct_attach([], _, _) --> [].
distinct_attach([X|Xs], Prop, Right) -->
( var(X) ->
- { init_propagator(X, Prop),
- make_propagator(pexclude(Xs,Right,X), P1),
- init_propagator(X, P1) },
+ init_propagator_([X], Prop),
+ { make_propagator(pexclude(Xs,Right,X), P1) },
+ init_propagator_([X], P1),
trigger_prop(P1)
; exclude_fire(Xs, Right, X)
),