假设我在申请样式证明中有一个子目标列表。我知道像
这样的东西 apply blast
将为此列表中的多个子目标提供证明。有没有办法可以避免重复这一行呢?
例如,假设我有三个子目标,其中第一个和第三个可以使用上述方法证明,而第二个可证明具有类似
apply (metis lemma1 lemma2 ...)
这种子目标的天真证明看起来像
apply blast
apply (metis lemma1 lemma2 ...)
apply blast
我正在寻找的是一种在不重复证明的apply blast
部分的情况下提供证据的方法。观察到使用组合器+
的方法不会实现这一点;它只是重复应用该方法直到第一次失败。
答案 0 :(得分:0)
实际上apply blast
只会尝试解决第一个子目标。如果你想尽可能多地解决子目标,你可以尝试
apply blast+
我不确定您到底想要实现的目标,但您using some_lemma
的替代方案可能
apply (insert some_lemma)
将some_lemma
作为所有子目标的附加假设。
更新: Isabelle中提供了一些基本的证明方法组合器(另请参见第6.4.1节:isar-ref的证明方法表达式)。所以你可以做例如
apply (blast | metis ...)+
首先尝试通过blast
来解决子目标,并且只有在metis ...
失败时才会解决。但是,它的用处取决于特定的子目标情况,例如,如果blast
在失败之前需要很长时间,则可能不合适。通过最近的Isabelle / Eisbach证明方法语言可以获得更细粒度的证明方法控制(参见isabelle doc eisbach
)。