如何使用周期/掉期策略?

时间:2018-06-27 11:52:39

标签: coq coq-tactic

考虑证明代码:

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.

不幸的是,看来cycleswap无效。为什么,以及如何正确使用它们?

1 个答案:

答案 0 :(得分:3)

所以,这个故事有趣而又不直观。

使用tac; cycle 可以起作用,因为; cycle所有个目标运行cycle,并可以正确循环。 / p>

但是,tac. cycle没有。为什么?

原因是tac.实际上是“调用当前goal selector,然后运行tac”的简写。默认的目标选择器是Focus 1

这会导致cycle尝试循环执行1个目标的列表(目标目标),而该目标什么也不做。

但是,在此模型中,swap 1 2会产生错误,因为我们尝试从一个目标列表中交换12I raised an issue about this on the coq bug tracker

解决方案是使用all: swapall:cycle。这首先关注所有目标,使swapcycle能够按预期工作。

完整的代码清单:

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; swapall:swap