如何在Amzi! Prolog中将字符串转为十进制ASCII数值列表?
解决Prolog中字符串转ASCII列表显示为0w前缀格式的问题
我明白你遇到的困扰——用name/2或char_codes/2转换字符串时,得到的是带0w前缀的十六进制格式列表(比如[0w0061,0w0062,0w0063]),但你想要的是十进制的[97,98,99]。别急,这其实是格式显示的问题,本质上这些值和你要的十进制整数是等价的,下面给你具体的解决思路:
一、先搞懂为什么会出现0w前缀
0w是部分Prolog实现(比如特定方言或旧版本)用来表示十六进制字符代码的标记,0w0061就是十六进制的61,对应十进制的97。你可以直接在Prolog里验证这一点:
?- 0w0061 =:= 97. true.
这说明这两个值在逻辑计算上完全等价,只是显示形式不同而已。
二、转换为十进制格式的列表
如果你需要明确得到由十进制数值组成的列表,可以用以下两种方式实现:
1. 自定义递归谓词转换
写一个简单的递归谓词,把每个带0w的元素转换为十进制整数:
convert_to_decimal([], []). convert_to_decimal([HexCode|Rest], [DecCode|DecRest]) :- DecCode is HexCode, % is/2会自动将十六进制表示转换为十进制数值 convert_to_decimal(Rest, DecRest).
使用示例:
?- char_codes("abc", HexCodes), convert_to_decimal(HexCodes, DecCodes). HexCodes = [0w0061, 0w0062, 0w0063], DecCodes = [97, 98, 99].
2. 用maplist简化转换(支持lambda的Prolog)
如果你的Prolog支持lambda表达式(比如SWI-Prolog),可以用maplist一行搞定转换:
?- char_codes("abc", HexCodes), maplist([C, D] >> D is C, HexCodes, DecCodes). HexCodes = [0w0061, 0w0062, 0w0063], DecCodes = [97, 98, 99].
三、如果只是输出显示问题
如果不需要修改列表本身,只是想在输出时看到十进制格式,可以用format/2控制输出样式:
print_decimal_codes([]). print_decimal_codes([Code|Rest]) :- format("~d ", [Code]), print_decimal_codes(Rest).
调用示例:
?- char_codes("abc", Codes), print_decimal_codes(Codes). 97 98 99 true.
内容的提问来源于stack exchange,提问作者Maor Kachalon
相关产品推荐
相关产品推荐

