erule会产生错误的子目标吗?

时间:2018-11-01 17:08:28

标签: isabelle proof

我在Isabelle中定义了以下语法:

inductive S where
  S_empty: "S []" |
  S_append: "S xs ⟹ S ys ⟹ S (xs @ ys)" |
  S_paren: "S xs ⟹ S (Open # xs @ [Close])"

然后,我定义一个gramar T,它在概念上仅添加以下规则:

  T_left: "T xs ⟹ T (Open # xs)"

然后我尝试证明以下定理:

theorem T_S:
  "T xs ⟹ count xs Open = count xs Close ⟹ S xs"
  apply(erule T.induct)
  apply(simp add: S_empty)
  apply(simp add: S_append)
  apply(simp add: S_paren)
  oops

令我惊讶的是,最终目标似乎是错误的:

⋀xsa. count xs Open = count xs Close ⟹ T xsa ⟹ S xsa ⟹ S (Open # xsa)

因此S (Open # xsa)不能成立,因为假设S xsa的语法中没有这样的产生。

这种情况对我毫无意义? erule产生的目标是错误的吗?

1 个答案:

答案 0 :(得分:2)

T.induct这样的归纳规则通常应与induction证明方法一起使用,而不是eruleinduction方法可确保整个语句成为归纳语句的一部分,而对于erule,只有结论才是归纳论证的一部分;归纳法基本上忽略了其他假设。这可以在最后一个目标状态看到,其中归纳陈述涉及目标参数xsa,而关键假设count xs Open = count xs Close仍在讨论变量xs。因此,证明步骤应为apply(induction rule: T.induct)。然后就有机会证明这一说法。