Coq - 使用eqn

时间:2016-08-31 21:43:09

标签: coq coq-tactic

使用Coq 8.4pl3,我在使用 eqn:变体进行归纳时出现错误,该变量未在参考手册中的归纳下列出。

(* Export below requires Software Foundations 4.0. *)
Require Export Logic.

Inductive disjoint (X : Type) (l1 l2 : list X) : Prop :=
  | nil1 : l1 = [] -> disjoint X l1 l2
  | nil2 : l2 = [] -> disjoint X l1 l2
  | bothCons : forall x:X, 
                 In x l1 -> 
                   not (In x l2) -> 
                     disjoint X l1 l2.

Fixpoint head (X : Type) (l : list X) : option X :=
  match l with
  | [] => None
  | h :: t => Some h
  end.

Fixpoint tail (X : Type) (l : list X) : list X :=
  match l with
  | [] => []
  | h :: t => t
  end.

Inductive NoDup (X : Type) (l : list X) : Prop :=
  | ndNil : l = [] -> NoDup X l
  | ndSingle : forall x:X, l = [x] -> NoDup X l
  | ndCons : forall x:X, head X l = Some x ->
               not (In x (tail X l)) /\ NoDup X (tail X l) -> 
                 NoDup X l.

Theorem disjoint__app_NoDup : 
      forall (X : Type) (l1 l2 : list X),
        disjoint X l1 l2 /\ NoDup X l1 /\ NoDup X l2 ->
          NoDup X (l1 ++ l2).
Proof.
      intros. induction H eqn:caseEqn.

如果我用最简单的“感应H”代替最后一步,我没有错误,但是使用上面的eqn:参数,我得到了错误:

  

错误:a用于结论。

(之前在定理陈述中缺少一个条件,相同的错误列出了标识符 d 。)

使用断言时,将参考手册列表“用于结论”作为错误。在幕后, eqn:可能会产生断言,但在上下文中我没有标识符 a 可见,我看不出是什么意思Coq正试图自动完成它。

尝试用

替换校对的开头
  intros. remember H. induction H.

现在尝试进行归纳会产生与以前相同的错误,仅使用 H 而不是 a 。 (当定理错过了附加条件时,Coq还明确地在上下文中添加了 d ,与假设 H 相同。)

我怎样才能前进?我试图避免从上下文中丢失信息。

1 个答案:

答案 0 :(得分:0)

这是一个小错误;我reported it。但是,你在这里尝试做的事情并不是特别明智。请注意,您正在联接(induction)上调用/\,并要求Coq为您留下一个等式,表明原始假设等于两个生成的证明的结合。这里有两个问题:

  1. 您的假设并非在任何地方以依赖方式使用,因此您无需记住它。
  2. 您的假设不是递归的,所以您也可以destruct H而不是induction H
  3. 至于错误消息,如果您注意到/\替换为*会使induction H eqn:caseEqn通过,则会更加清晰,并将您的假设分为两部分{{ {1}}和a。实际问题是,当b的类型为induction H eqn:...时,由H构造的证明术语是错误的,因为您无法消除Prop来获取信息。我怀疑代码只是尝试用它以特定方式创建的Prop做某事,并假设任何失败都必须是因为a在结论中使用,而不是因为它所创造的证明术语是不正确的。