2

こんにちは、この数字のリスト (436,L) のような電話があります。

リストを逆にして末尾再帰にするにはどうすればよいですか??

list_of_digits(0,[]).
list_of_digits(M, [Z|Zx]) :- M > 0 , 
                  MM is floor(M / 10), 
                  Z is M mod 10,        
                  list_of_digits(MM,Zx).

誰でも私を助けてもらえますか??

私の番号、この場合は 436 を [4,3,6] のようなリストに変換したいと思います。

I call  ?-  list_of_digits(436,L)
and get 
    L = [6,3,4] ;
    false.
back.
4

2 に答える 2

1

アキュムレータの使用:

list_of_digits(X,L) :- lod_acc(X, [], L).
lod_acc(0,R,R).
lod_acc(M,Acc,R) :-
    M > 0, 
    MM is floor(M / 10), 
    Z is M mod 10,        
    lod_acc(MM,[Z|Acc],R).
于 2012-12-14T09:30:19.317 に答える
0

負の数とゼロ自体 (特殊なケース) を処理するには、次のようにします。

%
% the external/public API predicate.
%
% this handles the special case of zero, which has 1 digit.
% all other cases are handled by the internal worker predicate.
%
digits_in( X , Ds  ) :- int(X) , X > 0 ,               digits_in(X,[],Ds).
digits_in( X , Ds  ) :- int(X) , X < 0 , Y is abs(X) , digits_in(Y,[],Ds).
digits_in( 0 , [0] ) .

%
% the internal/private guts-of-the-operation predicate
%
digits_in( 0 , Ds , Ds ).        % when we hit zero, we're done.
digits_in( X , Ts , Ds ) :-      % otherwise...
  T  is X mod 10 ,               % get the lower order digit via modulus arithmetic
  X1 is X //  10 ,               % get the high order digits via integer division
  digits_in( X1 , [T|Ts] , Ds )  % [tail-]recurse down.
  .
于 2012-12-14T19:55:59.340 に答える