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

在试图用归纳法证明连续传递型函数的引理时,我遇到了一个关于自由型变量的问题。在我的归纳假设中,延拓是一个图解变量,但它的类型涉及一个自由型变量。因此,当我尝试应用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'))"

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
,你就可以得到你原来的定理