伊莎贝尔自动证明器在引理上工作,依赖于引理的特殊情况

时间:2015-10-26 14:56:51

标签: isabelle theorem-proving

为什么第二个引理"自动"证明挂起?第二个引理是第一个引理的特例。

  primrec ListSumTAux :: "nat list ⇒ nat ⇒ nat" where
    "ListSumTAux []     n = n" |
    "ListSumTAux (x#xs) n = ListSumTAux xs (n+x)" 

  lemma ListSumTAux_1 : " ∀a b. ListSumTAux xs (a+b) = a + ListSumTAux xs b"
    apply (induct xs)
    apply (auto)       (* Works fine *)
  done  

  lemma ListSumTAux_2 : "∀ a. ListSumTAux xs a = a + ListSumTAux xs 0 "  
    apply (induct xs)
    apply (auto)       (* Hangs on this *)
  oops

1 个答案:

答案 0 :(得分:2)

首先:使用HOL通用量词陈述目标是不方便的。无论如何,目标中的自由变量都被隐含地普遍量化,因此您可以简单地省略。但是,您将告诉induction命令使用arbitrary在归纳步骤中对这些变量进行普遍量化:

lemma ListSumTAux_1 : "ListSumTAux xs (a+b) = a + ListSumTAux xs b"
  apply (induct xs arbitrary: a b)
  apply (auto)
done  

现在,回答你的问题:auto被卡住,因为你的归纳假设有这样的形式

⋀a. ListSumTAux xs a = a + ListSumTAux xs 0

auto使用了Isabelle的简化器,它将此作为重写规则。但是,您会注意到此规则的左侧与此循环的右侧相匹配,从而导致无限重写序列<​​/ p>

ListSumTAux xs a → a + ListSumTAux xs 0 → a + (0 + ListSumTAux xs 0) → 
    a + (0 + (0 + ListSumTAux xs 0))

发生这些情况时,您可以执行以下操作:

  1. 你可以做一个结构化的Isar证明并手工做事
  2. 您可以尝试翻转有问题的等式,即将目标写为a + ListSumTAux xs 0 = ListSumTAux xs a。然后左侧不再与右侧相匹配。
  3. 您可以在方程式中引入一个额外的前提,例如a ≠ 0,以防止简化器循环。
  4. 在任何情况下,您都无法以这种方式证明自己的目标,因为它过于具体:如果您将目标定为ListSumTAux xs a = a + ListSumTAux xs 0,那么您将在归纳中找到0假设也是如此,当然,你的累加器并不总是0

    这是归纳证明中的一个常见问题,特别是涉及累加器时,你需要概括你的陈述,以便在证明工作之前强化归纳假设 - 就像你在引理的第一个陈述中所做的那样,{{ 1}}。