构建有用的引理

Posted

技术标签:

【中文标题】构建有用的引理【英文标题】:Constructing useful lemmas 【发布时间】:2018-10-10 14:09:22 【问题描述】:

在教程Isabelle/HOL 中的编程和证明中,有一步一步的解释了将列表反转两次产生原始列表的证明(2.2.4 证明过程)。

theorem rev_rev [simp]: "rev(rev xs) = xs"
apply(induction xs)
apply(auto)

按照自动步骤,子目标仍然存在:

1. V x1 xs.
     rev (rev xs) = xs =⇒
     rev (app (rev xs) (Cons x1 Nil)) = Cons x1 xs

然后作者说“为了进一步简化这个子目标,引理建议自己。”,并在下面介绍 rev_app 引理:

lemma rev_app [simp]: "rev(app xs ys) = app (rev ys) (rev xs)"

是否只是直觉和实践,就像在纸笔证明中一样,可以让人们看到子目标 1. 可以如何简化并提出像 rev_app 这样的引理?我根本无法识别这个引理是如何暗示自己的。

【问题讨论】:

【参考方案1】:

对于不熟悉形式证明开发的人来说,这确实很棘手。随着时间的推移,人们将学习许多启发式方法来提出潜在的引理。

在这种情况下(纯等式推理),启发式通常通过查看子目标的相关常数来工作。

例如,主要引理描述了rev/rev 属性。然而,子目标需要一些关于rev/app 的信息。这就是告诉您您需要关于这两者的引理。

不幸的是,剩下的只能被描述为“人类的聪明才智”:看到rev(app xs ys) = app (rev ys) (rev xs)rev/app 的合理属性。

关于自动检测这些属性有各种研究,例如IsaHipster。

【讨论】:

解释 Tobias Nipkow,使用证明助手不会消除数学推理中的直觉。直觉很重要,虽然没有它也可以使用证明助手,但我怀疑一个人会走得很远。形式推理(有或没有计算机)的作用不是消除数学中的直觉,而是消除必须信任一个人的直觉的需要。您使用直觉来提出您的证明,然后将其形式化,然后您可以合理地确定它确实是正确的。 等式推理的另一个小提示:当你的目标涉及两个这样的函数时,你通常需要将它们关联起来的辅助事实,在等式的情况下,你可能需要一些关于它们如何通勤的引理.对于某些固定功能fg,有一个像f (g x)f (g x) (g y) 这样的子术语是相当常见的情况。您希望简化器做的通常的事情是推入f,或者以某种方式“取消”fg

以上是关于构建有用的引理的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Isabelle/HOL 的引理之外获取见证实例

允许替换普遍量化变量的引理/规则 (Isabelle)

如何用仅包含所有标记的引理的字符串替换列? [关闭]

Polya定理与Burnside引理

Vue-Cli:为啥在构建后 index.html 没有用引号生成?

回调函数在构建和 DLL 时如何有用