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

如何修复Prolog中的‘当前或前序运算符需加括号’语法错误?

解决Prolog语法错误:current or previous operator needs brackets

你的代码触发语法错误的核心原因是条件分支中逗号与->操作符的优先级冲突。在Prolog的语法规则里,逗号(,)的优先级低于->,这会导致atom_chars(Word, [H|T]), char_type(H, alpha) -> Token = id(Word)被错误解析,进而触发"操作符需要括号"的报错。

以下是修正后的完整代码:

convert_to_tokens([Word|Rest], [Token|RestTokens]) :-
    atom_string(Atom, Word),
    (   Atom == '+' -> Token = pl
    ;   Atom == '-' -> Token = mi
    ;   Atom == '*' -> Token = ti
    ;   Atom == '/' -> Token = di
    ;   number_string(Number, Word) -> Token = Number
    ;   (atom_chars(Word, [H|T]), char_type(H, alpha)) -> Token = id(Word)
    ;   Token = Atom
    ),
    convert_to_tokens(Rest, RestTokens).

convert_to_tokens([], []).

关键修正点:

  • 给包含逗号的条件atom_chars(Word, [H|T]), char_type(H, alpha)加上括号,确保这两个目标作为一个整体参与->的条件判断,避免优先级解析错误。
  • 补充了递归终止子句convert_to_tokens([], []).,原代码缺少该子句会导致递归无法结束,运行时会出现栈溢出问题。

另外说明:你代码中Atom == '+'这类写法是正确的,单引号已经将操作符包裹为原子,不需要额外调整。

内容的提问来源于stack exchange,提问作者Madi92998

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:03:21