Coq 记住一个表达式时,如何命名该假设?

Coq 记住一个表达式时,如何命名该假设?,coq,Coq,Coq的文档中有一条一般性的警告,即不要依赖内置的命名机制,而是选择自己的名字,以免命名机制中的更改导致过去的证明无效 当考虑形式为记住Expr为v的表达式时,我们将变量v设置为表达式Expr。但是假设的名称是自动选择的,类似于Heqv,因此我们有: Heqv:v=Expr 如何选择自己的姓名而不是Heqv?我总是可以使用rename命令将其重命名为我喜欢的任何名称,但这并不能使我的证明独立于Coq中内置命名机制的假设未来更改 如果可以去掉单独的等式,请尝试set(name:=val)。使用展开

Coq的文档中有一条一般性的警告,即不要依赖内置的命名机制,而是选择自己的名字,以免命名机制中的更改导致过去的证明无效

当考虑形式为
记住Expr为v
的表达式时,我们将变量
v
设置为表达式
Expr
。但是假设的名称是自动选择的,类似于
Heqv
,因此我们有:

Heqv:v=Expr


如何选择自己的姓名而不是
Heqv
?我总是可以使用
rename
命令将其重命名为我喜欢的任何名称,但这并不能使我的证明独立于Coq中内置命名机制的假设未来更改

如果可以去掉单独的等式,请尝试
set(name:=val)
。使用
展开
而不是
重写
将值恢复到位


如果您需要大于重写的等式,请注意,您也可以将其定义为
战术符号“记住”constr(expr)“作为”ident(vname)”和eq“ident(eqname)
,如果您更愿意使用它作为
记住(2+2)作为四个,并使用eq Heqfour
,但这将阻塞解析器并隐藏内置的
记住作为
。如果您使用带有“ident(eqname)”和“ident(eqname)”的
战术符号“memory”constr(expr)”作为“ident(vname)
(或
和eq
而不是
的符号,则顺序很奇怪,但仍然可以访问旧的
memory
Tactic Notation "remember_as_eq" constr(expr) ident(vname) ident(eqname) :=
  let v     := fresh in
  let HHelp := fresh in
    set (v := expr);
    (assert (HHelp : sigT (fun x => x = v)) by ( apply (existT _ v); reflexivity));
    inversion HHelp as [vname eqname];
    unfold v in *; clear v HHelp;
    rewrite <- eqname in *.