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

时间:2015-07-16 04:29:20

标签: 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对其进行编码即可。

这是我到目前为止所得到的。我不是100%肯定我是否应该这样做。当我运行查询int_log(133,Z)时,它只显示true或false的答案。

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).

1 个答案:

答案 0 :(得分:1)

就像这样的练习一样,问题陈述已经包含了答案。

  

% precondition( integer(X) ). % precondition( X > 0 ). 被假定为非负整数

X
  

...将int_log2(1, 0). int_log2(X, Y) :- 除以2的次数,以降低

X
  

... 次数您将+除以2 ......

     

...使用 而不是div X0 is X div 2, % used `div` int_log2(X0, Y0), Y is Y0 + 1. % used `+` 进行编码。

Y is msb(X).

所以这就是这样的:

?- int_log2(133, X).
X = 7 .

?- int_log2(256, X).
X = 8 .

?- int_log2(255, X).
X = 7 .

如果您尝试寻找更多解决方案,会发生什么?选择点来自哪里?你怎么能摆脱它?如何在不使用切割的情况下摆脱它?

这是数学课程还是" Prolog"课程?如果它是为了教你Prolog,那你将度过一段美好的时光。

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

@GenericGenerator(name = "increment", strategy = "increment")
@GeneratedValue(generator = "increment")

例如:

?- X is msb(133).
X = 7.

?- X is msb(256).
X = 8.