0

私のロジックで動作するはずの次のコードを作成しましたが、動作しません。

与えられた項が 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).

私の考えは、与えられたものが2の次数であるかどうか、そうでない場合は2の次数ではないことを確認することでした。

数値では、このように機能するはずです。たとえば、私は8番を与えます。

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

つまり、id の 2 の 8 乗です。

他の解決策がうまくいくかもしれませんので、助けてくれてありがとう。

4

3 に答える 3

2

固定小数点の 2 の補数の整数が 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)
  .
于 2013-10-30T18:14:21.883 に答える
2

数字 1、2、4、8...、つまり 2^0、2^1、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).

この解決策は最適ではないと思います。

于 2013-10-30T09:52:02.100 に答える
0

ボリスの答えは確かにより完全で正確です (+1)。しかし、あなたの質問に対する解決策は、次のようにするとより簡単に見えます。

pow_of_two(s(nul)).
pow_of_two(X) :-
    half(X, H),
    pow_of_two(H).
于 2013-10-30T15:29:43.960 に答える