int_log2(X,Y),它将Y设置为整数log2(X),其中X被假定为非负整数

  • 本文关键字:整数 log2 它将 int 设置 其中 prolog
  • 更新时间 :
  • 英文 :


我得到了以下任务:

int_log2(X,Y),将Y设置为整数log2 of X,其中X假定为非负整数。例如,int_log(133,X)将设置X to 7。整数log base 2 of X表示用X除以2得到1的次数。其中除以表示整数除法。仅使用+div对其进行编码。

这是我目前得到的。我不能百分之百肯定我是否应该这样做。当我运行查询int_log(133,Z)时,它只显示真或假的答案。

div(0,X).
div(X,Z) :- X =0,  X1 is X-1, div(X1,W), Z is floor(X/2).
int_log(0,X).
int_log(X,Z) :- X = 0,  X1 is X-1, int_log(X1,W), div(W,Z).

与此类练习一样,问题陈述已经包含了答案。

假设

X非负整数

% precondition( integer(X) ).
% precondition( X > 0 ).

X除以2得到 1

的次数
int_log2(1, 0).
int_log2(X, Y) :-

X除以2的次数…

…使用不要超过+div 来编码。

    X0 is X div 2, % used `div`
    int_log2(X0, Y0),
    Y is Y0 + 1. % used `+`

就像这样:

<>之前?- int_log2(133, X)。X = 7。?- int_log2(256, X)。X = 8。?- int_log2(255, X)。X = 7。之前

如果你试图寻找更多的解决方案会发生什么?选择点从何而来?你怎样才能摆脱它呢?怎样不用割伤就能去掉呢?

这是为数学课准备的还是为"Prolog"课程准备的?如果它的目的是教你Prolog,你会有不好的时间。

至于如何解决它:如果您正在使用具有算术函数msb()的实现,您只需说:

Y is msb(X).
例如:

<>之前- X是msb(133)。X = 7。- X是msb(256)。X = 8。