在ssreflect / Coq中何时需要`:`(冒号)?

时间:2015-12-28 21:16:16

标签: coq ssreflect

我试图用非ssreflect Coq来理解Coq / ssreflect证明中:(冒号)的确切含义。

我读到它与将事物移动到目标(如概括??)有关,而与=>相反,它将事物转移到假设中。但是,我经常发现它令人困惑,因为无论是否使用:,证据都可以正常工作。以下是教程中的示例:

Lemma tmirror_leaf2 t : tmirror (tmirror t) = Leaf -> t = Leaf.
Proof.
move=> e.
by apply: (tmirror_leaf (tmirror_leaf e)).
Qed.

其中,

tmirror_leaf
     : forall t, tmirror t = Leaf -> t = Leaf

是一个引理,说如果树的镜子是叶子,那么树就是叶子。

我不明白为什么我们需要:这里,而不仅仅是做Coq apply。事实上,如果我删除:,它就可以了。为什么会有所作为?

2 个答案:

答案 0 :(得分:2)

我想我在阅读SSReflect文档时找到了答案。从本质上讲,ssr重新定义了apply这样的策略,使得它在目标的第一个变量上运行,而不是在上下文中的某个变量。这就是:以{s}方式在apply: XX.中使用的原因(相当于move: XX; apply.),如果:被省略,它也有效是传统的Coq方式。

引用文档:

  

此外,SSReflect重新定义了基本的Coq战术案例,elim和   适用,以便他们可以更好地利用':'和' =>'。这些   Coq策略需要从上下文中进行论证,但需要对其进行操作   目标。他们的SSReflect对应物使用第一个变量或常数   相反,他们是#34;纯粹演绎":

     

他们不使用或更改证明上下文。从那以后就没有损失了   `:'可以很容易地用来提供所需的变量。

答案 1 :(得分:2)

实际上,apply: H1 ... Hn对所有效果都相当于move: H1 .. Hn; apply。应用的一个更有趣的用途是apply/H及其变体,它们可以解释视图。