如何在Prolog中实现字符串列表与数字列表的相互转换?
在Prolog中实现字符串列表与数字列表的相互转换
刚好碰到过类似的需求,这里给你几种实用的实现方式,完全满足你把['21', '45', '06']转成[21, 45, 6]的需求,顺便也附上反向转换的代码。
核心实现:字符串列表转数字列表
Prolog的内置谓词已经帮我们处理了字符串(原子)到数字的转换,我们只需要写一个递归谓词遍历整个列表即可:
% 基准情况:空列表对应空列表 str_list_to_num_list([], []). % 递归处理每个元素:将原子字符串转为数字,再处理剩余列表 str_list_to_num_list([StrAtom|RestStr], [Num|RestNum]) :- atom_number(StrAtom, Num), % 单引号括起来的是原子,用这个谓词转换 str_list_to_num_list(RestStr, RestNum).
测试验证
直接查询就能得到你要的结果:
?- str_list_to_num_list(['21', '45', '06'], X). X = [21, 45, 6].
这里'06'自动转换成6,因为数字本身不会保留前导零,完美符合你的要求。
适配不同的字符串类型
如果你的Prolog环境中用双引号表示字符串(比如SWI-Prolog),可以把atom_number/2换成string_number/2:
str_list_to_num_list([], []). str_list_to_num_list([Str|RestStr], [Num|RestNum]) :- string_number(Str, Num), % 处理双引号的字符串类型 str_list_to_num_list(RestStr, RestNum).
测试查询:
?- str_list_to_num_list(["21", "45", "06"], X). X = [21, 45, 6].
如果你的输入是字符列表(比如[[50,49], [52,53], [48,54]],也就是"21"的底层表示),可以先转成原子再转换:
str_list_to_num_list([], []). str_list_to_num_list([CharList|Rest], [Num|RestNum]) :- atom_chars(Atom, CharList), % 字符列表转原子 atom_number(Atom, Num), str_list_to_num_list(Rest, RestNum).
反向转换:数字列表转字符串列表
如果需要把数字列表转回字符串列表,逻辑类似,只需要反向调用内置谓词:
% 数字转原子字符串 num_list_to_str_list([], []). num_list_to_str_list([Num|RestNum], [StrAtom|RestStr]) :- atom_number(StrAtom, Num), num_list_to_str_list(RestNum, RestStr).
测试:
?- num_list_to_str_list([21,45,6], L). L = ['21', '45', '6'].
如果要转成SWI-Prolog的字符串类型,用number_string/2替换atom_number/2即可。
内容的提问来源于stack exchange,提问作者cat123456
相关产品推荐
相关产品推荐

