如图所示,在swi prolog中将字符串列表转换为整数

时间:2013-05-05 12:21:41

标签: lambda prolog

如何将字符串列表转换为整数?例如:如果列表是['i','am','fine'],结果应为[9,14,34](i = 9,am = 1 + 13 = 14,fine = 6 + 9 + 14 + 5 = 34)

我如何在SWI Prolog中执行此操作?

3 个答案:

答案 0 :(得分:1)

如果你有模块lambda(http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl),你可以写

:- use_module(library(lambda)).

convert(Lst, Val) :-
    maplist(\X^Y^(atom_codes(X, Ch),
              foldl(\Z^T^U^(U is T + Z-96),Ch, 0, Y)), Lst, Val).

答案 1 :(得分:0)

convert(Atoms, Values) :-
    maplist(a2n, Atoms, Values).

a2n(Atom, Num) :-
    atom_codes(Atom, Cs),
    [A] = "a",
    maplist(sub(A), Cs, L),
    sumlist(L, Num).

sub(A, C, N) :- N is C - A + 1.

答案 2 :(得分:0)

该程序可以使用单个内置谓词atom_codes和该语言的标准递归工具构建。

您需要两个规则 - 一个用于逐个项目列表转换为另一个列表,另一个用于合并原子组成的代码。

每个规则都有两个部分 - 一个用于处理基本情况(即空列表),另一个用于将传入列表减少一个项目。

以下是demo on ideone的示例实现:

sum_atoms([], []).
sum_atoms([H|T], [HeadSum|RT]) :-
    atom_codes(H, Codes),
    sum_letters(Codes, HeadSum),
    sum_atoms(T, RT).

sum_letters([], 0).
sum_letters([H|T], Res) :-
    sum_letters(T, TailSum),
    Res is (H-96) + TailSum.

如果您想使用maplist/3sumlist/2内置谓词进行列表处理,可以像这样缩短您的程序:

sum_atoms(In, Out) :-
    maplist(sum_letters, In, Out).

sum_letters(Atom, Sum) :-
    atom_codes(Atom, Codes),
    maplist(plus(-96), Codes, LetterNumbers),
    sumlist(LetterNumbers, Sum).

Link to a demo on ideone