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.
This commit is contained in:
@@ -2657,6 +2657,12 @@ morphing_propagator(P0, P, Target) :-
|
|||||||
),
|
),
|
||||||
P =.. [F|Args].
|
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(lists)),
|
||||||
use_module(library(format)),
|
use_module(library(format)),
|
||||||
@@ -4834,9 +4840,7 @@ run_propagator(pplus(X,Y,Z,Morph), MState) -->
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
; ( X == Y ->
|
; ( X == Y ->
|
||||||
kill(MState),
|
morph_into_propagator(MState, [X,Z], ptimes(2,X,Z,_), Morph)
|
||||||
{ make_propagator(ptimes(2,X,Z,_), Morph) },
|
|
||||||
init_propagator_([X,Z], Morph)
|
|
||||||
; X == Z -> kill(MState), Y = 0
|
; X == Z -> kill(MState), Y = 0
|
||||||
; Y == Z -> kill(MState), X = 0
|
; Y == Z -> kill(MState), X = 0
|
||||||
; { fd_get(X, XD, XL, XU, XPs),
|
; { fd_get(X, XD, XL, XU, XPs),
|
||||||
@@ -4909,9 +4913,7 @@ run_propagator(ptimes(X,Y,Z,Morph), MState) -->
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
; ( X == Y ->
|
; ( X == Y ->
|
||||||
kill(MState),
|
morph_into_propagator(MState, [X,Z], pexp(X,2,Z,_), Morph)
|
||||||
{ make_propagator(pexp(X,2,Z,_), Morph) },
|
|
||||||
init_propagator_([X,Z], Morph)
|
|
||||||
; { fd_get(X, XD, XL, XU, XPs),
|
; { fd_get(X, XD, XL, XU, XPs),
|
||||||
fd_get(Y, _, YL, YU, _),
|
fd_get(Y, _, YL, YU, _),
|
||||||
fd_get(Z, ZD, ZL, ZU, _) },
|
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) -->
|
run_propagator(pexp(X,Y,Z,Morph), MState) -->
|
||||||
( X == 1 -> kill(MState), Z = 1
|
( X == 1 -> kill(MState), Z = 1
|
||||||
; X == 0 ->
|
; X == 0 ->
|
||||||
kill(MState),
|
|
||||||
queue_goal((Z in 0..1, Y #>= 0)),
|
queue_goal((Z in 0..1, Y #>= 0)),
|
||||||
{ make_propagator(reified_eq(1,Y,1,0,[],Z), Morph) },
|
morph_into_propagator(MState, [Y,Z], reified_eq(1,Y,1,0,[],Z), Morph)
|
||||||
init_propagator_([Y,Z], Morph)
|
|
||||||
; Y == 0 -> kill(MState), Z = 1
|
; Y == 0 -> kill(MState), Z = 1
|
||||||
; Y == 1 -> kill(MState), Z = X
|
; Y == 1 -> kill(MState), Z = X
|
||||||
; nonvar(X) ->
|
; nonvar(X) ->
|
||||||
|
|||||||
Reference in New Issue
Block a user