我一直致力于 Coq 中流程演算的形式化(此处为存储库),并且不断发现自己尝试应用一个因等效但语法不同的子术语而失败的函数。这种情况经常是由于de Bruijn 变量的操纵而发生的。当统一失败时,我通常会事先明确替换行为不当的子项,然后应用我需要的函数。一个简单的代码作为我的意思的例子:
Require Import Lia.
Goal
forall P: nat -> Prop,
(forall a b c, P (a + (b + c))) ->
forall a b c, P (b + c + a).
Proof.
intros.
(* Unification fails here. *)
Fail apply H.
(* Replace misbehaving subterms explictly. *)
replace (b + c + a) with (a + (b + c)).
- (* Now application succeeds. *)
apply H.
- (* Show now they were the same thing. *)
lia.
Qed.
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:是否有一种策略,或者是否可以用 ltac 编写一个策略,它类似于 apply,但将统一错误转化为额外的平等目标而不是失败?