Isabelle auto prover研究引理,研究引理的特例

Isabelle auto prover研究引理,研究引理的特例,isabelle,theorem-proving,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"

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

  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

首先:使用HOL通用量词
。不管怎样,目标中的自由变量都是隐式通用量化的,因此您可以省略
。但是,您将告诉
归纳
命令在归纳步骤中使用
任意
对这些变量进行通用量化:

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的简化器,将此作为重写规则。但是,您会注意到,此规则的左侧与此循环的右侧匹配,这将导致无限重写序列

ListSumTAux xs a → a + ListSumTAux xs 0 → a + (0 + ListSumTAux xs 0) → 
    a + (0 + (0 + ListSumTAux xs 0))
发生这些情况时,您可以做以下几件事:

  • 你可以做一个结构化的Isar证明,并手工操作
  • 您可以尝试翻转有问题的等式,即将目标写为
    a+ListSumTAux xs 0=ListSumTAux xs a
    。那么左手边和右手边就不匹配了
  • 你可以引入一个额外的前提,比如
    a≠ 0
    到防止简化器循环的等式
  • 在任何情况下,你都无法用这种方式证明你的目标,因为它太具体了:如果你将你的目标表述为
    ListSumTAux xs a=a+ListSumTAux xs 0
    ,那么你在归纳假设中也会有一个
    0
    ,但当然,你的累加器并不总是
    0

    归纳证明中的一个常见问题是,尤其是当涉及累加器时,你需要在证明工作之前对你的陈述进行概括,以加强归纳假设——就像你在引理的第一个陈述中所做的那样,
    ListSumTAux\u 1