首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coq:可变参数列表上的Ltac定义?

Coq:可变参数列表上的Ltac定义?
EN

Stack Overflow用户
提问于 2014-03-29 05:18:22
回答 1查看 904关注 0票数 7

在试图创建一个在变量长度参数列表上循环的Ltac定义时,我在coq8.4pl2上遇到了以下意外行为。有人能给我解释一下吗?

代码语言:javascript
复制
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." *)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-30 21:44:16

让我们展开最后一次对ltac_loop的调用,看看发生了什么:

代码语言:javascript
复制
ltac_loop 1 1 0
-> (fun Y => idtac "hello"; ltac_loop Y) 1 0
-> (idtac "hello"; ltac_loop 1) 0

在这里您可以看到问题:您正在尝试将一些不是函数的东西应用于参数,这会导致您看到的错误。解决方案是以连续传递的方式重写策略:

代码语言:javascript
复制
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.
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22727363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档