From 4a6f86591cc8c5108910e4117b47395b2a817799 Mon Sep 17 00:00:00 2001 From: notoria Date: Sun, 25 May 2025 13:38:56 +0200 Subject: [PATCH] Strengthened `(mod)/2` in CLP(Z) ?- 0 #= 2 mod #Y. clpz:(Y in inf.. -1\/1..sup), clpz:(2 mod#Y#=0). % unexpected Expected: clpz:(Y in-2.. -1\/1..2), clpz:(2 mod Y#=0) --- src/lib/clpz.pl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lib/clpz.pl b/src/lib/clpz.pl index 9daad75c..0f383094 100644 --- a/src/lib/clpz.pl +++ b/src/lib/clpz.pl @@ -5122,7 +5122,16 @@ run_propagator(pmod(X,Y,Z), MState) --> domain_remove_greater_than(YD, YMax, YD1) }, fd_put(Y, YD1, YPs) % queue_goal(Y #< Z) - ; true + ; Z =:= 0, + ( X =:= 0 -> + kill(MState) % trivial + ; % only 4 solutions {-abs(X),-1,1,abs(X)} + { YL is -abs(X), YU is abs(X), + fd_get(Y, YD0, YPs), + domain_remove_smaller_than(YD0, YL, YD1), + domain_remove_greater_than(YD1, YU, YD) }, + fd_put(Y, YD, YPs) + ) ) ) ; run_propagator(pmodz(X,Y,Z), MState), -- 2.54.0