在prolog中将列表的整数元素转换为小数

时间:2014-05-22 19:52:54

标签: prolog

我想将整数列表转换为十进制数,但是我得到了一个实例化错误,我无法修复.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是一个返回给定列表长度的函数。 任何帮助表示赞赏

1 个答案:

答案 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
  .