分割成数的位数的Prolog列表(Split a number into a list of dig

2019-09-20 09:21发布

我一直有麻烦试图号码拆分为使用Prolog的列表,如123456变成[1,2,3,4,5,6]

能否请你帮我工作,如何做到这一点?

Answer 1:

可用内建有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].


Answer 2:

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

//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是一个内置的谓词。

我希望这有帮助!



文章来源: Split a number into a list of digits in Prolog