3

如果我有以下情况:

H : some complicated expression = some other complicated expression

我想抓住

u := some other complicated expression

无需将其硬编码到我的证明中(即,使用pose

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

4

2 回答 2

3

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

(* ce_i = complicated expression i *)
Lemma example T (ce_1 ce_2 : T) (H : ce_1 = ce_2) : False.
set u := (X in _ = X) in H.

结果目标:

  T : Type
  ce_1, ce_2 : T
  u := ce_2 : T
  H : ce_1 = u
  ============================
  False

通常,您可以越来越多地改进模式,直到获得相当稳定的匹配。

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

于 2017-06-02T23:35:25.913 回答
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.

我们可以创建以上的更多变体(参见例如here)。以下是如何使用它:

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

再一次:

  Undo.
  assign rhs of H1 to u in H1.

证明状态:

  u := ce2 : T
  H1 : ce1 = u
  H2 : ce2 = ce3
  ============================
  ce1 = ce3
于 2017-06-03T09:38:20.617 回答