Coq:变量参数列表的Ltac定义?

时间:2014-03-29 05:18:23

标签: coq ltac

在尝试创建循环遍历可变长度参数列表的Ltac定义时,我在Coq 8.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." *)

1 个答案:

答案 0 :(得分:5)

让我们扩展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.