From fe371ff1d100888ebe2b25f4454c6145437ee207 Mon Sep 17 00:00:00 2001 From: notoria Date: Sun, 7 Jan 2024 20:14:32 +0100 Subject: [PATCH 1/3] Fix `min/2` and `max/2` ?- X in 0..1, Y in 2..4, Z #= max(X,Y). clpz:(X in 0..1), clpz:(Z#=max(X,Y)), clpz:(Z in 2..4), clpz:(Z#>=Y), clpz:(Y in 2..4). % unexpected. ?- X in 0..1, Y in 2..4, Z #= max(Y,X). Y = Z, clpz:(X in 0..1), clpz:(Y in 2..4). --- src/lib/clpz.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index 9ac73745..c0c30681 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -5398,7 +5398,7 @@ run_propagator(pmax(X,Y,Z), MState) --> ; { fd_get(Z, ZD, ZPs) } -> { fd_get(X, _, XInf, XSup, _), fd_get(Y, _, YInf, YSup, _) }, - ( { YInf cis_gt YSup } -> kill(MState), queue_goal(Z = Y) + ( { YInf cis_gt XSup } -> kill(MState), queue_goal(Z = Y) ; { YSup cis_lt XInf } -> kill(MState), queue_goal(Z = X) ; { n(M) cis max(XSup, YSup) } -> { domain_remove_greater_than(ZD, M, ZD1) }, @@ -5433,7 +5433,7 @@ run_propagator(pmin(X,Y,Z), MState) --> ; { fd_get(Z, ZD, ZPs) } -> { fd_get(X, _, XInf, XSup, _), fd_get(Y, _, YInf, YSup, _) }, - ( { YSup cis_lt YInf } -> kill(MState), Z = Y + ( { YSup cis_lt XInf } -> kill(MState), Z = Y ; { YInf cis_gt XSup } -> kill(MState), Z = X ; { n(M) cis min(XInf, YInf) } -> { domain_remove_smaller_than(ZD, M, ZD1) }, From 770ead9c05a5427503fffd4f7b2ce83b8d84eb30 Mon Sep 17 00:00:00 2001 From: notoria Date: Sun, 7 Jan 2024 20:15:28 +0100 Subject: [PATCH 2/3] Remove `min/2` and `max/2` when possible ?- A #= min(A,B). clpz:(B#>=A), clpz:(A#=min(A,B)). % unexpected. ?- A #= min(A,0). clpz:(A in inf..0), clpz:(A#=min(A,0)). % unexpected. --- src/lib/clpz.pl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index c0c30681..d699cad1 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -5384,6 +5384,7 @@ run_propagator(pmax(X,Y,Z), MState) --> ; Z > X -> queue_goal(Z = Y) ; { false } % Z < X ) + ; Y == Z -> kill(MState), queue_goal(Y #>= X) ; { fd_get(Y, _, YInf, YSup, _) }, ( { YInf cis_gt n(X) } -> queue_goal(Z = Y) ; { YSup cis_lt n(X) } -> queue_goal(Z = X) @@ -5419,6 +5420,7 @@ run_propagator(pmin(X,Y,Z), MState) --> ; Z < X -> Z = Y ; { false } % Z > X ) + ; Y == Z -> kill(MState), queue_goal(Y #=< X) ; { fd_get(Y, _, YInf, YSup, _) }, ( { YSup cis_lt n(X) } -> Z = Y ; { YInf cis_gt n(X) } -> Z = X From 1f3de74cbd7e744692700e9fbb75ae989dd4e1f8 Mon Sep 17 00:00:00 2001 From: notoria Date: Sun, 7 Jan 2024 20:19:40 +0100 Subject: [PATCH 3/3] Fix bound computation in `(^)/2` ?- A in 0..1, B in-1..0, A^2 #= B. false. % unexpected. ?- A^2 #= B, A in 0..1, B in-1..0. A = 0, B = 0. --- src/lib/clpz.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index d699cad1..505a4f64 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -5542,7 +5542,7 @@ run_propagator(pexp(X,Y,Z,Morph), MState) --> fd_put(Z, ZD2, ZPs), { ( even(Y), ZU = n(Num) -> integer_kth_root_leq(Num, Y, RU), - ( XL cis_geq n(0), ZL = n(Num1) -> + ( XL cis_geq n(0), ZL = n(Num1), Num1 >= 0 -> integer_kth_root_leq(Num1, Y, RL0), ( RL0^Y < Num1 -> RL is RL0 + 1 ; RL = RL0