Isabelle / HOL中的通用量化

时间:2015-12-28 01:05:54

标签: proof isabelle

我注意到,在与Isabelle / HOL Isar合作时,有几种方法可以处理普遍量化。我正在尝试以适合本科生理解和复制的风格写出一些证据(这就是我使用Isar的原因!)而且我对如何以一种很好的方式表达普遍量化感到困惑

在Coq例如,我可以写forall x, P(x),然后我可以说"感应x"这将根据相应的归纳原则自动生成目标。然而,在Isabelle / HOL Isar中,如果我想直接应用归纳原理,我必须在没有任何量化的情况下陈述该定理,如下所示:

lemma foo: P(x)
proof (induct x)

这样可以正常工作,因为x被视为一个原理图变量,就像它被普遍量化一样。但是,它在声明中缺乏普遍的量化,而这种量化并不是很有教育意义。我资助的另一种方式是使用\<And>\<forall>。但是,如果我以这种方式陈述引理,我不能直接应用归纳原理,我必须首先修复普遍量化的变量......从教育的角度来看,这似乎不方便:

lemma foo: \<And>x. P(x)
proof -
fix x
show "P(x)"
proof (induct x)

用于表达通用量化的一个很好的证明模式,不要求我在归纳之前明确地修复变量?

1 个答案:

答案 0 :(得分:5)

您可以使用induct_taccase_tac等。这些是适当的Isar中使用的induct / inductioncases方法的传统变体。它们可以在目标状态下对绑定的元通用量化变量进行操作,如第二个示例中的x

lemma foo: "⋀x. P(x :: nat)"
proof (induct_tac x)

induct_tac超过induction的一个缺点是它不提供案例,所以你不能只在你的case (Suc x)中写from Suc.IHshow ?case证明。另一个缺点是,解决绑定变量通常是相当脆弱的,因为它们的名称通常由Isabelle自动生成,并且可能在Isabelle改变时改变。 (当然,不是上面显示的情况)

这就是为什么Isar样张最近成为首选的原因之一。我强烈建议不要向学生表达“坏”的伊莎贝尔,以便他们更容易理解。

事实就是这些:Isabelle定理陈述中的自由变量在逻辑上等同于普遍量化的变量,Isabelle在您证明了它之后自动将它们转换为逻辑示意图变量。这个惯例并不是伊莎贝尔所独有的;它在数学和逻辑中很常见,它有助于减少混乱。 Isar特别试图避免在目标语句中明确使用运算符(即have / show;它们仍然出现在assume)。

或者,简而言之:默认情况下,定理中的自由变量是普遍量化的。我怀疑学生会发现这很难理解;当我开始与Isabelle作为BSc学生时,我当然没有。事实上,我发现将一个定理陈述为xs @ (ys @ zs) = (xs @ ys) @ zs而不是∀xs ys zs. xs @ (ys @ zs) = (xs @ ys) @ zs更为自然。