So, the story is interesting and unintuitive.
A usage of : tac; cycle
does work, because ; cycle
runs cycle
on all goals, which cycles properly.
However, tac. cycle
does not. Why?
The reason is that tac.
is actually shorthand for "call the current goal selector, and then run tac
". The default goal selector is Focus 1
.
This causes cycle
to try to cycle a list of 1 goal, (the focued goal), which does nothing.
However, in this model, swap 1 2
should produce an error, because we try to swap 1
and 2
from a list of one goal. I raised an issue about this on the coq
bug tracker
The solution is to use all: swap
or all:cycle
. This focuses on all the goals first, which allows swap
and cycle
to work as expected.
Full code listing:
Definition f (a: nat): nat.
Proof.
Admitted.
Lemma rew: forall (a p : nat) (A: a + 1 = p),
f a = f p.
Proof.
Admitted.
Lemma userew: forall (a b: nat), f a = f b.
Proof.
intros.
erewrite rew.
(* NOTICE all: *)
all: cycle 1.
(* NOTICE all: *)
all: swap 1 2.
Abort.
TL;DR use tactic; swap
or all:swap