【问题标题】:Matching on unary data constructors in Ltac在 Ltac 中匹配一元数据构造函数
【发布时间】:2016-05-06 08:39:53
【问题描述】:

我正在做一些关于在 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.

==> 表示单步评估(通过小步语义)。每个匹配案例的意图是:

  1. 当我们有一个假设说构造函数中的第一项步骤时,匹配任何 binary 构造函数。
  2. 当我们假设构造函数步骤中的第二项和构造函数中的第一项已经是一个值时,匹配任何 二进制 构造函数
  3. 当我们有一个假设说构造函数中的术语在步骤时,匹配任何 一元 构造函数。

但是,看看这段代码的行为,第三种情况似乎也匹配 binary 构造函数。如何将其限制为仅匹配一元构造函数?

【问题讨论】:

    标签: coq ltac


    【解决方案1】:

    问题是?C 匹配?C0 ?t0 形式的术语。你可以做一些二次匹配来排除这种情况。

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

    【讨论】:

      【解决方案2】:

      似乎context ident [ term ] 构造会起作用:

      有一种特殊形式的模式可以将子项与模式匹配: context ident [cpattern]。 它匹配具有匹配 cpattern 的子术语的任何术语。如果有匹配项,则为可选的 ident 分配“匹配的上下文”,即匹配的子项被替换为空洞的初始项。 ...

      由于历史原因,context 曾经将 n 元应用程序(例如 (f 1 2))视为一个整体,而不是一元应用程序 ((f 1) 2) 的序列。因此,context [f ?x] 将无法在 (f 1 2) 中找到匹配的子项:如果该模式是部分应用程序,则匹配的子项必然是具有完全相同数量参数的应用程序。

      所以,我想这会起作用(至少它适用于我编造的最小人工示例):

      ...
        | [ H : _ -> value _ \/ exists _, ?t1 ==> _
          |- context [exists _, ?C ?t1 ==> _ ]] => induction H; auto
      ...
      

      【讨论】:

      • 这也将匹配构造函数在某些复杂上下文中的目标,这意味着很多误报(例如在否定下)。
      • @Gilles 你是对的。我想知道这是否适用于进度定理,即在这种特殊情况下。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多