如何将字符串列表转换为整数?例如:如果列表是 ['i','am','fine'],结果应该是 [9,14,34] (i=9,am=1+13=14,fine=6+9+ 14+5=34)
我如何在 SWI Prolog 中做到这一点?
如果你有模块 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).
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.
该程序可以使用单个内置谓词atom_codes
和该语言的标准递归工具来构建。
您需要两条规则 - 一条将列表逐项转换为另一个列表,另一条用于汇总组成原子的代码。
每个规则将有两部分 - 一个用于处理基本情况(即一个空列表),另一个用于将传入列表减少一项。
这是一个带有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/3
and sumlist/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).