如何匹配“匹配”表达式?

时间:2015-02-11 12:57:55

标签: coq ltac

我正在尝试编写一个假设规则,在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]).

1 个答案:

答案 0 :(得分:9)

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模式时,你应该总是尝试匹配它,好像它是一个级别{{1} }。

第二个问题是你无法绑定match模式部分:类似

match

在Ltac中没有任何意义。

您有两种解决问题的方法:

  1. 在模式部分写下您期望的match goal with | H : match ?x => _ | ?y => _ end = 5 |- _ => (* ... *) end 以及您的类型构造函数的确切列表,例如

    match
  2. 使用特殊的match goal with | H : match x with 0 => _ | S _ => _ end = 5 |- _ => (* ... *) end 语法,该语法与任何 match (* ... *) with _ => _ end匹配:

    match
  3. 通常,在您的情况下,仍然需要考虑match goal with | H : match x with _ => _ end = 5 |- _ => (* ... *) end 所有分支,包括深层分支。在这种情况下,这个成语通常会派上用场:

    match