我想采取类似的策略
let x := fresh in
epose (x := _);
forward_call x.
forward_call
是处理VST中函数调用的策略。
我发现是否做epose _; forward_call x
(如果x是epose的名字),它也会进入有限循环。但是如果我做epose _. forward_call x.
,它就可以工作。如果我使用eset
而不是epose
,也会发生同样的情况。我不明白为什么当第一个战术只产生一个目标时,为什么使用分号来连接两个战术与使用两个用点分隔的命令不同。你知道这两者之间有什么区别吗?
我发现的一件事是epose (_); show_hyps.
给出了y := ?y : ?T
,而epose (_). show_hyps.
给出了y := ?Goal0 : ?Goal
。也许这表明有所不同。
我没有找到解决此问题的简单示例。我尝试了以下简单情况,使用点号和分号没有区别。
Require Import Coq.omega.Omega.
Require Import Coq.Program.Tactics.
Open Scope Z_scope.
Goal exists x, x = 2.
epose (y := _). refine (ex_intro _ y _); subst y.
reflexivity.