From: notoria Date: Fri, 24 Apr 2020 20:47:24 +0000 (+0200) Subject: Implemented lsb/2 and msb/2 X-Git-Tag: v0.8.123~110^2 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1873b655a81b118f2604f5d9f7e39eb6d7e6ea52;p=scryer-prolog.git Implemented lsb/2 and msb/2 --- diff --git a/src/prolog/lib/arithmetic.pl b/src/prolog/lib/arithmetic.pl new file mode 100644 index 00000000..ab691a09 --- /dev/null +++ b/src/prolog/lib/arithmetic.pl @@ -0,0 +1,25 @@ +:- module(arithmetic, [msb/2, lsb/2]). + +lsb(X, N) :- + builtins:must_be_number(X, lsb/2), + ( \+ integer(X) -> throw(error(type_error(integer, X), lsb/2)) + ; X < 1 -> throw(error(domain_error(not_less_than_one, X), lsb/2)) + ; builtins:can_be_number(N, lsb/2), + X1 is X /\ (-X), + msb_(X1, -1, N) + ). + +msb(X, N) :- + builtins:must_be_number(X, msb/2), + ( \+ integer(X) -> throw(error(type_error(integer, X), msb/2)) + ; X < 1 -> throw(error(domain_error(not_less_than_one, X), msb/2)) + ; builtins:can_be_number(N, msb/2), + X1 is X >> 1, + msb_(X1, 0, N) + ). + +msb_(0, N, N) :- !. +msb_(X, M, N) :- + X1 is X >> 1, + M1 is M + 1, + msb_(X1, M1, N).