Coq Ltac中一元数据构造函数的匹配

Coq Ltac中一元数据构造函数的匹配,coq,ltac,Coq,Ltac,我正在做一些关于在Coq中形式化简单类型的lambda演算的练习,并希望使用Ltac自动化我的证明。在证明进步定理时: Theorem progress : forall t T, empty |-- t \in T -> value t \/ exists t', t ==> t'. 我想出了这段Ltac代码: Ltac progress_when_stepping := (* right, because progress statement places stepp

我正在做一些关于在Coq中形式化简单类型的lambda演算的练习,并希望使用Ltac自动化我的证明。在证明进步定理时:

Theorem progress : forall t T,
   empty |-- t \in T -> value t \/ exists t', t ==> t'.
我想出了这段Ltac代码:

Ltac progress_when_stepping :=
  (* right, because progress statement places stepping on the right of \/ *)
  right;
  (* use induction hypotheses *)
  repeat
    match goal with
    | [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 _ ==> _ ] =>
      induction H; auto
    | [ H : _ -> value _ \/ exists _, ?t2 ==> _, H0 : value ?t1 |-
        exists _, ?C ?t1 ?t2 ==> _ ] =>
      induction H; auto
    | [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 ==> _ ] =>
      induction H; auto
    end.
==>
表示单个评估步骤(通过小步语义)。每个比赛案例的目的是:

  • 当我们有一个假设说构造函数中的第一项是步进的时候,匹配任何二进制构造函数
  • 当我们假设构造函数步骤中的第二项和构造函数中的第一项已经是值时,匹配任何二进制构造函数
  • 当我们有一个假设说构造器中的术语步进时,匹配任何一元构造器
  • 然而,从这段代码的行为来看,第三种情况似乎也与二进制构造函数相匹配。如何将其限制为仅与一元构造函数实际匹配?

    该构造似乎可以工作:

    有一种特殊形式的模式可以将子项与模式匹配:
    上下文标识[cpattern]
    。 它匹配任何具有匹配cpattern的子项的术语。如果存在匹配项,可选标识将被指定为“匹配上下文”,即匹配子项替换为孔的初始项。

    <> P>由于历史原因,“代码>上下文< /代码>用于考虑n个应用程序,如<代码>(F 1 2)< /C>作为一个整体,而不是一系列一元应用程序<代码>((f 1)2)< /C>。因此
    上下文[f?x]
    将无法在
    (f 1 2)
    中找到匹配的子项:如果模式是部分应用程序,则匹配的子项必然是具有完全相同数量参数的应用程序

    所以,我想这是可行的(至少在我炮制的一个最小的人工例子上是可行的):


    问题是
    ?C
    ?C0?t0
    形式的术语相匹配。您可以进行一些辅助匹配以排除这种情况

    match goal with
      …
    | [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 ==> _ ] =>
      match C with
        | ?C0 ?t0 => fail
        | _ => induction H; auto
      end
    end.
    

    这也将与构造器处于复杂环境中的目标相匹配,这意味着大量误报(例如,在否定条件下)。@Gilles你是对的。我想知道这是否适用于进度定理,也就是在这个特殊情况下。
    match goal with
      …
    | [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 ==> _ ] =>
      match C with
        | ?C0 ?t0 => fail
        | _ => induction H; auto
      end
    end.