]> Repositorios git - scryer-prolog.git/commitdiff
Strengthened `(mod)/2` in CLP(Z)
authornotoria <[email protected]>
Sun, 25 May 2025 11:38:56 +0000 (13:38 +0200)
committernotoria <[email protected]>
Sun, 25 May 2025 11:38:56 +0000 (13:38 +0200)
?- 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

index 9daad75c38a6ee5b132098476943e19dcf98612e..0f383094489e435de27e87c75dc88b9072fa17cb 100644 (file)
@@ -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),