From fd1e902492e3b490320f582ace1fb2860c4310f0 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 11 Apr 2023 21:14:18 +0200 Subject: [PATCH 1/5] do not leave an attribute when (re-)enabling a queue --- src/lib/clpz.pl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index acf4738f..588c3b37 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -147,7 +147,7 @@ clpz_gcc_num/1, clpz_gcc_occurred/1, queue/2, - enabled/1. + disabled/0. :- dynamic(monotonic/0). :- dynamic(clpz_equal_/2). @@ -2684,7 +2684,7 @@ clear_queue(queue(Goals,Fast,Slow,Aux)) :- put_atts(Goals, -queue(_,_)), put_atts(Fast, -queue(_,_)), put_atts(Slow, -queue(_,_)), - put_atts(Aux, -enabled(_)). + put_atts(Aux, -disabled). collect_goal(Qs) --> collect_arg(Qs, 1). collect_fast(Qs) --> collect_arg(Qs, 2). @@ -4212,9 +4212,9 @@ queue_get_arg_(Queue, Which, Element) :- ; put_atts(Arg, +queue(Elements,Tail)) ). -queue_enabled --> state(queue(_,_,_,Aux)), { \+ get_atts(Aux, +enabled(false)) }. -disable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, +enabled(false)) }. -enable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, +enabled(true)) }. +queue_enabled --> state(queue(_,_,_,Aux)), { \+ get_atts(Aux, disabled) }. +disable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, +disabled) }. +enable_queue --> state(queue(_,_,_,Aux)), { put_atts(Aux, -disabled) }. portray_propagator(propagator(P,_), F) :- functor(P, F, _). From 94efb9ffe33fb059d4529e04372f4993b4503f88 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 11 Apr 2023 21:16:02 +0200 Subject: [PATCH 2/5] remove no longer needed clpz_relation attributes --- src/lib/clpz.pl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index 588c3b37..ab042152 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -4490,14 +4490,20 @@ run_propagator(pgeq(A,B), MState) --> run_propagator(rel_tuple(R, Tuple), MState) --> { 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), Us = [_|_] }, ( { Tuple = [First,Second], ( ground(First) ; ground(Second) ) } -> kill(MState) ; [] ), - ( { Us = [Single] } -> kill(MState), Single = Tuple + ( { Us = [Single] } -> + kill(MState), + { del_attr(R, clpz_relation) }, + Single = Tuple ; { Changed } -> { put_attr(R, clpz_relation, Us), disable_queue }, From be45672e223a86c4a85919a1be5c155281e7a566 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 11 Apr 2023 21:19:10 +0200 Subject: [PATCH 3/5] actually disable and reenable the queue --- src/lib/clpz.pl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index ab042152..2c412ac3 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -4505,10 +4505,10 @@ run_propagator(rel_tuple(R, Tuple), MState) --> { del_attr(R, clpz_relation) }, Single = Tuple ; { Changed } -> - { put_attr(R, clpz_relation, Us), - disable_queue }, + { put_attr(R, clpz_relation, Us) }, + disable_queue, tuple_domain(Tuple, Us), - { enable_queue } + enable_queue ; [] ) ). From f08f539768bf21e7e63209fbbc1d7a263b67dcb2 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 11 Apr 2023 21:24:34 +0200 Subject: [PATCH 4/5] do not create attributed variables for ground tuples --- src/lib/clpz.pl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index 2c412ac3..daed1471 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -4369,9 +4369,11 @@ tuple_domain([T|Ts], Relation0) --> tuple_domain(Ts, Relation1). tuple_freeze(Tuple, Relation) :- - put_attr(R, clpz_relation, Relation), - make_propagator(rel_tuple(R, Tuple), Prop), - tuple_freeze_(Tuple, Prop). + ( ground(Tuple) -> true + ; put_attr(R, clpz_relation, Relation), + make_propagator(rel_tuple(R, Tuple), Prop), + tuple_freeze_(Tuple, Prop) + ). tuple_freeze_([], _). tuple_freeze_([T|Ts], Prop) :- From 5dce7d907572f7646a26214f129c9200340939f7 Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 11 Apr 2023 22:31:09 +0200 Subject: [PATCH 5/5] FIXED: enforce equality also for ground elements in tuples Example: ?- tuples_in([[A,B]], [[1,2],[3,4]]), tuples_in([[A,B]], [[3,2]]). false. See https://github.com/SWI-Prolog/swipl-devel/issues/1160. --- src/lib/clpz.pl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index daed1471..0e42bd92 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -4357,14 +4357,14 @@ list_first_rest([L|Ls], L, Ls). tuple_domain([], _) --> []. tuple_domain([T|Ts], Relation0) --> { maplist(list_first_rest, Relation0, Firsts, Relation1) }, - ( var(T) -> - ( Firsts = [Unique] -> T = Unique - ; { list_to_domain(Firsts, FDom), + ( Firsts = [Unique] -> T = Unique + ; ( var(T) -> + { list_to_domain(Firsts, FDom), fd_get(T, TDom, TPs), domains_intersection(TDom, FDom, TDom1) }, fd_put(T, TDom1, TPs) + ; [] ) - ; [] ), tuple_domain(Ts, Relation1).