消耗所有传入事实的初步证明方法

时间:2014-07-09 09:19:31

标签: isabelle

假设我有一个目标A ⟹ B ⟹ C ⟹ G目标是笨重的(由一些证明义务产生),并且在我的开发中出现了几次(类似的形状)。

所以我创建了一个引理foo来简化形状A ⟹ C ⟹ (P ⟹ Q) ⟹ G的目标。

我希望能够写

case goal42
  thus ?case
  proof (rule foo)
    assume P
    show Q sorry
  qed

但这失败了,因为foo不使用B。有效的是

case goal42
  thus ?case
    apply -
    apply (erule (1) eqvt_lam_case)
    proof-
    assume P
    show Q sorry
  qed

但是这种在应用脚本中间打开proof的方式被认为是不好的做法。

是否有类似rule的方法在将传入的事实与规则的假设相匹配时更聪明一些?理想情况下,它会在consumes 2上读取foo参数,以确定应该匹配的假设数量。

1 个答案:

答案 0 :(得分:2)

方法rule对于链接哪些事实非常挑剔。如果链接的事实不合适,它的前体introelim不会抱怨; intro根本不符合他们。 elim ...大致对应apply - apply(erule ...)+,因此这可能与您要查找的内容大致相同。但我不知道如何告诉elim匹配多个假设,elim尝试尽可能长时间地应用给定的规则,这可能不是您想要的。

但是,既然您为剩下的目标打开了Isar证明,您可以重新安排证明并避免问题。

case goal42
{ assume P
  show Q sorry }
with goal42 show ?case by-(erule (2) eqvt_lam_case)