如何使rhs脱离coq中的等式

如何使rhs脱离coq中的等式,coq,coq-tactic,Coq,Coq Tactic,如果我有以下资料: H : some complicated expression = some other complicated expression 我想抓住你 u := some other complicated expression 无需将其硬编码到我的校样中(即使用pose) 在LTac中有没有一种干净的方法可以做到这一点?我确信还有其他LTac方法可以做到这一点,在我的例子中,我更喜欢使用SSReflect的上下文模式语言来做到这一点。(您需要安装插件或使用Coq>=8.7,

如果我有以下资料:

H : some complicated expression = some other complicated expression
我想抓住你

u := some other complicated expression
无需将其硬编码到我的校样中(即使用
pose


在LTac中有没有一种干净的方法可以做到这一点?

我确信还有其他LTac方法可以做到这一点,在我的例子中,我更喜欢使用SSReflect的上下文模式语言来做到这一点。(您需要安装插件或使用Coq>=8.7,其中包括SSReflect):

最终目标:

  T : Type
  ce_1, ce_2 : T
  u := ce_2 : T
  H : ce_1 = u
  ============================
  False
通常,您可以越来越多地细化模式,直到获得一个非常稳定的匹配


请注意,这恰好是SSReflect手册第8.3节“上下文模式”的第一个示例。

这里是另一个版本,它使用Ltac及其在术语类型上进行模式匹配的能力:

Tactic Notation "assign" "rhs" "of" ident(H) "to" ident(u) "in" ident(H') :=
  match type of H with _ = ?rhs => set (u := rhs) in H' end.

Tactic Notation "assign" "rhs" "of" ident(H) "to" ident(u) "in" "*" :=
  match type of H with _ = ?rhs => set (u := rhs) in * end.
我们可以创建以上的更多变体(参见示例)。以下是如何使用它:

Lemma example {T} (ce1 ce2 ce3 : T) (H1 : ce1 = ce2) (H2 : ce2 = ce3) : ce1 = ce3.
Proof.
  assign rhs of H1 to u in *.
证明国:

  u := ce2 : T
  H1 : ce1 = u
  H2 : u = ce3
  ============================
  ce1 = ce3
  u := ce2 : T
  H1 : ce1 = u
  H2 : ce2 = ce3
  ============================
  ce1 = ce3
再来一次:

  Undo.
  assign rhs of H1 to u in H1.
证明国:

  u := ce2 : T
  H1 : ce1 = u
  H2 : u = ce3
  ============================
  ce1 = ce3
  u := ce2 : T
  H1 : ce1 = u
  H2 : ce2 = ce3
  ============================
  ce1 = ce3