逻辑:All_In 无法展开 nested forall
Logic: All_In can't expand nested forall
我面临一个非常奇怪的问题: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
嵌套在蕴涵的左侧而不是右侧。从 forall x, P x
形式的 假设 引入 x
没有意义,就像引入 n
没有意义一样在 plus_comm : forall n m, n + m = m + n
进入另一个证明的上下文。相反,您需要通过在正确的位置 应用 来使用 H
假设。我无法给你这个问题的答案,但你可能想参考同一章中的 dist_not_exists
练习。
我面临一个非常奇怪的问题: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
嵌套在蕴涵的左侧而不是右侧。从 forall x, P x
形式的 假设 引入 x
没有意义,就像引入 n
没有意义一样在 plus_comm : forall n m, n + m = m + n
进入另一个证明的上下文。相反,您需要通过在正确的位置 应用 来使用 H
假设。我无法给你这个问题的答案,但你可能想参考同一章中的 dist_not_exists
练习。