Prolog字符串数字提取程序运行异常,寻求故障排查帮助
问题分析与修复方案
你的Prolog程序无法正常运行主要有几个关键问题,下面逐一说明并给出修复后的代码:
1. 输入读取逻辑错误
read/1是用于读取符合Prolog语法的项,而非原始字符串。比如输入hello 123 test时,read会因这不是合法Prolog项而报错。需改用read_line_to_string/2读取整行用户输入(适配SWI-Prolog环境)。
2. 无效声明干扰匹配
代码开头的word_digits( string, string ).和present_digits(string).属于无效的模式声明/事实,会干扰谓词匹配逻辑,必须删除。
3. 输出末尾存在多余空格
原代码拼接结果时,每个匹配的token后都添加空格,导致最终输出末尾多一个无效空格。需调整拼接逻辑避免此问题。
修复后的完整代码
% 检查字符串中是否包含数字 present_digits("") :- fail. present_digits(S) :- frontchar(S, C, _), C >= '0', C =< '9', !. present_digits(S) :- frontchar(S, _, S2), present_digits(S2). % 提取包含数字的词 word_digits("", "") :- !. word_digits(S, O) :- fronttoken(S, T, S2), present_digits(T), word_digits(S2, O2), (O2 = "" -> O = T ; concat(T, " ", O3), concat(O3, O2, O)), !. word_digits(S, O) :- fronttoken(S, _, S2), word_digits(S2, O). % 主程序:读取输入并输出结果 printThatShit :- write("Enter string: "), read_line_to_string(user_input, S), % 读取整行字符串 nl, word_digits(S, Digits), write(Digits).
代码说明
read_line_to_string(user_input, S):正确读取用户输入的整行字符串,无需额外引号包裹。- 优化拼接逻辑:当后续结果
O2为空时,直接使用当前token作为输出,避免末尾出现多余空格。 - 删除无效声明,确保谓词匹配逻辑准确。
测试示例
输入:hello 123 test456 abc 789
输出:123 test456 789
内容的提问来源于stack exchange,提问作者Serhii Melnikov
相关产品推荐
相关产品推荐

