假设我有一个目标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
参数,以确定应该匹配的假设数量。
答案 0 :(得分:2)
方法rule
对于链接哪些事实非常挑剔。如果链接的事实不合适,它的前体intro
和elim
不会抱怨; 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)