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

在ssreflect/Coq中何时需要“:”(冒号)?,coq,ssreflect,Coq,Ssreflect,我试图理解Coq/ssreflect证明中的:(冒号)在非ssreflect Coq方面的确切含义 我读到它与将事物移动到目标有关(比如泛化??),与将事物移动到假设的=>相反。然而,我经常发现它令人困惑,因为无论是否使用:,证明都可以工作。以下是教程中的一个示例: Lemma tmirror_leaf2 t : tmirror (tmirror t) = Leaf -> t = Leaf. Proof. move=> e. by apply: (tmirror_leaf (tmir

我试图理解Coq/ssreflect证明中的
(冒号)在非ssreflect Coq方面的确切含义

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

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
。事实上,如果我删除
,它就可以正常工作。为什么会有不同?

我想我在阅读SSReflect文档时找到了答案。本质上,ssr已经重新定义了策略,比如
apply
,这样它就可以对目标的第一个变量而不是上下文中的某个变量进行操作。这就是为什么
以ssr方式在
apply:XX.
中使用的原因(这相当于
move:XX;apply.
),如果省略
,它也会起作用,因为这是传统的Coq方式

引用文件:

此外,SSReflect重新定义了基本的Coq战术案例elim和 应用,以便他们可以更好地利用“:”和“=>”。这些 Coq策略需要从上下文中进行论证,但要在上下文中进行操作 目标。它们的SSReflect对应项使用第一个变量或常量 而不是目标,因此它们是“纯演绎的”:

它们不使用或更改证明上下文。从那以后没有损失 `:'可随时用于提供所需的变量


实际上,
apply:H1。。。Hn
对所有效果都等同于移动:H1。。Hn;应用
。apply更有趣的用法是
apply/H
及其变体,它可以解释视图