SWI Prolog逻辑表达式谓词编译报错:Operator expected的解决方法
解决SWI Prolog中<>运算符语法错误的方案
方案1:自定义<>运算符
SWI Prolog支持用户自定义运算符,你可以在代码开头添加op/3指令,将<>注册为和=同优先级的中缀运算符(复用相等判断的优先级,能保证表达式解析逻辑一致):
% 定义<>为中缀运算符,优先级700,与=保持一致 op(700, xfx, <>). % 实现不等判断子句 is_logical_expression_true(Expr1 <> Expr2, State) :- evaluate_arithmetic_expression(Expr1, State, Val1), evaluate_arithmetic_expression(Expr2, State, Val2), Val1 =\= Val2. % 基于算术值的不等判断
注:xfx表示该运算符是左右结合的中缀类型,优先级700是SWI Prolog中相等类运算符的默认设置,和=、==等规则匹配。
方案2:改用SWI Prolog内置不等谓词
如果不想自定义运算符,直接用内置的算术不等谓词=\=调整子句即可:
% 直接使用内置算术不等逻辑,无需自定义运算符 is_logical_expression_true(Expr1 =\= Expr2, State) :- evaluate_arithmetic_expression(Expr1, State, Val1), evaluate_arithmetic_expression(Expr2, State, Val2), Val1 =\= Val2.
如果你的逻辑需要的是项的严格不相等(不进行变量绑定),可以用\==;但针对算术表达式的不等判断,=\=更合适,因为它会先计算算术值再做比较。
注意事项
- 若选择自定义运算符,必须将
op/3指令放在所有使用该运算符的子句之前,否则编译仍会报错。 - 区分三个不等谓词的差异:
=\=:仅用于算术表达式,计算两边值后判断是否不等。\=:判断两个项是否无法统一(会尝试绑定变量)。\==:判断两个项是否严格不同(不绑定变量)。
内容的提问来源于stack exchange,提问作者Wiktor
相关产品推荐
相关产品推荐

