如何将 rhs 从 coq 中的相等性中拉出来
How to pull the rhs out of an equality in coq
如果我有以下情况:
H : some complicated expression = some other complicated expression
我也想抢
u := some other complicated expression
无需将其硬编码到我的证明中(即使用 pose
)
是否有在 LTac 中执行此操作的简洁方法?
我确信还有其他 ltac 方法可以做到这一点,就我而言,我更喜欢使用 SSReflect 的上下文模式语言来做到这一点。 (您需要安装插件或使用 Coq >= 8.7,其中包括 SSReflect):
(* 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 节 "Contextual patterns" 的第一个示例。
这是另一个版本,它使用 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
如果我有以下情况:
H : some complicated expression = some other complicated expression
我也想抢
u := some other complicated expression
无需将其硬编码到我的证明中(即使用 pose
)
是否有在 LTac 中执行此操作的简洁方法?
我确信还有其他 ltac 方法可以做到这一点,就我而言,我更喜欢使用 SSReflect 的上下文模式语言来做到这一点。 (您需要安装插件或使用 Coq >= 8.7,其中包括 SSReflect):
(* 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 节 "Contextual patterns" 的第一个示例。
这是另一个版本,它使用 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