使用 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。)
参考手册将“在结论中使用”列为使用assert的错误。从某种意义上说,在幕后,eqn:可能正在生成断言,但我在上下文中没有可见的标识符a,而且我看不到 Coq 试图自动使用它做什么。
尝试将证明的开头替换为
intros. remember H. induction H.
现在进行归纳的尝试给出了与以前相同的错误,只是使用H而不是a。(当定理缺少附加条件时,Coq 还明确地在上下文中添加了一个d,与假设H相同。)
我怎样才能在这里前进?我试图避免从上下文中丢失信息。