You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:27:55