2012-07-28 105 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是一個內置的謂詞。

我希望這有助於!