Prolog调用solution查询触发Sandbox restriction错误如何解决
错误产生原因
- 该报错是SWI-Prolog沙箱安全机制触发的限制:沙箱在静态分析代码时,无法推导自定义
all/2谓词中call(P)调用的谓词范围,为了防止恶意动态代码执行,直接阻断了程序运行。 - 你写的
all/2用=../2动态构造谓词再调用,虽然实际调用时传入的是固定的schoolgirl,但沙箱的静态分析逻辑识别不了这种动态构造调用的安全性,所以触发拦截。 - 额外存在一个隐藏语法错误:
mary/2谓词规则里的Fst-betty是笔误,应为Fst=betty,该问题在沙箱报错解决后会暴露。
修复方案
推荐使用最稳妥的无动态调用写法,直接替换掉solution/1里的all/2调用,完全规避动态构造谓词的逻辑,修改后的代码如下:
- 修正
mary/2的规则笔误
mary(Forth, Fst):- x0r(Forth=mary, Fst=betty).
- 调整
solution/1的实现
solution([Fst, Snd, Trd, Forth, Fith]):- % 替换原来的all/2调用,直接逐个约束所有元素为合法女学生,无动态调用 schoolgirl(Fst), schoolgirl(Snd), schoolgirl(Trd), schoolgirl(Forth), schoolgirl(Fith), distinct([Fst, Snd, Trd, Forth, Fith]), betty(Snd, Trd), ethel(Fst, Snd), joan(Trd, Fith), kitty(Snd, Forth), mary(Forth, Fst).
如果需要保留all/2的通用逻辑,也可以给沙箱添加安全元谓词声明,在代码开头加两行配置即可:
:- use_module(library(sandbox)). :- sandbox:safe_meta_predicate(all/2).
该声明会告知沙箱all/2的调用是安全的,不会执行恶意代码,也可解决沙箱拦截问题。
内容的提问来源于stack exchange,提问作者RoboC
相关产品推荐
相关产品推荐

