如何匹配 "match" 表达式?
How to match a "match" expression?
我正在尝试为假设编写规则,在 match
构造的帮助下制定:
Goal forall x:nat, (match x with | 1 => 5 | _ => 10 end = 5 -> x = 1)%nat.
intros.
x : nat
H : match x with
| 0%nat => 10%nat
| 1%nat => 5%nat
| S (S _) => 10%nat
end = 5%nat
============================
x = 1%nat
我怎样才能匹配这样的假设?以下直接方法失败:
match goal with
|[H:match ?e with | ?a => ?x | ?b => ?y | ?c => ?z end = ?b] => idtac
end.
> Syntax error: 'end' expected after [branches] (in [match_constr]).
match
语句的模式匹配有点奇怪。
您应该知道的第一件事是,在 Coq 内部,不存在多个变量或深度匹配的 match
之类的东西:一切都根据更简单的 match
语句进行翻译。因此,您写的术语实际上是以下术语的语法糖:
match x with
| 0 => 10
| S x' =>
match x' with
| 0 => 5
| S x'' => 10
end
end
这就是 Coq 在打印证明状态时所暗示的内容。问题是这种语法糖不适用于 Ltac 模式:因此,在编写提及 match
的 Ltac 模式时,您应该始终尝试将其匹配为一级 match
].
第二个问题是您无法绑定 match
的 模式 部分:类似于
match goal with
| H : match ?x => _ | ?y => _ end = 5 |- _ => (* ... *)
end
在 Ltac 中没有真正意义。
您有两种选择来解决您的问题,那么:
在模式部分写下您期望的 match
和您类型的构造函数的确切列表,例如
match goal with
| H : match x with 0 => _ | S _ => _ end = 5 |- _ => (* ... *)
end
使用特殊的 match (* ... *) with _ => _ end
语法,匹配 any match
whatever:
match goal with
| H : match x with _ => _ end = 5 |- _ => (* ... *)
end
通常,就像您的情况一样,人们仍想考虑 match
的 所有 个分支,包括深层分支。在这种情况下,这个成语通常会派上用场:
repeat match goal with
| H : match ?x with _ => _ end = _ |- _ =>
destruct x; try solve [inversion H]
end.
我正在尝试为假设编写规则,在 match
构造的帮助下制定:
Goal forall x:nat, (match x with | 1 => 5 | _ => 10 end = 5 -> x = 1)%nat.
intros.
x : nat
H : match x with
| 0%nat => 10%nat
| 1%nat => 5%nat
| S (S _) => 10%nat
end = 5%nat
============================
x = 1%nat
我怎样才能匹配这样的假设?以下直接方法失败:
match goal with
|[H:match ?e with | ?a => ?x | ?b => ?y | ?c => ?z end = ?b] => idtac
end.
> Syntax error: 'end' expected after [branches] (in [match_constr]).
match
语句的模式匹配有点奇怪。
您应该知道的第一件事是,在 Coq 内部,不存在多个变量或深度匹配的 match
之类的东西:一切都根据更简单的 match
语句进行翻译。因此,您写的术语实际上是以下术语的语法糖:
match x with
| 0 => 10
| S x' =>
match x' with
| 0 => 5
| S x'' => 10
end
end
这就是 Coq 在打印证明状态时所暗示的内容。问题是这种语法糖不适用于 Ltac 模式:因此,在编写提及 match
的 Ltac 模式时,您应该始终尝试将其匹配为一级 match
].
第二个问题是您无法绑定 match
的 模式 部分:类似于
match goal with
| H : match ?x => _ | ?y => _ end = 5 |- _ => (* ... *)
end
在 Ltac 中没有真正意义。
您有两种选择来解决您的问题,那么:
在模式部分写下您期望的
match
和您类型的构造函数的确切列表,例如match goal with | H : match x with 0 => _ | S _ => _ end = 5 |- _ => (* ... *) end
使用特殊的
match (* ... *) with _ => _ end
语法,匹配 anymatch
whatever:match goal with | H : match x with _ => _ end = 5 |- _ => (* ... *) end
通常,就像您的情况一样,人们仍想考虑 match
的 所有 个分支,包括深层分支。在这种情况下,这个成语通常会派上用场:
repeat match goal with
| H : match ?x with _ => _ end = _ |- _ =>
destruct x; try solve [inversion H]
end.