首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ltac:可选变量名

Ltac:可选变量名
EN

Stack Overflow用户
提问于 2018-03-29 14:24:31
回答 1查看 201关注 0票数 2

我想写一个带有可选变量名的策略。最初的策略如下:

代码语言:javascript
复制
Require Import Classical.

Ltac save := 
  let H := fresh in
  apply NNPP;
  intro H;
  apply H.

我想让用户有机会选择他想要的名称,并像这样使用它:例如,save a

我用this solution编写了一个变体

代码语言:javascript
复制
Require Import Classical.

Inductive ltac_No_arg : Set :=
  | ltac_no_arg : ltac_No_arg.

Ltac savetactic h := 
  match type of h with
    | ltac_No_arg => let H := fresh in
      apply NNPP;
      intro H;
      apply H
    | _ => apply NNPP;
      intro h;
      apply h
  end.

Tactic Notation "save" := savetactic ltac_no_arg.
Tactic Notation "save" ident(x) := savetactic x.

然而,这个证明在save h上失败了

代码语言:javascript
复制
Lemma te (A B : Prop) : A \/ ~A.
Proof.
save h.
right.
intro a.
apply h.
left.
exact a.
Qed.

错误信息:

代码语言:javascript
复制
In nested Ltac calls to "save (ident)", "savetactic" and "h", last term evaluation failed.
In nested Ltac calls to "save (ident)", "savetactic" and "h", last term evaluation failed.
Variable h should be bound to a term but is bound to a ident.

我想我必须确保h是新鲜的,但我不确定如何做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-29 14:52:30

问题是,该解决方案涉及一个术语( constr)的论点,而您有一个名称(一个ident符)。但是,您可以通过提供新标识符的策略符号来更简单地解决问题。

代码语言:javascript
复制
Require Import Classical_Prop.

Ltac savetactic h := 
     apply NNPP;
      intro h;
      apply h.

Tactic Notation "save" := let H := fresh in savetactic H.
Tactic Notation "save" ident(x) := savetactic x.

Lemma te (A B : Prop) : A \/ ~A.
Proof.
  save h.
  right.
  intro a.
  apply h.
  left.
  exact a.
Qed.

这个解决方案的一个问题是,它在运行savetactic之前调用了savetactic,如果您希望在savetactic中执行其他一些工作之后,h是新鲜的,那么它将无法工作。不过,我认为,唯一不同的是自动生成的名字。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49558608

复制
相关文章

相似问题

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