将任意方法应用于所有子目标的一般方法?

General way to apply an arbitrary method to all subgoals?

假设我在应用样式证明中有一个子目标列表。我知道

    apply blast

将为该列表中的许多子目标提供证明。有什么办法可以避免重复这一行?

例如,假设我有三个子目标,其中第一个和第三个可以使用上述方法证明,而第二个可以使用类似

的方法证明
    apply (metis lemma1 lemma2 ...)

此类子目标的简单证明如下所示

    apply blast
    apply (metis lemma1 lemma2 ...)
    apply blast

我正在寻找的是一种无需复制证明的 apply blast 部分即可给出证明的方法。请注意,使用方法组合器 + 不会实现此目的;它只是重复应用该方法,直到第一次失败。

实际上apply blast只会尝试解决第一个子目标。如果你想解决尽可能多的子目标,你可以尝试

apply blast+

我不确定你到底想达到什么目的,但 using some_lemma 的替代方案可能是

apply (insert some_lemma)

其中插入 some_lemma 作为所有子目标的附加假设。

更新: Isabelle 中提供了一些基本的证明方法组合器(另请参阅 isar-ref 的第 6.4.1 节:证明方法表达式)。所以你可以做例如

apply (blast | metis ...)+

将首先尝试通过 blast 解决子目标,并且只有在 metis ... 失败的情况下。然而,它的用处取决于具体的子目标情况,例如,如果 blast 需要很长时间才能失败,它可能不适合。通过最近的 Isabelle/Eisbach 证明方法语言(参见 isabelle doc eisbach)可以更细粒度地控制证明方法。