Prolog实现十进制数转数字列表(禁用number_chars/number_codes内置谓词)
Prolog整数转数字列表实现(不使用内置字符转换谓词)
实现思路
- 核心通过数学运算拆分每一位:用
mod 10取当前数的最后一位,用// 10移除最后一位 - 递归完成所有位的拆分,由于拆分顺序是从低位到高位,最后反转列表得到从高位到低位的正确顺序
- 单独处理0的边界情况,避免返回空列表
完整代码
% 辅助谓词:拆分数字为逆序的数字列表 num_to_list_rev(0, []) :- !. num_to_list_rev(N, [D|Ds]) :- N > 0, D is N mod 10, N1 is N // 10, num_to_list_rev(N1, Ds). % 主谓词:将正整数转换为按高位到低位排列的数字列表 numbertolist(0, [0]) :- !. numbertolist(N, List) :- N > 0, num_to_list_rev(N, RevList), reverse(RevList, List). % 可选:支持负数(返回带符号位的列表,不需要可删除) numbertolist(N, [ '-' | AbsList ]) :- N < 0, NAbs is -N, numbertolist(NAbs, AbsList).
测试效果
?- numbertolist(1456, List). List = [1, 4, 5, 6]. ?- numbertolist(0, List). List = [0]. ?- numbertolist(987654321, List). List = [9, 8, 7, 6, 5, 4, 3, 2, 1]. % 负数测试(开启可选逻辑后生效) ?- numbertolist(-123, List). List = [ '-', 1, 2, 3 ].
说明
- 所有逻辑完全基于算术运算实现,没有使用
number_chars/2、number_codes/2等字符转换类内置谓词 - 切分大整数时不会有性能问题,递归深度等于数字的位数,远低于Prolog默认的递归深度限制
- 如果不需要支持负数,直接删除最后一段负数处理的逻辑即可
内容的提问来源于stack exchange,提问作者dealerprogrammer
相关产品推荐
相关产品推荐

