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

Prolog使用(condition->then;else)语法时出现未定义过程错误

解决Eclipse Prolog中未定义过程的错误

你遇到的错误是因为逻辑表达式的语法解析问题,Prolog没有正确识别谓词调用和逻辑运算符的边界,把复合表达式当成了一个未定义的谓词。下面是具体的解决方案和解释:

错误原因分析

错误提示里的(not ifs(_485)) /\ ifm(_485)被Prolog误解析成了一个完整的谓词名称,而不是not(ifs(_485))和ifm(_485)的逻辑合取。这是因为缺少必要的括号来明确优先级,加上not/1的写法在复合表达式中容易引发歧义。

修正后的代码

我调整了语法,用Prolog标准的逻辑运算符(逗号,表合取,分号;表析取)替代/\和\/,同时用\+/1(Prolog标准否定谓词)代替not/1,并添加明确的括号避免解析混乱:

:- lib(fd).
ifs(sel).
ifm(moutarde).
ifld(lesdeux).
ifrien(A) :- A #\= sel, A #\= moutarde, A #\= lesdeux.

selmoutarde(Vars) :- 
    Vars = [B, C, D, M], 
    Vars :: [sel, moutarde, lesdeux], 
    % 第一个条件:若C不是lesdeux,则B绑定为sel
    ( \+ ifld(C) -> B #= sel ; true ), 
    % 第二个条件:(D同时满足非sel、是moutarde、是lesdeux 或 M是lesdeux) 且 B是sel → B绑定为lesdeux
    ( ( (\+ ifs(D), ifm(D), ifld(D)) ; ifld(M) ), ifs(B) -> B #= lesdeux ; true ), 
    % 第三个条件:(D同时满足非sel、是moutarde、是lesdeux 或 M是lesdeux) 且 B是rien → B绑定为moutarde
    ( ( (\+ ifs(D), ifm(D), ifld(D)) ; ifld(M) ), ifrien(B) -> B #= moutarde ; true ).

额外逻辑优化提示

注意到你的代码中(\+ ifs(D), ifm(D), ifld(D))这个条件永远无法满足:

  • D只能是sel、moutarde或lesdeux中的一个;
  • 若D是sel,\+ ifs(D)为假;若D是moutarde,ifld(D)为假;若D是lesdeux,ifm(D)为假。

所以这部分合取式永远为假,整个条件可以简化为ifld(M),比如第二个条件可以改成:

( ifld(M), ifs(B) -> B #= lesdeux ; true )

这样能让代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:19:20