当我用 Coq(或 Rocq)证明时,我发现有时如果一个假设是“P”而另一个假设是“P -> forall x, Q x”,我无法通过肯定前件将“forall x, Q x”变成一个新的前提。
以下是一个例子:
Theorem post_forall: forall (X: Type) (P: Prop) (Q: X -> Prop),
(P -> forall x, Q x) -> forall x, P -> Q x.
Proof.
(*
Here is a correct proof:
intros X P Q.
intros H.
intros y.
intros H1.
generalize dependent y.
apply H.
apply H1.
Qed.
*)
intros X P Q.
intros H.
intros y.
intros H1.
generalize dependent y.
apply H in H1.
(** STUCK HERE,
But Why cannot we do this???
They look the same.
*)
Admitted.
证明将停留在“在 H1 中应用 H”这一行,并且 Coq 返回“无法找到变量 x 的实例”。
但是“x”必须被实例化吗?这看起来没有必要。这两个证明有什么区别?
我咨询了DeepSeek和ChatGPT,但他们都没能给出令人满意的答案。
我还猜测这可能是先行句中变量出现的问题。但如果是这样,“泛化依赖”策略应该会失败。