From: Markus Triska Date: Tue, 10 Oct 2023 17:42:42 +0000 (+0200) Subject: ENHANCED: Queue morphed propagators to give them a chance for propagation. X-Git-Tag: remove~37^2~3 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=282633c877fe1cf9fa39a900c33e4fb05922f43b;p=scryer-prolog.git 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. --- 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) ->