elim如何在/ \和\ /中使用Coq?

时间:2017-09-24 04:50:18

标签: coq coq-tactic

Coq Tutorial,第1.3.1和1.3.2节中,有两个elim个应用程序: 第一个:

1 subgoal

  A : Prop
  B : Prop
  C : Prop
  H : A /\ B
  ============================
   B /\ A

申请elim H后,

Coq < elim H.
1 subgoal

  A : Prop
  B : Prop
  C : Prop
  H : A /\ B
  ============================
   A -> B -> B /\ A

第二个:

1 subgoal

  H : A \/ B
  ============================
   B \/ A

应用elim H后,

Coq < elim H.
2 subgoals

  H : A \/ B
  ============================
   A -> B \/ A

subgoal 2 is:
 B -> B \/ A

有三个问题。首先,在第二个例子中,我不明白什么推理规则(或逻辑身份)应用于生成两个子目标的目标。不过,第一个例子对我来说很清楚。

第二个问题,根据Coq的手册,elim与归纳类型有关。因此,似乎elim根本不适用于此,因为我觉得这两个例子中没有归纳类型(原谅我不知道归纳类型的定义)。为什么elim可以在这里应用?

第三,elim一般做什么?这里的两个示例没有显示elim的常见模式。官方手册似乎是为非常高级的用户设计的,因为他们根据更多术语定义的其他几个术语来定义术语,并且他们的语言含糊不清。

非常感谢您的回答!

1 个答案:

答案 0 :(得分:4)

Jian,首先请注意,本手册是开源的,可在https://github.com/coq/coq获取;如果您认为可以改进措辞/定义顺序,请在那里打开一个问题或随时提交拉取请求。

关于您的问题,我认为您可以阅读更全面的Coq介绍,例如“Coq'art”,“Software Foundations”或“Programs and Proofs”等。

特别是,elim策略试图对特定类型应用所谓的“消除原则”。它被称为消除,因为在某种意义上,该规则允许您“摆脱”该特定对象,允许您继续进行证明[我建议阅读Dummett以进一步讨论逻辑连接词的起源]

特别是,∨连词的消除规则通常由逻辑学家编写如下:

          A   B
          ⋮  ⋮
 A ∨ B    C   C
────────────────
       C

也就是说,如果我们可以独立于CA派生B,那么我们可以从A ∨ B派生出来。这看起来很明显,不是吗?

回到Coq,事实证明,由于“Curry-Howard-Kolmogorov”等价,这条规则具有计算解释。事实上,Coq没有提供大多数标准逻辑连接词作为内置,但它允许我们通过“归纳”数据类型定义它们,类似于Haskell或OCaml中的那些。

特别是,∨的定义是:

Inductive or (A B : Prop) : Prop :=
  | or_introl : A -> A \/ B
  | or_intror : B -> A \/ B

也就是说,or A B是包含AB的数据,以及“标记”,可让我们“匹配”到知道我们真正拥有哪一个。

现在,“消除原则为或”有类型:

or_ind : forall A B P : Prop, (A -> P) -> (B -> P) -> A \/ B -> P

Coq的伟大之处在于,这样的原则不是“内置”,只是一个常规程序!想想,你能编写or_ind函数的代码吗?我会给你一个提示:

Definition or_ind A B P (hA : A -> P) (hB : B -> P) (orW : A ‌\/ B) :=
  match orW with
  | or_introl aW => ?
  | or_intror bW => ?
  end.

一旦定义了这个函数,elim所做的就是应用它,正确地实例化变量P

练习:使用applyord_ind代替elim解决您的第二个示例。祝你好运!