]> Repositorios git - scryer-prolog.git/commitdiff
ENHANCED: Queue morphed propagators to give them a chance for propagation.
authorMarkus Triska <[email protected]>
Tue, 10 Oct 2023 17:42:42 +0000 (19:42 +0200)
committerMarkus Triska <[email protected]>
Tue, 10 Oct 2023 19:32:45 +0000 (21:32 +0200)
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

index ff7cfe4f0766b87943738dbc39bea158a737d362..77bd7ba6c17a0653d57850eb2c369f9c4053106a 100644 (file)
@@ -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) ->