]> Repositorios git - scryer-prolog.git/commitdiff
Strengthened `(mod)/2` in CLP(Z)
authornotoria <[email protected]>
Sun, 25 May 2025 11:37:28 +0000 (13:37 +0200)
committernotoria <[email protected]>
Sun, 25 May 2025 11:37:28 +0000 (13:37 +0200)
?- Z = 8, X = 9, #Z #= #X mod #Y.
   Z = 8, X = 9, clpz:(Y in 9..sup), clpz:(9 mod#Y#=8). % unexpected
Expected: false

src/lib/clpz.pl

index b14546bc19dd3197b2e3022e61160a9667d7fca9..9daad75c38a6ee5b132098476943e19dcf98612e 100644 (file)
@@ -5088,11 +5088,21 @@ run_propagator(pmod(X,Y,Z), MState) -->
         ;   nonvar(Z), nonvar(X) ->
             (   Z > 0 ->
                 (   X < 0 -> true
-                ;   X >= Z
+                ;   X >= Z,
+                    % due to X = Z+Y*_ and Y > Z
+                    (   X-Z > 0 ->
+                        X-Z > Z
+                    ;   true
+                    )
                 )
             ;   Z < 0 ->
                 (   X > 0 -> true
-                ;   X =< Z
+                ;   X =< Z,
+                    % due to X = Z+Y*_ and Y < Z
+                    (   X-Z < 0 ->
+                        X-Z < Z
+                    ;   true
+                    )
                 )
             ;   Z =:= 0 % Multiple solutions so do nothing special.
             ),