一句话:扩展 Rocq 证明修复以支持商类型等价(setoid 实现),并在 Cubical Agda 首次给出内部正确性证明。
证明助手(如 Rocq)中的证明很脆弱,易因变更而失效。已有工作提出算法与工具,可针对类型等价引起的变更自动修复证明,但许多变更(尤其底层行为变更)仍不在范围内。本文聚焦商类型(quotient type)等价:商类型带有描述任意两元素何时相等的关系,可用于表达数学结构表示或数据结构实现的变化。由于 Rocq 缺少商类型,作者用 setoid 机制代替商。扩展包括:算法支持对应 setoid 的新变更;工具支持这类变更并自动消除部分新证明义务。作者在多个此前不支持的案例上验证扩展,并在 univalent 元理论的 Cubical Agda 中手工修复证明,首次构造证明修复正确性的内部证明。
Proofs in proof assistants like Rocq can be brittle, breaking easily in response to changes. To address this, recent work introduced an algorithm and tool in Rocq to automatically repair broken proofs in response to changes that correspond to type equivalences. However, many changes remained out of the scope of this algorithm and tool—especially changes in underlying behavior . We extend this proof repair algorithm so that it can express certain changes in behavior that were previously out of scope. We focus in particular on equivalences between quotient types —types equipped with a relation that describes what it means for any two elements of that type to be equal. Quotient type equivalences can be used to express interesting changes in representations of mathematical structures, as well as changes in the implementations of data structures. We extend this algorithm and tool to support quotient type equivalences in Rocq. Notably, since Rocq lacks quotient types entirely, our extensions use Rocq’s setoid machinery in place of quotients. Specifically, (1) our extension to the algorithm supports new changes corresponding to setoids, and (2) our extension to the tool supports this new class of changes and further automates away some of the new proof obligations. We demonstrate our extensions on proof repair case studies for previously unsupported changes. We also perform manual proof repair in Cubical Agda, a language with a univalent metatheory, which allows us to construct the first ever internal proofs of correctness for proof repair.
@article{paperbot2946,
title = {Proof Repair across Quotient Type Equivalences},
author = {Cosmo Viola and Max Fan and Talia Ringer},
journal = {Proceedings of the ACM on Programming Languages},
volume = {9},
number = {OOPSLA2},
year = {2025},
doi = {10.1145/3763164}
}