鉴于使用;
战术的有效Coq证明,是否有通用公式将其转换为有效的等效证明.
代替;
?
许多Coq证明使用;
或战术排序战术。作为一个初学者,我想看一下各个步骤的执行情况,所以我想用.
代替;
,但令我惊讶的是,我发现这可能会打破证据。
;
上的文档很少,我还没有在任何地方找到.
的明确讨论。我确实看到paper表示t1; t2
的非正式含义是
将
t2
应用于在当前证明环境中执行t1
所产生的每个子目标,
我想知道.
是否仅对当前的子目标进行操作并解释了不同的行为?但特别是我想知道是否有一般解决方案来修复因.
取代;
而导致的破损。
答案 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.