Prolog,检查术语是2的幂

时间:2013-10-30 07:12:01

标签: prolog successor-arithmetics

我已经编写了以下代码,它应该与我的逻辑一起使用,但事实并非如此。

我应该检查给定的术语是否是2的幂。例如,s(s(s(nul)))应返回false,s(s(s(s(nul)))应返回true。

substractWhileY(X,0,rezult).
substractWhileY(s(X),Y,rezult):-
   Y > 0, number is 1,  substractWhileY(X,Y - number, rezult).

degreeOftwo(X):-
   substractWhileY(X,2,rezult),
   pagalba(X, 2, rezult).
calculateAnswer(X, currentCounter, currentValue):-
   currentCounter is currentCounter * 2,
   substractWhileY(currentValue, currentCounter , rezult),
   rezult\= null,
   calculateAnswer(X, currentCounter , rezult).

我的想法是检查给定的温度是否是任何两个的度数,如果不是它不是两个度数。

对于数字,它应该像这样工作。例如,我给出了数字8。

First time it checks if 8 - 2 = 0.
second time if 8 - 4 = 0.
third time if 8 - 8 = 0.

所以两个人的8个身份。

也许其他解决方案会更好,所以感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

假设您正在寻找数字1,2,4,8 ...,或者换句话说,2 ^ 0,2 ^ 1,2 2,2 ^ 2,3,...,那么解决方案是确定性可能是:

two_power_n(s(X)) :-
    two_power_n_minus_one(X). 

two_power_n_minus_one(0).
two_power_n_minus_one(s(X)) :-
    half(s(s(X)), s(Y)),
    two_power_n_minus_one(Y).

half(0, 0).
half(s(s(X)), s(Y)) :-
    half(X, Y).

我不认为这个解决方案是最佳的。

答案 1 :(得分:2)

使用用于计算机中有符号整数的二进制补码表示的属性,确定定点,二进制补码整数是否为2的幂是很容易的:

pow2( X ) :-     % X is a power of 2, if...
  X > 0 ,        % - X is > 0 , and ...
  X is X /\ (-X) % - A bitwise AND of X and its 2s complement yields X
  .              % Easy!

不需要递归,只是苦苦挣扎。

鉴于此,解决方案很简单。只需遍历嵌套结构s/1并计算其深度/长度。然后确定这是否是2的幂。

IsPowerOf2( S ) :- nested_depth(S,0,D) , pow2(D) .

nested_depth( nul  , D , D ).
nested_depth( s(X) , T , D ) :-
  T1 is T+1 ,
  nested_depth(X)
  .

答案 2 :(得分:0)

鲍里斯的答案肯定更完整/更正(+1),而且我早于他的半/ 2谓词。但是这个问题的解决方案看起来更简单:

pow_of_two(s(nul)).
pow_of_two(X) :-
    half(X, H),
    pow_of_two(H).
相关问题