Merge pull request #1780 from triska/tuples_in

Various improvements to tuples_in/2
This commit is contained in:
Mark Thom
2023-04-12 19:10:50 +02:00
committed by GitHub

View File

@@ -147,7 +147,7 @@
clpz_gcc_num/1, clpz_gcc_num/1,
clpz_gcc_occurred/1, clpz_gcc_occurred/1,
queue/2, queue/2,
enabled/1. disabled/0.
:- dynamic(monotonic/0). :- dynamic(monotonic/0).
:- dynamic(clpz_equal_/2). :- dynamic(clpz_equal_/2).
@@ -2684,7 +2684,7 @@ clear_queue(queue(Goals,Fast,Slow,Aux)) :-
put_atts(Goals, -queue(_,_)), put_atts(Goals, -queue(_,_)),
put_atts(Fast, -queue(_,_)), put_atts(Fast, -queue(_,_)),
put_atts(Slow, -queue(_,_)), put_atts(Slow, -queue(_,_)),
put_atts(Aux, -enabled(_)). put_atts(Aux, -disabled).
collect_goal(Qs) --> collect_arg(Qs, 1). collect_goal(Qs) --> collect_arg(Qs, 1).
collect_fast(Qs) --> collect_arg(Qs, 2). collect_fast(Qs) --> collect_arg(Qs, 2).
@@ -4212,9 +4212,9 @@ queue_get_arg_(Queue, Which, Element) :-
; put_atts(Arg, +queue(Elements,Tail)) ; put_atts(Arg, +queue(Elements,Tail))
). ).
queue_enabled --> state(queue(_,_,_,Aux)), { \+ get_atts(Aux, +enabled(false)) }. queue_enabled --> state(queue(_,_,_,Aux)), { \+ get_atts(Aux, disabled) }.
disable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, +enabled(false)) }. disable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, +disabled) }.
enable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, +enabled(true)) }. enable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, -disabled) }.
portray_propagator(propagator(P,_), F) :- functor(P, F, _). portray_propagator(propagator(P,_), F) :- functor(P, F, _).
@@ -4357,21 +4357,23 @@ list_first_rest([L|Ls], L, Ls).
tuple_domain([], _) --> []. tuple_domain([], _) --> [].
tuple_domain([T|Ts], Relation0) --> tuple_domain([T|Ts], Relation0) -->
{ maplist(list_first_rest, Relation0, Firsts, Relation1) }, { maplist(list_first_rest, Relation0, Firsts, Relation1) },
( var(T) -> ( Firsts = [Unique] -> T = Unique
( Firsts = [Unique] -> T = Unique ; ( var(T) ->
; { list_to_domain(Firsts, FDom), { list_to_domain(Firsts, FDom),
fd_get(T, TDom, TPs), fd_get(T, TDom, TPs),
domains_intersection(TDom, FDom, TDom1) }, domains_intersection(TDom, FDom, TDom1) },
fd_put(T, TDom1, TPs) fd_put(T, TDom1, TPs)
; []
) )
; []
), ),
tuple_domain(Ts, Relation1). tuple_domain(Ts, Relation1).
tuple_freeze(Tuple, Relation) :- tuple_freeze(Tuple, Relation) :-
put_attr(R, clpz_relation, Relation), ( ground(Tuple) -> true
make_propagator(rel_tuple(R, Tuple), Prop), ; put_attr(R, clpz_relation, Relation),
tuple_freeze_(Tuple, Prop). make_propagator(rel_tuple(R, Tuple), Prop),
tuple_freeze_(Tuple, Prop)
).
tuple_freeze_([], _). tuple_freeze_([], _).
tuple_freeze_([T|Ts], Prop) :- tuple_freeze_([T|Ts], Prop) :-
@@ -4490,19 +4492,25 @@ run_propagator(pgeq(A,B), MState) -->
run_propagator(rel_tuple(R, Tuple), MState) --> run_propagator(rel_tuple(R, Tuple), MState) -->
{ get_attr(R, clpz_relation, Relation) }, { get_attr(R, clpz_relation, Relation) },
( { ground(Tuple) } -> kill(MState), { memberchk(Tuple, Relation) } ( { ground(Tuple) } ->
kill(MState),
{ del_attr(R, clpz_relation),
memberchk(Tuple, Relation) }
; { relation_unifiable(Relation, Tuple, Us, false, Changed), ; { relation_unifiable(Relation, Tuple, Us, false, Changed),
Us = [_|_] }, Us = [_|_] },
( { Tuple = [First,Second], ( ground(First) ; ground(Second) ) } -> ( { Tuple = [First,Second], ( ground(First) ; ground(Second) ) } ->
kill(MState) kill(MState)
; [] ; []
), ),
( { Us = [Single] } -> kill(MState), Single = Tuple ( { Us = [Single] } ->
kill(MState),
{ del_attr(R, clpz_relation) },
Single = Tuple
; { Changed } -> ; { Changed } ->
{ put_attr(R, clpz_relation, Us), { put_attr(R, clpz_relation, Us) },
disable_queue }, disable_queue,
tuple_domain(Tuple, Us), tuple_domain(Tuple, Us),
{ enable_queue } enable_queue
; [] ; []
) )
). ).