我想将整数列表转换为十进制数,但是我得到了一个实例化错误,我无法修复.Below是我尝试这个的代码。
number([X|[]],X).
number([X|XS],Y) :-
len([X|XS],B),
BB is B-1,
YY is X*10^(BB),
L is Y+YY,
number(XS,L).
我不太确定如何解决这个问题。 len
是一个返回给定列表长度的函数。
任何帮助表示赞赏
答案 0 :(得分:0)
假设您有一个十进制数字的整数列表(例如,域名为0-9)。你应该可以这样做:
digits_value( Ds , V ) :-
digits_value(Ds,0,V)
.
digits_value( [] , V , V ) .
digits_value( [D|Ds] , T , V ) :-
T1 is 10*T + D ,
digits_value(Ds,T1,V)
.
关于尾递归的好处是你可以随时构建结果。在每次通话时,您只需按比例缩放10并添加。你不关心10的权力。
要按照您尝试的方式进行操作,您可以尝试撤消列表,以免对10的权力大惊小怪:
digits_value(Ds,V) :-
reverse(Ds,X) ,
digits_value_x(X,V)
.
digits_value_x([D],D).
digits_value_x([D|Ds],V) :-
digits_value_x(Ds,T) ,
V is 10*T + D
.
或者你也可以这样做:
digits_value(Ds,V) :-
length(Ds,L) ,
S is 10**(L-1) ,
digits_value_x(X,S,V)
.
digits_value_x([D],1,D).
digits_value_x([D|Ds],S,V) :-
S1 is S / 10 ,
digits_value_x(Ds,S1,T) ,
V is D*S + T
.