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

时间:2016-07-16 15:38:47

标签: isabelle

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

这样的东西
    apply blast

将为此列表中的多个子目标提供证明。有没有办法可以避免重复这一行呢?

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

    apply (metis lemma1 lemma2 ...)

这种子目标的天真证明看起来像

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

我正在寻找的是一种在不重复证明的apply blast部分的情况下提供证据的方法。观察到使用组合器+的方法不会实现这一点;它只是重复应用该方法直到第一次失败。

1 个答案:

答案 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)。