Isabelle 构造有用引理

Isabelle 构造有用引理,isabelle,Isabelle,在Isabelle/HOL中的编程和证明教程中,有一个关于将列表反转两次的证明的分步说明,将生成原始列表(2.2.4证明过程) 自动执行步骤后,将保留一个子目标: 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(a

在Isabelle/HOL中的编程和证明教程中,有一个关于将列表反转两次的证明的分步说明,将生成原始列表(2.2.4证明过程)

自动执行步骤后,将保留一个子目标:

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_应用程序?我根本不知道这个引理是如何暗示自己的。

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

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

例如,主引理描述了
rev
/
rev
属性。然而,子目标需要一些关于
rev
/
app
的信息。这就是为什么你需要一个关于这两个的引理

不幸的是,剩下的部分只能被描述为“人类的创造力”:看到
rev(app xs ys)=app(rev ys)(rev xs)
rev
/
app
的合理属性


例如,在自动检测这些属性方面有各种各样的研究。

套用托比亚斯·尼普科夫的话,使用证明助手并不能消除数学推理中的直觉。直觉是很重要的,虽然在没有直觉的情况下使用证据助手是可能的,但我怀疑人们会走得很远。形式推理(有或没有计算机)的作用不是从数学中消除直觉,而是消除必须相信自己直觉的需要。你用直觉提出你的证明,然后把它形式化,然后你可以合理地确定它是真的。等式推理的另一个小提示:当你有一个涉及两个这样的函数的目标时,你通常需要与它们相关的辅助事实,在等式的情况下,你可能需要一些关于他们如何通勤的引理。对于某些固定函数
f
g
,使用类似
f(gx)
f(gx)(gy)
的子项是相当常见的情况。您通常希望简化程序执行的操作是推入
f
,或者以某种方式“取消”f和
g
lemma rev_app [simp]: "rev(app xs ys) = app (rev ys) (rev xs)"