Isabelle 归纳法证明中的自由型变量
在试图用归纳法证明连续传递型函数的引理时,我遇到了一个关于自由型变量的问题。在我的归纳假设中,延拓是一个图解变量,但它的类型涉及一个自由型变量。因此,当我尝试应用I.h.时,Isabelle无法将类型变量与具体类型统一起来。我已经编写了这个最小的示例:Isabelle 归纳法证明中的自由型变量,isabelle,Isabelle,在试图用归纳法证明连续传递型函数的引理时,我遇到了一个关于自由型变量的问题。在我的归纳假设中,延拓是一个图解变量,但它的类型涉及一个自由型变量。因此,当我尝试应用I.h.时,Isabelle无法将类型变量与具体类型统一起来。我已经编写了这个最小的示例: fun add_k :: "nat ⇒ nat ⇒ (nat ⇒ 'a) ⇒ 'a" where "add_k 0 m k = k m" | "add_k (Suc n) m k = add_k n m (λn'. k (Suc n'))" l
fun add_k :: "nat ⇒ nat ⇒ (nat ⇒ 'a) ⇒ 'a" where
"add_k 0 m k = k m" |
"add_k (Suc n) m k = add_k n m (λn'. k (Suc n'))"
lemma add_k_cps: "∀k. add_k n m k = k (add_k n m id)"
proof(rule, induction n)
case 0 show ?case by simp
next
case (Suc n)
have "add_k (Suc n) m k = add_k n m (λn'. k (Suc n'))" by simp
also have "… = k (Suc (add_k n m id))"
using Suc[where k="(λn'. k (Suc n'))"] by metis
also have "… = k (add_k n m (λn'. Suc n'))"
using Suc[where k="(λn'. Suc n')"] sorry (* Type unification failed *)
also have "… = k (add_k (Suc n) m id)" by simp
finally show ?case .
qed
在“抱歉步骤”中,原理图变量?k
的显式实例化失败
Type unification failed
Failed to meet type constraint:
Term: Suc :: nat ⇒ nat
Type: nat ⇒ 'a
因为'a
是免费的,不是示意图。没有实例化,简化器无论如何都会失败,我找不到其他可行的方法
因为我无法量化过多的类型,所以我看不到任何方法可以在校样中制作一个示意图。当一个术语变量在证明中变成局部图解时,为什么变量的类型不是这样呢?在引理被证明之后,它们在理论层面上就变成了图解。这似乎相当有限。是否可以在将来实施这一选项,或者是否存在一些固有的限制?或者,有没有一种方法可以避免这个问题,并在已证明的引理中保持连续性的多态性?这是归纳法在HOL中工作的固有限制。归纳法是HOL中的一条规则,因此归纳法假设中不可能概括任何类型 解决您的问题的一个专门方法是首先证明
lemma add_k_cps_nat: "add_k n m k = k (n + m)"
by (induction n arbitrary: m k) auto
然后证明添加\u k\u cps
一般的方法是:首先证明归纳法适用的固定类型的实例。在本例中,是通过
nat
进行的归纳。然后导出一个在类型本身中推广的证明。当从类型变量已固定的块导出定理时,自由类型变量成为定理中的图解。特别是,您不能量化块中的类型变量,然后在块中实例化类型变量,就像您在归纳中尝试做的那样。对类型的任意量化会导致HOL中的不一致性,因此改变这种情况的希望很小
幸运的是,有一种方法可以证明你的引理是CPS风格的,而不需要类型量化。问题是您的语句不够通用,因为它包含id
。如果你将其推广,那么证明是有效的:
lemma add_k_cps: "add_k n m (k ∘ f) = k (add_k n m f)"
proof(induction n arbitrary: f)
case 0 show ?case by simp
next
case (Suc n)
have "add_k (Suc n) m (k ∘ f) = add_k n m (k ∘ (λn'. f (Suc n')))" by(simp add: o_def)
also have "… = k (add_k n m (λn'. f (Suc n')))"
using Suc.IH[where f="(λn'. f (Suc n'))"] by metis
also have "… = k (add_k (Suc n) m f)" by simp
finally show ?case .
qed
如果你选择f=id
,你就可以得到你原来的定理