使用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 相同。)
我怎样才能前进?我试图避免从上下文中丢失信息。
答案 0 :(得分:0)
这是一个小错误;我reported it。但是,你在这里尝试做的事情并不是特别明智。请注意,您正在联接(induction
)上调用/\
,并要求Coq为您留下一个等式,表明原始假设等于两个生成的证明的结合。这里有两个问题:
destruct H
而不是induction H
。至于错误消息,如果您注意到/\
替换为*
会使induction H eqn:caseEqn
通过,则会更加清晰,并将您的假设分为两部分{{ {1}}和a
。实际问题是,当b
的类型为induction H eqn:...
时,由H
构造的证明术语是错误的,因为您无法消除Prop
来获取信息。我怀疑代码只是尝试用它以特定方式创建的Prop
做某事,并假设任何失败都必须是因为a
在结论中使用,而不是因为它所创造的证明术语是不正确的。