我完成了以下任务:
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).
答案 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.