考虑证明代码:
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.
cycle 1.
(* Goal does not cycle *)
swap 1 2.
(* Goal does not swap *)
Abort.
不幸的是,看来cycle
和swap
无效。为什么,以及如何正确使用它们?
答案 0 :(得分:3)
所以,这个故事有趣而又不直观。
使用tac; cycle
可以起作用,因为; cycle
对所有个目标运行cycle
,并可以正确循环。 / p>
但是,tac. cycle
没有。为什么?
原因是tac.
实际上是“调用当前goal selector,然后运行tac
”的简写。默认的目标选择器是Focus 1
。
这会导致cycle
尝试循环执行1个目标的列表(目标目标),而该目标什么也不做。
但是,在此模型中,swap 1 2
会产生错误,因为我们尝试从一个目标列表中交换1
和2
。 I raised an issue about this on the coq
bug tracker
解决方案是使用all: swap
或all:cycle
。这首先关注所有目标,使swap
和cycle
能够按预期工作。
完整的代码清单:
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 使用tactic; swap
或all:swap