From 1873b655a81b118f2604f5d9f7e39eb6d7e6ea52 Mon Sep 17 00:00:00 2001 From: notoria Date: Fri, 24 Apr 2020 22:47:24 +0200 Subject: [PATCH] Implemented lsb/2 and msb/2 --- src/prolog/lib/arithmetic.pl | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/prolog/lib/arithmetic.pl 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). -- 2.54.0