Context: I’m working on exercises in Software Foundations.
Theorem neg_move : forall x y : bool,
x = negb y -> negb x = y.
Proof. Admitted.
Theorem evenb_n__oddb_Sn : forall n : nat,
evenb n = negb (evenb (S n)).
Proof.
intros n. induction n as [| n'].
Case "n = 0".
simpl. reflexivity.
Case "n = S n'".
rewrite -> neg_move.
Before the last line, my subgoal is this:
evenb (S n') = negb (evenb (S (S n')))
And I want to transform it into this:
negb (evenb (S n')) = evenb (S (S n'))
When I try to step through rewrite -> neg_move, however, it produces this error:
Error: Unable to find an instance for the variable y.
I’m sure this is really simple, but what am I doing wrong? (Please don’t give anything away for solving evenb_n__oddb_Sn, unless I’m doing it completely wrong).
As danportin mentioned, Coq is telling you that it does not know how to instantiate
y. Indeed, when you dorewrite -> neg_move, you ask it to replace somenegb xby ay. Now, whatyis Coq supposed to use here? It cannot figure it out.One option is to instantiate
yexplicitly upon rewriting:rewrite -> neg_move with (y:=some_term)This will perform the rewrite and ask you to prove the premises, here it will add a subgoal of the form
x = negb some_term.Another option is to specialize
neg_moveupon rewriting:rewrite -> (neg_move _ _ H)Here
Hmust be a term of typesome_x = negb some_y. I put two wildcards for thexand theyparameters ofneg_movesince Coq is able to infer them fromHas beingsome_xandsome_yrespectively. Coq will then try to rewrite an occurence ofnegb some_xin your goal withsome_y.But you first need to get this
Hterm in your hypotheses, which might be some additional burden…(Note that the first option I gave you should be equivalent to
rewrite -> (neg_move _ some_term))Another option is
erewrite -> negb_move, which will add uninstantiated variables that will look like?xand?y, and try to do the rewrite. You will then have to prove the premise, which will look like(evenb (S (S n'))) = negb ?y, and hopefully in the process of solving this subgoal, Coq will find out what?yshould have been from the start (there are some restrictions though, and some problems may arise is Coq solves the goal without figuring out what?ymust be).However, for your particular problem, it is quite easier:
symmetry.apply neg_move.And that’s what you wanted (backwards, do another
symmetry.if you care).