coqlogical-foundations

Software Foundations: apply ... with ... tactic


I'm try to run some simple examples on apply ... with ... tactic from Pierce's "Software Foundations".

It seems that examples from book doesn't work for me:

Theorem trans_eq: forall (X: Type) (n m o: Type),
                    n = m -> m = o -> n = o.
Proof.
  intros X n m o eq1 eq2. rewrite -> eq1. rewrite -> eq2. reflexivity.
Qed.

Example trans_eq_example' : forall (a b c d e f : nat),
     [a;b] = [c;d] ->
     [c;d] = [e;f] ->
     [a;b] = [e;f].
Proof.
  intros a b c d e f eq1 eq2.
  (* If we simply tell Coq apply trans_eq at this point,
     it can tell (by matching the goal against the
     conclusion of the lemma) that it should instantiate X
     with [nat], n with [a,b], and o with [e,f].
     However, the matching process doesn't determine an
     instantiation for m: we have to supply one explicitly
     by adding with (m:=[c,d]) to the invocation of
     apply. *)
  apply trans_eq with (m:=[c;d]). apply eq1. apply eq2. Qed.

trans_eq_example' failed with error:

trans_eq_example' < apply trans_eq with (m:=[c;d]).
Toplevel input, characters 6-30:
> apply trans_eq with (m:=[c;d]).
>       ^^^^^^^^^^^^^^^^^^^^^^^^
Error: Impossible to unify "?1707 = ?1709" with "[a; b] = [e; f]".

Additional information about Coq version:

coqtop -v
The Coq Proof Assistant, version 8.4pl4 (July 2014)
compiled on Jul 27 2014 23:12:44 with OCaml 4.01.0

How can I fix this error?


Solution

  • The issue is not the apply but a typo in your previous code. The definition of trans_eq should be:

    Theorem trans_eq: forall (X:Type) (n m o: X), n = m -> m = o -> n = o.
    

    Note that the type of n m o should be X, not Type.