我得到了以下任务:
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。