In Coq (or Rocq), can't a lemma with a universal conclusion be applied to other premises?

When I prove with Coq (or Rocq), I find that sometimes if a hypothesis is "P" and another is "P -> forall x, Q x", I cannot make "forall x, Q x" a new premise by modus ponens.
Here is an example:
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.
The proof will be stuck in the line "apply H in H1" and Coq returns that "Unable to find an instance for the variable x."
But must "x" be instantiated? It looks unnecessary. What is the difference between the two proofs?
I asked both DeepSeek and ChatGPT. Neither of them could provide a satisfiable answer.
I also guessed that it could be the variable occurrence problem in the antecedent. But if it were, the tactic "generalize dependent" should have failed.
Answer
See Read more: a simple fix is to use eapply H in H1
, or just conclude the proof with exact (H H1)
.
Alternatively, note that you don't really need tactics here: the whole proof is just fun X P Q H x p => H p x
.
Enjoyed this article?
Check out more content on our blog or follow us on social media.
Browse more articles