记住表达式时如何命名假设?

时间:2012-07-16 12:12:45

标签: coq

Coq的文档带有一般警告而不是依赖于内置命名机制,但选择一个人自己的名字,以免命名机制中的更改过去证明​​无效。

在考虑表单remember Expr as v的表达式时,我们将变量v设置为表达式Expr。但是假设的名称是自动选择的,类似Heqv,所以我们有:

Heqv: v = Expr

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

1 个答案:

答案 0 :(得分:5)

如果您可以摆脱单独的平等,请尝试set (name := val)。使用unfold代替rewrite来恢复价值。

如果你需要超过rewrite <-的相等,我知道没有内置的策略可以做到这一点。但是,您可以手动执行此操作,也可以构建策略/符号。我把它扔到了一起。 (注意:我不是专家,这可能更容易完成。)

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 *.

使用remember_as_eq (2+2) four Heqfour获得与remember (2+2) as four相同的结果。


注意:已更新以处理更多案例,旧版本在某些值和目标类型组合上失败。如果您发现另一个案例适用于rewrite而不是此案例,请发表评论。