一句话:提出折叠–展开引理,在 Coq 中机械生成并精确推理局部或全局递归函数,且已由插件支持。
在 Coq 中,rewrite 策略推理递归函数时常需折叠–展开步骤来精确控制调用与其分支的等价。本文提出折叠–展开引理:对每个结构情形,生成一个引理,将该情形下对函数的调用与该情形分支相等。这些引理是样板式的,可机械生成,证明通用;使用精确(如含多个调用的项),并能扩展到 continuation-passing style 和各种递归模式,支持等式与关系推理。作者依据课堂经验及学生后续使用说明其有效性;自 8.0 版起 functional-induction 插件为全局定义提供该引理,Equations 插件现在也为全局和局部声明提供支持。
Abstract Fold–unfold lemmas complement the rewrite tactic in the Coq Proof Assistant to reason about recursive functions, be they defined locally or globally. Each of the structural cases gives rise to a fold–unfold lemma that equates a call to this function in that case with the corresponding case branch. As such, they are “boilerplate” and can be generated mechanically, though stating them by hand is a learning experience for a beginner, to say nothing about explaining them. Their proof is generic. Their use is precise (e.g., in terms with multiple calls) and they scale seamlessly (e.g., to continuation-passing style and to various patterns of recursion), be the reasoning equational or relational. In the author’s experience, they prove effective in the classroom, considering the clarity of discourse in the subsequent term reports and oral exams, and beyond the classroom, considering their subsequent use when continuing to work with the Coq Proof Assistant. Fold–unfold lemmas also provide a measure of understanding as well as of control about what is cut short when one uses a shortcut, i.e., an automated simplification tactic. Since Version 8.0, the functional-induction plugin provides them for functions that are defined globally, i.e., recursive equations, and so does the Equations plugin now, both for global and for local declarations, a precious help for advanced users.