我面临一个非常奇怪的问题:coq不想将forall变量移动到上下文中。
在过去,它做到了:
Example and_exercise :
forall n m : nat, n + m = 0 -> n = 0 /\ m = 0.
Proof.
intros n m.
它产生:
n, m : nat
============================
n + m = 0 -> n = 0 /\ m = 0
但是当我们在forall内部使用forall时,它不起作用:
(* Auxilliary definition *)
Fixpoint All {T : Type} (P : T -> Prop) (l : list T) : Prop :=
(* ... *)
Lemma All_In :
forall T (P : T -> Prop) (l : list T),
(forall x, In x l -> P x) <->
All P l.
Proof.
intros T P l. split.
- intros H.
在此之后我们得到:
T : Type
P : T -> Prop
l : list T
H : forall x : T, In x l -> P x
============================
All P l
但是如何将x移到H之外并将其破坏成更小的碎片?我试过了:
destruct H as [x H1].
但它给出了一个错误:
Error: Unable to find an instance for the variable x.
它是什么?怎么修?
问题是forall
嵌套在暗示的左边而不是右边。从x
形式的假设引入forall x, P x
是没有意义的,就像将n
中的plus_comm : forall n m, n + m = m + n
引入另一个证明的背景一样没有意义。相反,你需要在正确的地方使用H
假设。我不能给你这个问题的答案,但你可能想在同一章中参考dist_not_exists
练习。