Author: Markus Triska
WWW: https://www.metalevel.at
- Copyright (C): 2016-2021 Markus Triska
+ Copyright (C): 2016-2022 Markus Triska
This library provides CLP(ℤ):
| Expr `mod` Expr | Modulo induced by floored division |
| Expr `rem` Expr | Modulo induced by truncated division |
| abs(Expr) | Absolute value |
+ | sign(Expr) | Sign (-1, 0, 1) of Expr |
| Expr // Expr | Truncated integer division |
| Expr div Expr | Floored integer division |
m(A//B) => [g(B #\= 0), p(ptzdiv(A, B, R))],
m(A div B) => [g(?(R) #= (A - (A mod B)) // B)],
m(A^B) => [p(pexp(A, B, R))],
+ m(sign(A)) => [g(R in -1..1), p(psign(A, R))],
% bitwise operations
m(\A) => [p(pfunction(\, A, R))],
m(msb(A)) => [p(pfunction(msb, A, R))],
; true
).
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% % Y = sign(X)
+
+run_propagator(psign(X,Y), MState) -->
+ ( nonvar(X) -> kill(MState), queue_goal(Y is sign(X))
+ ; Y == -1 -> kill(MState), queue_goal(X #< 0)
+ ; Y == 0 -> kill(MState), queue_goal(X = 0)
+ ; Y == 1 -> kill(MState), queue_goal(X #> 0)
+ ; { fd_get(X, _, XL, XU, _) },
+ ( { XL = n(L), L > 0 } -> kill(MState), queue_goal(Y = 1)
+ ; { XU = n(U), U < 0 } -> kill(MState), queue_goal(Y = -1)
+ ; true
+ )
+ ).
+
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% % Y = popcount(X)
attribute_goal_(pdiv(X,Y,Z)) --> [?(X) div ?(Y) #= ?(Z)].
attribute_goal_(prdiv(X,Y,Z)) --> [?(X) / ?(Y) #= ?(Z)].
attribute_goal_(pexp(X,Y,Z)) --> [?(X) ^ ?(Y) #= ?(Z)].
+attribute_goal_(psign(X,Y)) --> [?(Y) #= sign(?(X))].
attribute_goal_(pabs(X,Y)) --> [?(Y) #= abs(?(X))].
attribute_goal_(pmod(X,M,K)) --> [?(X) mod ?(M) #= ?(K)].
attribute_goal_(prem(X,Y,Z)) --> [?(X) rem ?(Y) #= ?(Z)].