在试图创建一个在变量长度参数列表上循环的Ltac定义时,我在coq8.4pl2上遇到了以下意外行为。有人能给我解释一下吗?
Ltac ltac_loop X :=
match X with
| 0 => idtac "done"
| _ => (fun Y => idtac "hello"; ltac_loop Y)
end.
Goal True.
ltac_loop 0. (* prints "done" as expected *)
ltac_loop 1 0. (* prints "hello" then "done" as expected *)
ltac_loop 1 1 0. (* unexpectedly yields "Error: Illegal tactic application." *)发布于 2014-03-30 21:44:16
让我们展开最后一次对ltac_loop的调用,看看发生了什么:
ltac_loop 1 1 0
-> (fun Y => idtac "hello"; ltac_loop Y) 1 0
-> (idtac "hello"; ltac_loop 1) 0在这里您可以看到问题:您正在尝试将一些不是函数的东西应用于参数,这会导致您看到的错误。解决方案是以连续传递的方式重写策略:
Ltac ltac_loop_aux k X :=
match X with
| 0 => k
| _ => (fun Y => ltac_loop_aux ltac:(idtac "hello"; k) Y)
end.
Ltac ltac_loop X := ltac_loop_aux ltac:(idtac "done") X.https://stackoverflow.com/questions/22727363
复制相似问题