提高 coq 策略的失败级别
Raising the failure level of a coq tactic
在 Ltac 中实施复杂策略时,有一些我预计会失败的 Ltac 命令或策略调用以及预计会失败的地方(例如终止 repeat
,或导致回溯)。这些故障通常在故障级别 0 时引发。
在更高级别引发的故障“逃脱”了周围的 try
或 repeat
块,对于表示意外故障很有用。
我缺少的是 运行 一种策略 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).
在 Ltac 中实施复杂策略时,有一些我预计会失败的 Ltac 命令或策略调用以及预计会失败的地方(例如终止 repeat
,或导致回溯)。这些故障通常在故障级别 0 时引发。
在更高级别引发的故障“逃脱”了周围的 try
或 repeat
块,对于表示意外故障很有用。
我缺少的是 运行 一种策略 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).