From 282633c877fe1cf9fa39a900c33e4fb05922f43b Mon Sep 17 00:00:00 2001 From: Markus Triska Date: Tue, 10 Oct 2023 19:42:42 +0200 Subject: [PATCH] ENHANCED: Queue morphed propagators to give them a chance for propagation. This addresses #2096: ?- B in -2..0, 0#<==>0#=0/(B*B),labeling([],[B]). B = 0. ?- A#<==>A#=A/A^2,A=0. A = 0. --- src/lib/clpz.pl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index ff7cfe4f..77bd7ba6 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -2657,6 +2657,12 @@ morphing_propagator(P0, P, Target) :- ), P =.. [F|Args]. +morph_into_propagator(MState, Vs, Propagator, Morph) --> + kill(MState), + { make_propagator(Propagator, Morph) }, + init_propagator_(Vs, Morph), + trigger_prop(Morph). + /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ?- use_module(library(lists)), use_module(library(format)), @@ -4834,9 +4840,7 @@ run_propagator(pplus(X,Y,Z,Morph), MState) --> ) ) ; ( X == Y -> - kill(MState), - { make_propagator(ptimes(2,X,Z,_), Morph) }, - init_propagator_([X,Z], Morph) + morph_into_propagator(MState, [X,Z], ptimes(2,X,Z,_), Morph) ; X == Z -> kill(MState), Y = 0 ; Y == Z -> kill(MState), X = 0 ; { fd_get(X, XD, XL, XU, XPs), @@ -4909,9 +4913,7 @@ run_propagator(ptimes(X,Y,Z,Morph), MState) --> ) ) ; ( X == Y -> - kill(MState), - { make_propagator(pexp(X,2,Z,_), Morph) }, - init_propagator_([X,Z], Morph) + morph_into_propagator(MState, [X,Z], pexp(X,2,Z,_), Morph) ; { fd_get(X, XD, XL, XU, XPs), fd_get(Y, _, YL, YU, _), fd_get(Z, ZD, ZL, ZU, _) }, @@ -5440,10 +5442,8 @@ run_propagator(pmin(X,Y,Z), MState) --> run_propagator(pexp(X,Y,Z,Morph), MState) --> ( X == 1 -> kill(MState), Z = 1 ; X == 0 -> - kill(MState), queue_goal((Z in 0..1, Y #>= 0)), - { make_propagator(reified_eq(1,Y,1,0,[],Z), Morph) }, - init_propagator_([Y,Z], Morph) + morph_into_propagator(MState, [Y,Z], reified_eq(1,Y,1,0,[],Z), Morph) ; Y == 0 -> kill(MState), Z = 1 ; Y == 1 -> kill(MState), Z = X ; nonvar(X) -> -- 2.54.0