我试图用非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
。事实上,如果我删除:
,它就可以了。为什么会有所作为?
答案 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
及其变体,它们可以解释视图。