在交互式定理证明器Coq中,任何交互式证明或定义都可以使用Qed
或Defined
终止。有一些“不透明度”的概念,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}}使这件事变得特别的是什么?
答案 0 :(得分:8)
您实际上无法使用x
的值,只能使用其类型。例如,由于x
为false
,请尝试证明x = false
或x = 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
背后的想法是,在某些情况下,您不希望查看证明字词的内容(因为它不相关,或者只是一个非常大的术语)不想展开),你需要知道的是声明是真的,不是为什么它是真的。最后,在使用Qed
或Defined
之前您必须要问的问题是:我是否需要知道为什么一个定理是正确的,或者我只需要知道这是真的吗?