6

我在尝试使用 Prolog 将数字拆分为列表时遇到了麻烦,例如 123456 变为[1,2,3,4,5,6].

你能帮我弄清楚怎么做吗?

4

2 回答 2

7

可用的内置函数是 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才能使用标准 Prologs 运行。但是,最好从上面的内置函数中为您服务...

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].
于 2012-07-28T14:46:59.463 回答
1

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

//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 创建的列表。所以谓词 split/2 定义为:

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

请注意, reverse/2 是一个内置谓词。

我希望这有帮助!

于 2013-04-11T09:40:36.923 回答