Prolog沙箱限制错误:无法推导可调用谓词的解决方法
修复Prolog沙箱限制错误的方案
错误原因
沙箱限制错误是因为代码中直接将true/false布尔值当作谓词调用(比如expression1里的(C, \+J),这里变量C是布尔值,却被作为目标执行),Prolog沙箱会拦截这种无法提前静态推导的动态谓词调用。同时原代码的expression3末尾多了一个分号,存在语法错误。
修复后的完整代码
expression1(C, J) :- (C = true, J = false); (C = false, J = true). expression2(J, D) :- (J = true, D = false); (J = false, D = true). expression3(D, C, J) :- ( D = true, C = false, J = false ); ( D = false, (C = true ; J = true) ). values([true, false]). combined_expression(C, J, D) :- write('C = '), write(C), write(', '), write('J = '), write(J), write(', '), write('D = '), writeln(D), expression1(C, J), expression2(J, D), expression3(D, C, J). solve:- values(Values), member(A, Values), member(B, Values), member(C, Values), combined_expression(A, B, C).
关键修改点
- 将所有直接使用布尔变量作为谓词的写法(比如
C、\+J)替换为显式的相等判断(C = true、J = false),避免动态调用触发沙箱拦截。 - 移除
expression3末尾多余的分号,修复语法错误。
内容的提问来源于stack exchange,提问作者Станислав
相关产品推荐
相关产品推荐

