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
相关产品推荐
相关产品推荐

