From: notoria Date: Sat, 15 Aug 2020 15:06:12 +0000 (+0200) Subject: Using queue_goal//1 to correctly bind variables X-Git-Tag: v0.9.0~174^2~9^2~2 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=d4263cc8b91d24501f35c5e87ef67a77fb4cbd12;p=scryer-prolog.git Using queue_goal//1 to correctly bind variables --- diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index 76f22f95..2c8bfdda 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -4928,7 +4928,7 @@ run_propagator(pmod(X,Y,Z), MState) --> ( Y == 0 -> { false } ; Y == Z -> { false } % ; nonvar(Y), Z == X -> true - ; X == Y -> kill(MState), Z = 0 + ; X == Y -> kill(MState), queue_goal(Z = 0) ; true ), ( nonvar(X), nonvar(Y) -> @@ -4984,18 +4984,19 @@ run_propagator(pmod(X,Y,Z), MState) --> % queue_goal(Y #< Z) ; 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), + run_propagator(pmody(X,Y,Z), MState), + true ). run_propagator(pmodz(X,Y,Z), MState) --> ( nonvar(Z) -> true % Nothing to do. ; nonvar(X) -> - ( X =:= 0 -> kill(MState), Z = X + ( X =:= 0 -> kill(MState), queue_goal(Z = X) ; ( X > 0 -> ( { fd_get(Y, _, n(YL), _, _), YL > X } -> kill(MState), - queue_goal(Z #= X) + queue_goal(Z = X) ; { fd_get(Z, ZD0, ZPs), domain_remove_greater_than(ZD0, X, ZD2), fd_put(Z, ZD2, ZPs) } @@ -5004,7 +5005,7 @@ run_propagator(pmodz(X,Y,Z), MState) --> ; X < 0 -> ( { fd_get(Y, _, _, n(YU), _), YU < X } -> kill(MState), - queue_goal(Z #= X) + queue_goal(Z = X) ; { fd_get(Z, ZD0, ZPs), domain_remove_smaller_than(ZD0, X, ZD2), fd_put(Z, ZD2, ZPs) } @@ -5029,11 +5030,11 @@ run_propagator(pmodz(X,Y,Z), MState) --> ) ) ; nonvar(Y) -> - ( abs(Y) =:= 1 -> kill(MState), Z = 0 + ( abs(Y) =:= 1 -> kill(MState), queue_goal(Z = 0) ; Y < 0 -> ( { fd_get(X, _, n(XL), n(XU), _), XU =< 0, Y < XL } -> kill(MState), - Z = X + queue_goal(Z = X) ; { ZMin is Y + 1 }, { fd_get(Z, ZD1, ZPs), domain_remove_greater_than(ZD1, 0, ZD3), @@ -5044,7 +5045,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 + queue_goal(Z = X) ; { ZMax is Y - 1 }, { fd_get(Z, ZD1, ZPs), domain_remove_smaller_than(ZD1, 0, ZD3), @@ -5056,11 +5057,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 + queue_goal(Z = X) ; { fd_get(X, _, n(XL), n(XU), _), XU =< 0, fd_get(Y, _, _, n(YU), _), XL > YU } -> kill(MState), - Z = X + queue_goal(Z = X) ; ( { fd_get(X, _, n(XL), n(XU), _), XL >= 0 } -> { fd_get(Z, ZD0, ZPs), domain_remove_greater_than(ZD0, XU, ZD2),