有什么区别" Qed"和#34;定义"?

时间:2014-08-25 03:35:07

标签: scope coq

在交互式定理证明器Coq中,任何交互式证明或定义都可以使用QedDefined终止。有一些“不透明度”的概念,Qed强制执行但Defined没有。例如,Adam Chlipala撰写的依赖类型认证编程一书,states

  

我们使用Defined代替Qed结束“证明”,以便我们构建的定义仍然可见。这与使用Qed结束证明的情况形成对比,其中证明的细节随后被隐藏。 (更正式地,Defined将标识符标记为透明,允许其展开;而Qed将标识符标记为 opaque ,从而阻止展开。 )

但是,我不太确定这在实践中意味着什么。由于Defined需要Fix检查某个证据的结构,因此需要使用Qed以后example,但我不明白这是什么“检查“需要,或者如果使用Fix而失败的原因。 (看Qed的定义也不完全具有启发性。)

从表面上看,很难说出Definition x : bool. exact false. Qed. 实际上在做什么。例如,如果我写:

x

我仍然可以通过执行命令Print x.来查看x的值。此外,我稍后可以对Definition not_x : bool := match x with | true => false | false => true end. 的“不透明”值进行模式匹配:< / p>

x

因此,我似乎可以使用Fix的值就好了。 Chlipala教授在这里“展开”是什么意思?不透明和透明差异究竟有什么区别?最重要的是,{{1}}使这件事变得特别的是什么?

1 个答案:

答案 0 :(得分:8)

您实际上无法使用x的值,只能使用其类型。例如,由于xfalse,请尝试证明x = falsex = true,而您将无法证明not_x。您可以展开x的定义(其定义与Defined的定义相同,但使用x),但您将无法检查{{1}的值你只知道它是一个布尔值。

Lemma not_x_is_true : not_x = true.
Proof.
unfold not_x. (* this one is fine *)
unfold x. (* This one is not. Error: Cannot coerce x to an evaluable reference. *)

Qed vs Defined背后的想法是,在某些情况下,您不希望查看证明字词的内容(因为它不相关,或者只是一个非常大的术语)不想展开),你需要知道的是声明是真的,不是为什么它是真的。最后,在使用QedDefined之前您必须要问的问题是:我是否需要知道为什么一个定理是正确的,或者我只需要知道这是真的吗?