内容
-tools — 面向 AI 的 Rocq 证明器工具层
[
](https://img.shields/dashboard-results-2d6?style=for-thehttps://llm4.github.io/roc/)
一个**经验设计中立的 MCP层**,允许 LLM 代理驱动 Rocq(Coq)证明器 — 以及受控实验。从一个朴素的控制工具 = 一个完整的 `rocq compile`)开始了一个弱代理哪里会失败,并迭代接口,每次一个可衡量的变化,与每个存储桶的基准线进行比较;每个设计决策都有数字支持,每个证明只有通过反游戏正确性门才能被接受。该层是一个独立的 OCaml 项目,链接到安装的 Rocq 9.1.1 库 — **无需修改 Rocq 源代码** — 并且是一个可以是弱模型,也可以是强模型,通过预注册的最佳-最差情况跨进行选择。
这里开始**:[``](STATUS.md) 分钟状态)·docs/REPORT.md/REPORT.md)()·
[`ESIGN.md`](docs/DESIGN.md)(每个决策的理由)。
## 主要结果
所有三个目标,按难度分类(简单/中等),dev60。
solve** = 平均每次成本 ÷ 通过率每解决一个证明的失败);**wall 平均每次尝试的秒SOTA =
[rocq-mcp](https://github.com/LLM4q/rocq-mcp相同的测试框架、门控和策略(仅在设计首次接触;" = 通过即时握重新运行,在审计发现竞赛服务器启动后完整故事在 REPORT| 接口 | 策 通过率 | $ / solve | wall 秒 |
| --- | --- | --- | --- |
| 整个文件(控制)| haiku | .4425 / .30 | .18 / .44 / | 90 / 122 / 157 |
| rocq-mcp(SOTA,公平)| haiku68 / .35 / .33 | .08 / .22 / .31 | 65 / 76 / |
| **`universal`**)| haiku | **.66 / .58 / .40** | .10 / .16 / .23 | 59 / 7174 |
| 朴素整个文件 | sonnet | .93 / .9580 | .0915 / .18 | 61 / 77 / 112 |
| rocq-mcp(SOTA,公平)| sonnet | .95 / .93 / . .11 / .1926 | 50 / 64 / 105 |
| **`universal`** | sonnet | **.95 / 1.00 / .85**.07 / / .13** | **36 / 42 / 85** |
| 朴素整个文件 | fable | .95 / 1 / .95 | .09 / .19 / . 51 / 73 (1 次复制) |
| **`universal`** | fable | **.95 / 1.00 / 1.00** | .14 / .1629 | 4941 / 57 (1 次复制) |
| `frozen` — ** miniF2F 测试 | haiku | .52 / .13 / .04 | — | 单次登录运行 |
读取:`universal` 在 **所有三个策略层** 的每个存储桶中都是最佳或并列最佳;在 sonnet 上,它同时是最准确 **和** 每解决一个证明的最便宜的;公平的 SOTA 比较:在 sonnet 上接近准确性平等,rocq-mcp 在 haiku 上边缘容易;rocq-tools 领先中等/困难,并且在 sonnet 上一个证明的成本约为一半。
**阶梯(弱策略):线 `.44/.25/.30` → 获胜者 `.70/.525/.(4 次复制)通过 6 次保留4 次回滚的测量变化,**-45 % 成本,-55 % wall**;
每次交互的证明者延迟 **266 ms → ~1 ms**(持久的进程内会话 + O(1) 快照回滚 vs 完整重新编译)。可扩展性:在 N=8 个代理时,约 80% 的并行效率,≈6× 解决的证明/小时 vs 控制。
> **设计法则,从 10 次消融:** *在零边际回合成本下,最大化证明者基础信息每模型回合。* 所有将信息推送到现有回合(尝试,提示,自动关闭,是否意味着,预加载)的内容都赢了;所有花费一个回合或丢失上下文以获取它的内容(拉取搜索工具,紧凑渲染,3 代理中继)都丢失了。
诚实笔记:haiku universal hard 为 .400±.14(4 次复制),比 haiku 专用配置低 0.075;
sonnet medium `1.00` 为 2/2 次复制;保留行是单个冻结配置运行
(无测试问题影响任何决策);强策略附件为 1-2 次复制。
## 工具 — 一个策略中立的 MCP 服务器(`rocq`)
代理通过 stdio 与 `rocq-mcp` 进行 MCP 通信。整个证明和增量样式都是 **一个** 服务器中的一流。所有工具和增强功能启用(使用 `ROCQ_ENABLE_TOOLS` 修剪,禁用功能使用 `ROCQ_<FEATURE>=0`| 工具 | 它能做什么 |
| --- | --- |
| `build{file}` | 在中诊断整个文件顶级块都会失败的证明在被 `Admitted因此依赖项仍然会 您一次可以得到** 损坏的证明,然后通过 `open`每个证明。纯诊断。 |
|{file, theorem | 在运行时打开v 文件并启动重新启动)一个针对命名定理(其旧证明mitted` 被忽略,并且任何 **较早** 的损坏证明自动被 `Admitted`,以便每个定理都是可达的 — 任意顺序修复孔)。项目加载路径从文件位置自动发现。 |
| `check{script}` | 在一次调用中提交一个 **完整** 的证明(`Proof. … Qed.`)。成功时,完成;失败时,有效前缀保持提交,您位于带有实时目标的失败句子处 — 修复或重新提交。 |
| `step{text}` | 逐步执行一个或多个句子;每次成功都永久提交,第一个失败报告一个结构化错误,并将状态留在最后一个成功处。查询(`Search`/`Check`)也在这里运行。 |
| `try{candidates}` | 从当前状态 **推测性** 测试最多 8 个候选脚本;第一个完全成功的是提交的(k 个想法,一个回合)。 |
| `auto_close{}` | 在当前目标上运行标准终结者投资组合(lia/lra/nra/nia/ring/…);如果一个成功,则提交一个终结者。便宜 — 可以随意调用。 |
| `rollback{count}` | 撤销上一次提交的句子(O(1) 状态交换),并显示您返回的目标。 |
| `state{}` | 重新渲染所有打开的目标和到目前为止的已提交证明。 |
跨切割增强(零额外回合,全部默认开启;使用 `=0` 禁用):
- **错误提示** (`ROCQ_HINTS`) — 将 Lean 和常见错误重 Rocq 形式联到错误有效载荷中。
-意味着** (`ROCQ_SUGGEST`) —引用错误中追加的现有引理名称。
- **提示合成ROCQ_AUTO2`) — `auto_close` 机械地断言辅助例如,从目标子获取 `0 <= (t)²`重试非线性终结者。
- **示例 (`ROCQ_EXEMPLARS=1`,选择) — 将您的项目中最相似的已(及其证明到第一个响应中的策略下测量立(弱策略可能会被它分散注意力),关闭;检索质量本身经过验证且无。
- **挂起安全性** — 每个句子都在检查点超时下运行,加上分配触发的中断(memprof-limits,coq-lsp 机制),因此即使 `vm_compute`/`native_compute` 分歧也会返回一个结构化的 **TIMEOUT** 而不是冻结会话(`ROCQ_FORK_PROBE=1` 添加了一个零状态的 fork-isolated带)。
- **策略预加载** (`ROCLOAD`) — 加载 Lia/Lra/Psatz 以便声明后标准终结者始终存在。在 **mathcomp** 文件中,它还会预加载 `zify`/`algebra-tactics`,给予 `by lia`/`by ring`/`by lra` 在布尔反射和 ssralg 目标上的实际功能
(`ROCQ_MC_TACTICS=0` 禁用)。桥梁需要可选的 opam 包 `coq-mathcomp-zify` 和 `coq-mathcomp-algebra-tactics` — 仍然是 `coq-` 命名上游;这些两个卫星尚未遵循 mathcomp 核心重命名为 `rocq-mathcomp-*`。(`ROCQ_ENV_V2=1` 另外 **拒绝** 证明中的 `Require` — 一个基准测试反游戏策略,正常使用时关闭。)
## 安装和试用(2)
```sh
opam pin add rocq-tools https://github.com/LLM4Rocq/rocq-tools.git
```
将 `rocq-mcp` 二进制文件安装到您的 opam 切换中(自动拉取 `rocq-runtime` 9.1+)。然后在任何 MCP 客户端配置(Claude Code、`claude` CLI 或任何 MCP 语言客户端)中添加一个块:
```json
{ "mcpServers": { "rocq": { "command": "rocq" } } }
```
就是这样 — 完全没有配置。然后只需要求您的代理完成一个证明:它调用 `open{file}`(可选地 `theorem:<name>` 目标一个 `Admitted` 或文件中的任何特定语句),使用其他工具进行证明,并在完成后接收完成的脚本以插入您的文件中。一个会话可以打开同一个项目中的多个证明前缀是重放记忆的**,因此即使是 mathcomp-heavy 导入也只需支付一次每个会话,而不是每个打开(重新打开:~0.4 秒)。其他一切都是自动的:
项目加载路径自动 — 服务器从任务文件向上遍历到您的qProject`/`_RocqProject`(解析为 `-Q/-R/-I`)或 `dune-project`(`coq.theory` 条目,映射到 `_build/default` 镜像)。首先构建您的项目;无需其他设置。如果需要,可以使用 `ROCQ_INIT_ARGS`(换行 rocq 参数)- **标准** (Lia/Psatz)预禁用:`ROCQ_PRELOAD=0- **所有工具默认开启**:`open`、`build`(整个文件诊断)、`check`(整个证明)、`、`try`_close`(投资组合 + 提示合成)、、`state` — 带有错误提示和近似建议。使用 `ROCQ_ENABLE_TOOLS=step,state,...` 修剪,禁用功能使用 `ROCQ_HINTS=0`/`ROCQ_SUGGEST=0`/`ROCQ_AUTO0`,选择加入项目示例检索使用 `ROCQ_EXEMPLARS=1`。
- 完成后,响应会携带 **完成的证明脚本** (从实际执行的内容组装 — 代理将其插入您的文件中);还会将一个独立的 `candidate.v` 编写到 `ROCQ_WORKDIR`/temp。
- `ROCQ_TASK_FILE` (可选)预设启动时一个文件 — 由基准测试框架使用;交互永远不需要无需任何 MCP 客户端的快速测试:
```sh
printf '%s\n%s\n%s\n' \
'{"json2.0","id":1,"method":"initialize","params":{}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"open","arguments":{"file":"/path/to/your/File.v","theorem":"my_admitted_lemma"}}}' \
'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"auto_close","arguments":{}}}' \
| rocq-mcp
```
对于一个证明的多代理工作,`rocq-daemon` + `rocq-mcp` 安装在参见 docs/DESIGN.md,证明内的并行性)。
*开发/重现实验?* `repro/setup.sh` 从头构建固定的环境,`dune build` 在树中工作;Python `harness/` 仅用于运行基准测试实验,从不用于使用工具。
## 测试
`dune runtest` — 集成级别,无模拟;每个测试用例都会启动一个真正的二进制文件,并断言其行为(每个测试用例都会引用它所回归的事件;预算 ≤ ~4 分钟)。**109 个断言**,涵盖四个测试套件(A:57 · B:35 · C:10 · D:7)。
- **`test_session (A,57)— 会话服务器核心合约:提交-good-prefix、auto-Qed 握手、try/auto_close 语义、回滚、env-v2 拒绝、错误提示 + 是否意味着、整个证明 `check`、项目加载路径文件 `build诊断(admit)、运行时 `open`(包括 Ading 和 A36 reach-any-theorem)、前缀重放记忆化与安全重新打开,以及示例包括防泄 加上失败图谱回归(auto-Qed、dead-tool purge、Search 翻转)。
- **`test_daemon.ml`** (B,35)— 共享证明多代理守护进程:两代理分支/合并、非聚焦代理主干安全性和 **merge-renumbering** 回归(一个审查修复程序,会破坏 >2 目标合并)。
- **`test_perf.ml`** (C,10)— 可扩展性/延迟界限(慷慨,CI 稳定):初始化 < 15 秒,步骤 p50 <,8 个并发客户端下无死锁,O(1)-ish 50 句子回滚test_gate.py`** (D,7)— 正确性门控健全性:合法接受、禁止令牌、前缀篡改、新编译和 **注释/字符串解同步** 漏洞 `(* "(*" *) Admitted.` (测量审查关键发现)。
## 仓库地图
```
src/mcp_core/ MCP stdio 服务器框架 + 子进程实用程序
src/baseline_server/ 朴素控制:一个工具 = 完整的 rocq 编译
src/session_server/ 迭代接口(本自述服务器)
src/psession/ 共享证明守护进程(k 代理,一个实时证明)+ MCP 垫片
harness/ 评估运行器、正确性门控、团队协调器、报告、
分析器、监视器、仪表板、扫描、项目参数
configs/ 每个实验条件的 JSON 文件(+ FROZEN.md)
data/manifests/ 分层问题清单(dev60/dev150/hard70/…)
docs/ 报告、设计原理、假设、故障图谱、repro/ 软件包列表键环境重test/ 由驱动的集成件(A-D 上述)
```
文档:[`docs/REPORT.md`](docs/REPORT.md) ·
[`STATUS.md`](STATUS.md) · [`docs/DESIGN.md`](docs/DESIGN.md) ·
[`docs/FAILURE_ATLAS.md`](docs/FAILURE_ATLAS.md) ·
[`docs/ASSUMPTdocs/PTIONS.md) (自主决策日志 A1-A37) ·
[`docs/TASK.md`](docs/TASK.md) (原始简报)。
实验
```sh
./repro/setup.sh /path/for/new/switch # 切换 → 固定依赖 → 构建 → 自我测试
python3.py --configmanifest smoke5 --reps 13 harness/report.py <run_id> [--compare baseline_dev60] # 每个数字都
python3.py --watch 直播视图:logs/dashboard.html
```
期望为此仓库的兄弟目录(`rocq-workbook/`、`miniF2Fq/`);策略端点是一个经过身份 `claude` CLI。保留的分割线受到保护 — 代码拒绝读取 `miniF2F-rocq/test` 除非设置了 `FINAL_UNLOCK` + `ROCQ_FINAL_EVAL=1`;单个解锁(2026-07-03 13:57:42)记录在 `configs/FROZEN.md` 中;重现保留的运行需要故意重新FINAL_UN 哨方法在一:一个朴素控制;配置文件;更改;仅保留存储桶的数字(从);门控;冻结;然后在一个已登录的运行中进行。
## 如何```bibtex
@software{rocqtools2026,
author =M4Rocq}},
title = {rocq-tools:Rocq 的 {AI} 集成 {MCP}