在prolog中将基数10转换为基数2

时间:2017-12-20 12:48:59

标签: prolog

我正在尝试使用prolog将base 10转换为base 2 这是我的代码:

binary(X,B) :- X > -1 , tobin(B,X,1).
tobin(S,0,1) :- S is 0.
tobin(S,0,V) :- V>1 , S is 1.
tobin(S,X,V) :- X > 0 , 
               X1 is X // 2 , 
               V1 is V * 10 ,  
               tobin(S1,X1,V1),  
               S is X mod 2 , 
               S is S + S1 * V1 .

它不起作用:/你能帮助我吗?非常感谢你:D

2 个答案:

答案 0 :(得分:1)

我写了一个谓词来解决你的问题:

dec2Bin(0,V,_,V).
dec2Bin(N,V,Counter,Val):-
    Reminder is N mod 2,
    N1 is N//2,
    V1 is V + Reminder*(10^Counter),
    Counter1 is Counter + 1,
    dec2Bin(N1,V1,Counter1,Val).

convert(N,V):-
    N > -1,
    dec2Bin(N,0,0,V),
    writeln(V).

?- convert(8,V).
V = 1000.

答案 1 :(得分:1)

如果您想知道原始代码有什么问题,请研究一下:

binary(X,B) :- X > -1 , tobin(B,X).
/*tobin(S,0,1) :- S is 0.*/
/* tobin(S,0,V) :- V>1 , S is 1.*/
tobin(0,0).
tobin(S,X) :- X > 0 , 
               X1 is X // 2 , 
               /*V1 is V * 10 ,  */
               tobin(S1,X1),  
               S0 is X mod 2 , 
               S is S0 + S1 * 10 .

主要有两个变化:

  • 我在一个地方将S重命名为S0,因为没有一个声明始终为假(S is S +...);
  • 我已经从tobin删除了第三个参数,因为没有必要将位置值传递给循环调用,并且在所有这些重复性中,一些错误在我不清楚的地方。

修复后,您的代码看起来更好,来自@damianodamiano(在我看来):

binary(X,B) :- X > -1 , tobin(B,X).
tobin(0,0).
tobin(S,X) :- X > 0 , 
               X1 is X // 2 , 
               tobin(S1,X1),  
               S0 is X mod 2 , 
               S is S0 + S1 * 10 .

实际上,您可以跳过binary并直接调用tobin(参数顺序相反),这样可以更简单:

tobin(0,0).
tobin(S,X) :- X > 0 , 
               X1 is X // 2 , 
               tobin(S1,X1),  
               S0 is X mod 2 , 
               S is S0 + S1 * 10 .

@damianodamiano的主要优点是尾部递归的运行时优化。