逻辑:All_In无法扩展嵌套的全部

时间:2019-04-25 19:33:29

标签: coq logical-foundations

我面临一个非常奇怪的问题: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

但是当我们在所有人内部拥有所有人时,这是行不通的:

(* 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.

是什么?如何解决?

1 个答案:

答案 0 :(得分:3)

问题在于forall嵌套在含义的左侧,而不是右侧。从x形式的假设引入forall x, P x是没有意义的,就像在{{ 1}}到另一个证明的上下文中。相反,您需要在正确的位置应用来使用n假设。对于这个问题,我无法给您答案,但是您可能希望参考同一章中的plus_comm : forall n m, n + m = m + n练习。