Skip to main content
Glama

rei-verify

反証機械 (refutation machine) — 专精于否定而非生成的验证基础设施 + MCP 服务器。

版本: 0.1.0a1 (2026-08-19) — 4 个原语 + 4 个反证工具 + 8 个 MCP 工具 + 集成演示。 测试 198/0 PASS。


为什么是「反证机械」

生成正在饱和。反证不会饱和。

当前 LLM 很流畅。它们能输出看似合理的证明思路、看似合理的代码、看似合理的定理名称,而与其是否为事实无关。即使基准测试饱和到 96%,这一结构也不会改变。这个世界所缺少的不是「制造看似合理之物的机器」,而是 「能可靠杀死看似合理之物的机器」。

反证机械的核心承诺:

  • 收到主张后,将计算资源分配给反例搜索。证明尝试放在后面。

  • 如果未找到反例,则明确返回 「未找到的搜索空间形态」(不将沉默伪装成成功)。

  • 输出中必定附带 「若该主张为假则会崩溃的位置」。Lean 4 的零 sorry 是这一原则最严格的特殊案例。

  • 「未能反证」 与 「正确」 在类型层面被当作不同事物处理。


Related MCP server: leanscreen

4 值判定(「绝对不说谎」核心纪律)

class Verdict(str, Enum):
    CONFIRMED = "confirmed"           # post-condition PASS + marker 空
    REFUTED = "refuted"               # 具体的な counter-witness が 得られた
    HOLDING = "holding"               # counter-witness 未発見 かつ marker 非空
    INCOMPLETE_FRAME = "incomplete_frame"  # 主張自体が well-formed でない

不采用二元 TRUE/FALSE = 未被反证 ≠ 正确。IUT 12 年持有纪律的类型化。

「不将沉默伪装成成功」的类型保证:除 CONFIRMED 外的所有判定必须 至少包含一个 IncompleteMarker(维度 + 已尝试内容 + 未尝试内容 + 原因)(数据类不变量,不可违反)。


4 个原语 (rei_verify)

原语

角色

Verdict

4 值枚举

IncompleteMarker

4 种维度词汇 (search_space / witness_type / compute_budget / frame) + 所有字段非空要求

AuditChain

sha256 哈希链式追加 JSONL + 篡改检测(verify() 返回 broken_at 索引)

VerifiedExecution

前置检查 + 动作 + 后置检查 + 审计 原子化捆绑 的上下文

4 个反证工具 (rei_verify.*)

反证机械的核心。所有工具返回 VerdictWithMarkers(4 值判定 + 标记 + 审计哈希)的一致形状。

工具

模块

含义

判定模式

refute_lean_source

.refute

执行 Lean 4 源码,验证 sorry / native_decide / 不允许的公理

CONFIRMED / REFUTED / HOLDING / INCOMPLETE_FRAME

search_counterexample

.search

在可迭代空间 + 可调用谓词中搜索反例

REFUTED / HOLDING / INCOMPLETE_FRAME(从不 CONFIRMED)

assert_breakpoints

.breakpoint

N 个带标签案例 × 各自逻辑的穷举检查

REFUTED / HOLDING / INCOMPLETE_FRAME(从不 CONFIRMED)

hold_verdict

.hold

声明式 HOLDING 生成(「保留的类型化」)

HOLDING / INCOMPLETE_FRAME(仅此)

★ 工具输出 CONFIRMED 的只有 refute_lean_source(仅限 Lean 4 内核认定为无 sorry 的案例)。其他 3 个工具始终返回 REFUTED 或 HOLDING = 「反例缺失不等于证明」 纪律的类型层面保证。

8 个 MCP 工具

可从 Claude Desktop / Cursor / Cline 等 LLM 客户端直接调用:

工具

用途

create_audit_chain

创建命名审计链

append_audit_entry

追加原始条目

verify_audit_chain

完整性遍历 + 篡改检测

record_verdict

简单追加 4 值判定 + 标记(强制不变量)

refute_lean

验证 Lean 4 源码

search_counterexample_explicit

反例搜索(x 绑定表达式 + 样本列表)

assert_breakpoints_explicit

穷举检查(ctx 绑定表达式 + 带标签字典)

hold_verdict_tool

声明式 HOLDING

MCP 安全表达式采用 受限求值 = 预先拒绝 __import__ / exec / eval / open / __ 前缀,仅允许 _SAFE_BUILTINS 白名单(abs/min/max/sum/len/int/float/str/bool/round/any/all/range)。


安装

pip install rei-verify           # core primitives (no external deps)
pip install rei-verify[mcp]      # + MCP server

或从源码安装:

git clone https://github.com/fc0web/rei-verify.git
cd rei-verify
pip install -e .[mcp]

需要 Python 3.10+(数据类 + 枚举 + 类型新特性)。核心原语仅依赖标准库(即使没有 mcp 包也能导入)。


用法 — 库

VerifiedExecution(自定义)

from pathlib import Path
from rei_verify import (
    Verdict, IncompleteMarker, PostCheckResult,
    VerifiedExecution, AuditChain,
)

audit = AuditChain(Path("./reasoning.jsonl"))
ve = VerifiedExecution(
    claim="1 + 1 == 2",
    pre_check=lambda: True,
    post_check=lambda r: PostCheckResult(refuted=(r != 2), markers=[]),
    audit=audit,
)
result = ve.run(lambda: 1 + 1)
# result.verdict == Verdict.CONFIRMED
# result.audit_hashes == [h1, h2, h3, h4, h5]  # 5 phase entry

refute_lean_source

from rei_verify.refute import refute_lean_source

result = refute_lean_source(
    claim="trivial True holds",
    lean_source="theorem trivial_true : True := trivial\n",
    audit=audit,
    theorem_name="trivial_true",
    timeout_sec=60,
)
# result.verdict == Verdict.CONFIRMED  (axiom-free, ~1200 ms)

默认允许的公理 = Mathlib 基础 [propext, Classical.choice, Quot.sound]。sorry / native_decide / 不允许的公理会被路由到 HOLDING。

from rei_verify.search import search_counterexample

result = search_counterexample(
    claim="no n in [1,100] equals 42",
    predicate=lambda x: x == 42,
    space=range(1, 101),
    audit=audit,
    space_description="range(1, 101)",
)
# result.verdict == Verdict.REFUTED  (witness marker: n=42)
  • 穷举 → HOLDING(search_space 标记,「缺失 ≠ 证明」)

  • 时间/样本预算 → HOLDING(compute_budget 标记)

assert_breakpoints

from rei_verify.breakpoint import Breakpoint, assert_breakpoints

result = assert_breakpoints(
    claim="Collatz t1=1 orbits descend",
    breakpoints=[
        Breakpoint("n=27", assertion=lambda: descent(27), context={"n": 27}),
        Breakpoint("n=703", assertion=lambda: descent(703), context={"n": 703}),
        Breakpoint("n=6171", assertion=lambda: descent(6171), context={"n": 6171}),
    ],
    audit=audit,
    stop_on_first_failure=True,  # False で 全 breakpoint 実行 (集計目的)
)
  • 任意断点为 False → REFUTED(标签 + 上下文作为见证)

  • 全部通过 → HOLDING(「列出的检查点已穷举 ≠ 覆盖所有案例」)

hold_verdict

from rei_verify.hold import hold_verdict

result = hold_verdict(
    claim="my analytical claim under investigation",
    markers=[
        IncompleteMarker(
            dimension="search_space",
            what_was_tried="5 counterexample approaches",
            what_was_not_tried="structural refutation via categorical semantics",
            reason="categorical angle deferred to next session",
        ),
    ],
    audit=audit,
    notes="manual reasoning pause",
    require_multi_dimension=True,  # 単一 dim なら augmentation marker 追加
)
# result.verdict == Verdict.HOLDING  (audit chain 4 phase entries + caller markers)

用法 — MCP(Claude Desktop)

claude_desktop_config.json:

{
  "mcpServers": {
    "rei-verify": {
      "command": "python",
      "args": ["-m", "rei_verify"]
    }
  }
}

或(已安装脚本):

{
  "mcpServers": {
    "rei-verify": {
      "command": "rei-verify"
    }
  }
}

MCP 表达式示例(搜索用 x 绑定,断点用 ctx 绑定):

{
  "tool": "search_counterexample_explicit",
  "arguments": {
    "chain_id": "chain-abc123",
    "claim": "no perfect square in [1,100] equals 42",
    "samples": [1, 4, 9, 16, 25, 36, 49, 64, 81, 100],
    "predicate_expr": "x == 42",
    "space_description": "perfect squares up to 100"
  }
}
{
  "tool": "assert_breakpoints_explicit",
  "arguments": {
    "chain_id": "chain-abc123",
    "claim": "Collatz t1=1 descent",
    "breakpoints": [
      {"label": "n=27 case", "assertion_expr": "ctx['descent'] < 0",
       "context": {"n": 27, "descent": -0.5}},
      {"label": "n=703 case", "assertion_expr": "ctx['descent'] < 0",
       "context": {"n": 703, "descent": 0.2}}
    ]
  }
}

集成演示

examples/collatz_t1_ones_lyapunov_demo.py — 使用 assert_breakpoints 对 trailing_ones(n)=1 的 Collatz 奇数 n 执行 Lyapunov α-descent 扫描。

python examples/collatz_t1_ones_lyapunov_demo.py

示例输出(1,048,575 个样本 / 76.7 毫秒):

α=0.5〜0.85: WITNESS  n=9         r(n)=0.885622  → α refuted ✓
α=0.9:       WITNESS  n=17        r(n)=0.905315  → α refuted ✓
α=0.93:      WITNESS  n=57        r(n)=0.930288  → α refuted ✓
α=0.95:      WITNESS  n=313       r(n)=0.950121  → α refuted ✓
α=0.97:      WITNESS  n=14,601    r(n)=0.970001  → α refuted ✓
α=0.99:      NO WITNESS in range  max r=0.981135 < 0.99  → α NOT refuted in sample

VERDICT: REFUTED  (α=0.99 が サンプル範囲 で 未 refute = finite absence report)
audit chain: 6 entries、 sha256 hash chain intact

见证 n 随 α 收紧而增大(n=9 → n=14,601)= 直接观察到 r(n) → 1 当 n → ∞ 的有限反映,工具遵守了 「不将有限缺失自动升级为 CONFIRMED」 纪律的实例。详细的诚实范围请参见演示内注释。


测试覆盖率

累计 198/0 PASS(6 个测试文件):

文件

断言数

内容

test_skeleton.py

37

Verdict + IncompleteMarker + PostCheckResult + VerdictWithMarkers + AuditChain + VerifiedExecution 不变量 + 4 值判定路径

test_mcp_layer.py

30

工具直接调用 + 验证 + 篡改检测 + 冒烟注册

test_refute.py

22

parse_lean_axioms + classify_axioms + 前置检查 + 实时冒烟(Lean 4.33)

test_search.py

37

4 个退出路径 + 每个样本错误 + 受限求值安全性(8 个恶意表达式被拒绝)+ MCP 工具

test_breakpoint.py

33

前置检查 + 判定路径 + stop_on_first_failure + 时间预算 + var_name 扩展

test_hold.py

39

前置检查 + 有效 HOLDING + require_multi_dimension + 不变量 + MCP + 4 工具形状一致性

# individual
python test/test_skeleton.py
python test/test_refute.py       # requires 'lean' on PATH for live smoke

# all
for f in test/test_*.py; do PYTHONIOENCODING=utf-8 python -u "$f" | tail -3; done

给维护者:PyPI 受信发布者设置

本仓库的 .github/workflows/publish.yml 支持 v 标签推送时发布到 PyPI 正式版* + workflow_dispatch 时发布到 TestPyPI 试运行。使用前需要在 PyPI / TestPyPI 两侧注册受信发布者并创建 GitHub 环境。

详细步骤请参见 TRUSTED_PUBLISHER_SETUP.md。

⚠️ 标签推送前请双重检查 workflow.yml + 受信发布者注册(防止「标签 = 发布触发器」事故)。


设计

完整原理请参见 DESIGN.md(8 节):

  • 设计起点(Rei 栈 4 原则)

  • 4 个原语详细说明

  • 判定规则表(单一真相来源)

  • 反证机械 3+1 工具映射

  • 与框架漂移检测器的关系

  • 非目标(骨架范围外)

  • 依赖(零外部依赖的意图)

  • 诚实范围


相关项目


作者

藤本 伸树 (Nobuki Fujimoto)

许可证

MIT(v0.x 不可撤销)。v1.0+ 可能采用 AGPL-3.0 + 商业双许可证。请参见 LICENSE。


诚实范围(不可妥协的底线)

  • (i) 骨架的反证工具仅与 Lean 4 直接协作(单文件 lean 执行),依赖 Mathlib 的证明需另开迭代(通过 lake 项目)

  • (ii) IncompleteMarker.dimension 词汇初始仅 4 种,扩展需基于操作经验

  • (iii) 哈希链用于篡改检测,加密签名(如 Sigstore 等)是另一关注点

  • (iv) 受限求值弱于 AST 级别分析(如 asteval 等),高可靠性需求需另开迭代添加依赖

  • (v) 「反证机械」的原创性主张为零([[feedback-world-uniqueness-claim-controllable]])= 仅是基于属性的测试(Hypothesis)+ Lean 4 sorry 检查 + Coq / Isabelle 系行业标准的集成纪律层,新颖性仅在于「4 值判定 + 标记不变量 + 哈希链的类型级集成 + MCP 包装器」的组合纪律

  • (vi) 集成演示(Collatz t1=1)并非 藤本先生实际 Lyapunov 分析的 再现 — 仅为简化版 V = log2(n) 和有限样本下的 工具行为演示,真正复现需通过藤本先生实际 V + 条件 + Lean 4 形式化另开迭代

  • (vii) refute_lean 的「无 sorry」判定依赖 #print axioms = 若 Lean 本身存在内核错误则无法验证(内核错误超出 Rei 范围)

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that gives LLMs access to formal verification via Z3 and SWI-Prolog, plus tree-sitter-based source code analysis. Translates natural language problems into formal logic using a template-based pipeline, verifies results with mathematical certainty, and analyzes call graphs for reachability, dead code, and impact analysis.
    89 npm
    218
    Apache 2.0
  • F
    license
    A
    quality
    B
    maintenance
    A calibrated faithfulness screen for informal↔Lean 4 statement pairs, served over MCP. It provides deterministic checks and deep LLM-based analysis to help draft Lean statements.
    2
    7
    -
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that provides tools for certificate verification, equivalence proving, and pre-registration sealing, enabling AI agents to re-derive verdicts from artifacts rather than trust assertions.
    9
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    MCP server that provides six verification tools (Lean proof checking, axiom audit, bound, gridlock check, certificate verification, residency check) with honest status reporting (ok/failed/unavailable) to prevent agents from claiming unchecked proofs passed.
    10
    Apache 2.0