2012-07-28 33 views

回答

5

提供的内建有ISO标准:

?- number_codes(123456,X),format('~s',[X]). 
123456 
X = [49, 50, 51, 52, 53, 54]. 

?- number_chars(123456,X),format('~s',[X]). 
123456 
X = ['1', '2', '3', '4', '5', '6']. 

我也有一些非常旧的代码我为我翻译的发展。 :=必须重命名为is才能使用标准Prolog运行。不过,你最好从上面内建服务...

itoa(N, S) :- 
    N < 0, !, 
    NN := 0 - N, 
    iptoa(NN, SR, _), 
    reverse(SR, SN), 
    append("-", SN, S). 
itoa(N, S) :- 
    iptoa(N, SR, _), 
    reverse(SR, S). 

iptoa(V, [C], 1) :- 
    V < 10, !, 
    C := V + 48. 
iptoa(V, [C|S], Y) :- 
    M := V/10, 
    iptoa(M, S, X), 
    Y := X * 10, 
    C := V - M * 10 + 48. 

编辑这里得到的数字所需要的额外的呼叫:

?- number_codes(123456,X), maplist(plus(48),Y,X). 
X = [49, 50, 51, 52, 53, 54], 
Y = [1, 2, 3, 4, 5, 6]. 
+0

这对我不起作用。我得到:'number_codes(123456,测试)。 Test = [49,50,51,52,53,54]。' – WolfBookyr 2012-07-28 15:16:40

+1

正是我所展示的。我将添加所需的转换... – CapelliC 2012-07-28 16:55:41

0

你可以先创建一个反向列表:

//Base step 
splitRev(0,[]). 
//Recursive step 
splitRev(N,[A|As]) :- N1 is floor(N/10), A is N mod 10, splitRev(N1,As). 

递归步骤像这样工作:

N1 is floor(N/10) 

将N除以10并将其舍入。所以538变为53.8变为53. 它切断了最后一位数字。

A is N mod 10 

需要N个由10 538 MOD 10所得的余数等于8 所以你只有最后一位。

现在为了分割列表,您只需要反转由splitRev/2创建的列表。 所以谓词分流/ 2被定义为:

split(N,L1) :- splitRev(N,L2), reverse(L1,L2). 

注意,反向/ 2是一个内置的谓词。

我希望这有助于!