我正在尝试使用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
答案 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的主要优点是尾部递归的运行时优化。