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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:20:34