]> Repositorios git - scryer-prolog.git/commitdiff
Fixed variable bindings in mod from clpz
authornotoria <[email protected]>
Sat, 15 Aug 2020 11:37:33 +0000 (13:37 +0200)
committernotoria <[email protected]>
Sat, 15 Aug 2020 11:37:33 +0000 (13:37 +0200)
src/lib/clpz.pl

index b78a6d849d5b5e455a60aa4cc878e28abfea0381..76f22f956887a74911c42691c70158b5babc2e0d 100644 (file)
@@ -4984,9 +4984,8 @@ run_propagator(pmod(X,Y,Z), MState) -->
                 % queue_goal(Y #< Z)
             ;   true
             )
-        ;   run_propagator(pmodz(X,Y,Z), MState),
-            run_propagator(pmody(X,Y,Z), MState),
-            true
+        ;   run_propagator(pmody(X,Y,Z), MState),
+            run_propagator(pmodz(X,Y,Z), MState) % This must be the last one.
         ).
 
 run_propagator(pmodz(X,Y,Z), MState) -->
@@ -4996,7 +4995,7 @@ run_propagator(pmodz(X,Y,Z), MState) -->
             ;   (   X > 0 ->
                     (   { fd_get(Y, _, n(YL), _, _), YL > X } ->
                         kill(MState),
-                        Z = X
+                        queue_goal(Z #= X)
                     ;   { fd_get(Z, ZD0, ZPs),
                           domain_remove_greater_than(ZD0, X, ZD2),
                           fd_put(Z, ZD2, ZPs) }
@@ -5005,7 +5004,7 @@ run_propagator(pmodz(X,Y,Z), MState) -->
                 ;   X < 0 ->
                     (   { fd_get(Y, _, _, n(YU), _), YU < X } ->
                         kill(MState),
-                        Z = X
+                        queue_goal(Z #= X)
                     ;   { fd_get(Z, ZD0, ZPs),
                           domain_remove_smaller_than(ZD0, X, ZD2),
                           fd_put(Z, ZD2, ZPs) }
@@ -5033,6 +5032,7 @@ run_propagator(pmodz(X,Y,Z), MState) -->
             (   abs(Y) =:= 1 -> kill(MState), Z = 0
             ;   Y < 0 ->
                 (   { fd_get(X, _, n(XL), n(XU), _), XU =< 0, Y < XL } ->
+                    kill(MState),
                     Z = X
                 ;   { ZMin is Y + 1 },
                     { fd_get(Z, ZD1, ZPs),
@@ -5043,6 +5043,7 @@ run_propagator(pmodz(X,Y,Z), MState) -->
                 )
             ;   Y > 0 ->
                 (   { fd_get(X, _, n(XL), n(XU), _), XL >= 0, Y > XU } ->
+                    kill(MState),
                     Z = X
                 ;   { ZMax is Y - 1 },
                     { fd_get(Z, ZD1, ZPs),
@@ -5054,9 +5055,11 @@ run_propagator(pmodz(X,Y,Z), MState) -->
             )
         ;   (   { fd_get(X, _, n(XL), n(XU), _), XL >= 0,
                   fd_get(Y, _, n(YL), _, _), XU < YL } ->
+                kill(MState),
                 Z = X
             ;   { fd_get(X, _, n(XL), n(XU), _), XU =< 0,
                   fd_get(Y, _, _, n(YU), _), XL > YU } ->
+                kill(MState),
                 Z = X
             ;   (   { fd_get(X, _, n(XL), n(XU), _), XL >= 0 } ->
                     { fd_get(Z, ZD0, ZPs),