分号";"之间的Coq执行差异和期间"。"

时间:2016-03-29 18:42:21

标签: coq coq-tactic

鉴于使用;战术的有效Coq证明,是否有通用公式将其转换为有效的等效证明.代替;

许多Coq证明使用;或战术排序战术。作为一个初学者,我想看一下各个步骤的执行情况,所以我想用.代替;,但令我惊讶的是,我发现这可能会打破证据。

;上的文档很少,我还没有在任何地方找到.的明确讨论。我确实看到paper表示t1; t2的非正式含义是

  

t2应用于在当前证明环境中执行t1所产生的每个子目标,

我想知道.是否仅对当前的子目标进行操作并解释了不同的行为?但特别是我想知道是否有一般解决方案来修复因.取代;而导致的破损。

1 个答案:

答案 0 :(得分:13)

tac1 ; tac2的语义是运行tac1,然后在所有 tac2创建的子目标上运行tac1。所以你可能面临各种各样的情况:

运行tac1

后没有任何目标

如果在运行tac1后没有剩下目标,那么tac2永远不会运行,而Coq只是默默地成功。例如,在第一个推导中,我们在(有效)证明的末尾有一个无用的; intros

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros ; repeat split ; assumption ; intros.
Qed.

如果我们将其隔离,那么我们得到一个Error: No such goal.,因为我们正试图在无法证明的情况下运行策略!

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros ; repeat split ; assumption.
intros. (* Error! *)

运行tac1后,只剩下一个目标。

如果在运行tac1后只剩下一个目标,则tac1 ; tac2的行为有点像tac1. tac2。主要区别在于,如果tac2失败,那么整个tac1 ; tac2也会失败,因为两种策略的顺序被视为一个单元,既可以作为一个整体成功,也可以作为一个整体失败。但如果tac2成功,那么它就等同了。

E.g。以下证明是有效的:

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros.
repeat split ; assumption.
Qed.

正在运行tac1会产生多个目标。

最后,如果通过运行tac1生成多个目标,则tac2将应用于所有生成的子目标。在我们的运行示例中,我们可以观察到,如果我们在repeat split之后切断战术序列,那么我们就有5个目标。这意味着我们需要复制/粘贴assumption五次以使用;复制先前给出的证明:

Goal forall (A : Prop), A -> (A /\ A /\ A /\ A /\ A).
intros ; repeat split.
 assumption.
 assumption.
 assumption.
 assumption.
 assumption.
Qed.