提高 coq 策略的失败级别

Raising the failure level of a coq tactic

在 Ltac 中实施复​​杂策略时,有一些我预计会失败的 Ltac 命令或策略调用以及预计会失败的地方(例如终止 repeat,或导致回溯)。这些故障通常在故障级别 0 时引发。

在更高级别引发的故障“逃脱”了周围的 tryrepeat 块,对于表示意外故障很有用。

我缺少的是 运行 一种策略 tac 并将其失败(即使在级别 0)处理为更高级别的方法,同时保留失败的消息。这将让我确保 repeat 不会由于我这边的 Ltac 编程错误而终止。

我可以在 Ltac 中实现这种提高失败级别的高阶策略吗?

我不知道是否可以得到你想要的,但我有时会使用以下成语:

tactic_expression_that_may_fail_with_level_0
|| fail 1000 "There was some problem here"

如果第一个策略以 0 级失败,|| 将尝试 运行 第二个策略,它将以非常高的级别失败并报告给您。

如果您能提供一个具体的用例,看看是否有其他技术更适合,这将有所帮助。

您可以在 Ocaml 中编写一个策略来实现它。我把它放在 GitHub here.

例如,以下应该引发错误而不是默默地成功:

repeat (match goal with 
          | [ |- _ ] => 
            raise_error_level (assert (3 = 3) by idtac)
        end).