Isabelle 使用所有传入事实的初始证明方法

Isabelle 使用所有传入事实的初始证明方法,isabelle,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 - app

假设我有一个目标
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
但在应用脚本的中间打开代码<代码>证明/代码>被认为是不好的实践。< /P>
是否有一种类似于
规则
的方法更聪明地将传入的事实与规则的假设相匹配?理想情况下,它读取一个
消耗
foo
上的2个
参数,以计算有多少个假设应该匹配。

方法
规则
对链接哪些事实非常挑剔。其前身
intro
elim
如果与事实不符,则不会抱怨<代码>简介
与它们完全不匹配
elim…
大致对应于
apply-apply(erule…+
),因此这可能与您要查找的大致相同。但我不知道有什么方法可以告诉elim匹配多个假设,而elim试图尽可能长时间地应用给定的规则,这可能不是您想要的

但是,由于您仍然为剩余目标打开了Isar证明,因此您可以重新排列证明并避免该问题

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

我想补充一点,
rule\u tac
的工作原理与
rule
非常相似,但不要求假设以正确的顺序链接(但据我所知,也不使用它们)。我很少使用它,但有时它会派上用场。