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

Prolog调用solution查询触发Sandbox restriction错误如何解决

错误产生原因
  • 该报错是SWI-Prolog沙箱安全机制触发的限制:沙箱在静态分析代码时,无法推导自定义all/2谓词中call(P)调用的谓词范围,为了防止恶意动态代码执行,直接阻断了程序运行。
  • 你写的all/2用=../2动态构造谓词再调用,虽然实际调用时传入的是固定的schoolgirl,但沙箱的静态分析逻辑识别不了这种动态构造调用的安全性,所以触发拦截。
  • 额外存在一个隐藏语法错误:mary/2谓词规则里的Fst-betty是笔误,应为Fst=betty,该问题在沙箱报错解决后会暴露。
修复方案

推荐使用最稳妥的无动态调用写法,直接替换掉solution/1里的all/2调用,完全规避动态构造谓词的逻辑,修改后的代码如下:

  1. 修正mary/2的规则笔误
mary(Forth, Fst):- 
    x0r(Forth=mary, Fst=betty).
  1. 调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:03