用途
prolog-reasoner 将 SWI-Prolog 作为“逻辑计算器”暴露给大语言模型(LLM),以消除 LLM 逻辑推理中的黑箱问题。LLM 擅长自然语言但难以处理形式逻辑,Prolog 擅长逻辑推理但无法处理自然语言,该工具通过让 LLM 编写 Prolog 代码并执行来弥合这一差距。
主要能力
- MCP 服务器:Claude 或任何 MCP 客户端可在对话中将其作为逻辑求解器调用。规则库允许 LLM 一次性保存稳定的领域规则,并在每次调用时按名称引用。
- Python 库:提供完整的自然语言到 Prolog 管道,并带有自我纠正循环,需要 OpenAI 或 Anthropic 的 API 密钥。
- MCP 工具:
execute_prolog用于执行任意 SWI-Prolog 代码;list_rule_bases、get_rule_base、save_rule_base、delete_rule_base用于管理可复用的命名规则库。 - 规则库:一次性保存稳定的 Prolog 规则(例如国际象棋走子规则、法律公理),并通过名称从
execute_prolog引用,使 LLM 每次调用只需编写与具体情境相关的事实。 - 透明的中间表示:Prolog 代码本身就是审计线索,可在执行前检查、修改或验证。
- CLP(FD) 支持:用于调度和优化的约束逻辑编程。
- 否定即失败、递归以及所有标准 SWI-Prolog 特性。
- 库模式:自然语言到 Prolog 的翻译,带自我纠正循环(OpenAI / Anthropic)。
使用方式
环境要求
- 已安装 SWI-Prolog 并在 PATH 中(版本 ≥ 9.0)。
- OpenAI 或 Anthropic 的 API 密钥——仅库模式需要,MCP 服务器不需要。
MCP 服务器设置
MCP 服务器暴露五个工具:execute_prolog 运行连接的 LLM 编写的 Prolog 代码,四个规则库工具管理命名的可复用 Prolog 模块。它不调用任何外部 LLM API,因此无需 API 密钥。
支持 Claude Desktop / Claude Code,也可在直接安装 prolog-reasoner 后使用。若不想在本地安装 SWI-Prolog,可使用 Docker(已捆绑 SWI-Prolog)。
execute_prolog 参数
execute_prolog(prolog_code, query, rule_bases=None, max_results=100, trace=False)
prolog_code— Prolog 事实和规则(字符串)。query— 要运行的 Prolog 查询,例如"mortal(X)"(字符串)。rule_bases— 可选,要前置到prolog_code的已保存规则库名称列表(按顺序)。用于跨调用复用稳定领域规则,无需重复发送。max_results— 返回解的数量上限(默认 100)。trace— 为 True 时,为每个解在metadata.proof_trace中附加结构化证明树。这是可选子特性,有性能开销,且不支持 CLP(FD)、高阶谓词或 assert/retract。
返回包含 success、output、query、error 和 metadata 的 JSON 对象。成功时,metadata 包含 execution_time_ms、result_count、truncated 和 rule_bases_used;请求规则库时还会附加 rule_base_load_ms(磁盘 I/O 计时)。失败时,metadata 还包含 error_category(syntax_error、undefined_predicate、unbound_variable、type_error、domain_error、evaluation_error、permission_error、timeout、trace_mechanism_error、unknown 之一)和 error_explanation——供连接的 LLM 或人类决定如何修复 Prolog 代码的自然语言提示。
规则库工具
在 PROLOG_REASONER_RULES_DIR(默认 ~/.prolog-reasoner/rules/)下管理命名的可复用 Prolog 模块。名称限制为 [a-z0-9_-],长度 1–64。
save_rule_base(name, content)— 写入或覆盖规则库。写入前对内容进行语法验证(仅解析);失败以RULEBASE_003呈现。返回{"success": true, "name": ..., "created": bool},首次写入时created为 true,覆盖时为 false。超过max_rule_size的文件以RULEBASE_005拒绝。list_rule_bases()— 返回所有已保存规则库及其name、description和tags。元数据从每个文件开头的% description:/% tags:注释中提取。get_rule_base(name)— 返回已保存规则库的原始 Prolog 源码。delete_rule_base(name)— 删除已保存的规则库。
对于名称/大小/存在性错误,工具返回 {"success": false, "error": "...", "error_code": "RULEBASE_001"|"RULEBASE_002"|"RULEBASE_003"|"RULEBASE_005"} 而非抛出异常。I/O 失败(RULEBASE_004)作为基础设施错误传播。
规则库约定:每个规则库文件以开头注释作为 list_rule_bases 的元数据,然后从 execute_prolog 引用。规则库也可作为领域专用分支的基础:通过 BUNDLED_RULES_DIR 捆绑一组精选规则(法律公理、游戏规则、税务场景等)作为即用型推理包。
Python 库
库暴露 PrologExecutor(仅 Prolog,无 LLM)和 PrologReasoner(自然语言到 Prolog 管道,需要 LLM API 密钥)。
- 直接执行 Prolog(无 LLM)。
- 完整自然语言到 Prolog 管道(需要 LLM API 密钥)。
所有设置通过环境变量(前缀 PROLOG_REASONER_)。
适用场景
- 约束满足问题(如 SEND+MORE、6 皇后、背包、K4 着色、爱因斯坦谜题简化版)。
- 多步推理(如 Nim 博弈论、三人骑士与骗子、TSP-4、斑马谜题)。
- 需要可审计、可调试推理过程的逻辑任务。
- 作为 LLM 的临时逻辑求解器,而非智能体记忆的骨干。
限制
- 需要 SWI-Prolog ≥ 9.0 并位于 PATH 中。
- 库模式需要 OpenAI 或 Anthropic API 密钥;MCP 服务器不需要。
trace特性有性能开销,且不支持 CLP(FD)、高阶谓词或 assert/retract。- 在纯演绎或传递性问题上,LLM 本身已很强,Prolog 会增加延迟而无准确率提升。
- 基准测试中 LLM+Prolog 的失败均来自 LLM 生成代码的 Prolog 执行错误(缺少谓词定义、未绑定的 CLP(FD) 变量),而非推理错误,可通过提示调优解决。
- 项目有意设计为无状态和临时使用;若需要持久化智能体记忆、防幻觉事实存储或完整的神经符号基底,其他项目可能更合适。
基准测试
benchmarks/ 包含 30 个逻辑问题,分为 5 类(演绎、传递、约束、矛盾、多步),用于比较纯 LLM 推理与 LLM+Prolog 推理。基准测试使用库路径(翻译器 + 执行器),因为需要自然语言到 Prolog 步骤。在 anthropic/claude-sonnet-4-6 上单次运行 30 个问题的测量结果显示,差距集中在约束和多步类别——正是符号求解器优于模式补全的组合/搜索密集型领域。结果保存到 benchmarks/results.json。