定义和定理之间有什么区别?

时间:2020-02-06 18:15:25

标签: coq

the current version of the Software Foundations中,相关解释是故意留有余地的。

首先,我们使用了关键字Theorem而不是Example。 这种差异主要是风格问题;关键字 ExampleTheorem(还有其他一些,包括LemmaFactRemark)对Coq的意义差不多

(我将用来表示不确定性的措辞加粗。)

an earlier version of, evidently, the same writing中,它被强加:

该定理和证明的形式与上面的示例几乎完全相同:唯一的不同是我们添加了量词∀ n:nat,而我们使用了关键字Theorem Example中。的确,后者的差异纯粹是风格问题。关键字ExampleTheorem(以及其他一些关键字,包括LemmaFactRemark)的含义完全相同给Coq的事情。

(我用粗体字表达了力量)。

the official documentation看,所有这些单词以及更多单词都属于同一语法类别«断言关键字»

assertion_keyword  ::=  Theorem | Lemma
                        Remark | Fact
                        Corollary | Property | Proposition
                        Definition | Example

还有另外两个部分说明了这些关键字的工作方式:«Definitions»«Assertions and proofs»。简而言之:

定义通过名称与术语的关联来扩展环境。

—并且:

断言声明了一个命题(或类型),该命题(或类型的居民)是使用战术以交互方式构建的。

但是,据我所知,一个定理也扩展了环境,并且可以使用策略构建示例。因此,我看不出这些地方有什么不同。但是软件基金会是一本聪明的书。如果他们选择不确定,一定有原因吗?

2 个答案:

答案 0 :(得分:4)

到目前为止,差异很小,可以总结为:

  • Theorem/Example/Definition/...确实在文档中产生了不同的条目;这是最相关的差异。
  • 对于非交互模式,某些格式,例如Theorem不支持语法格式Theorem foo := nat.,例如Definition支持这种语法格式。

另一个重要的区别是您是否使用交互模式。就是说:

Definition foo : Type := nat.

Definition foo : Type. Proof. apply nat. Qed.

由于第二个创建了交互式证明,因此将采用略有不同的代码路径;定义发送到内核时的代码路径有些不同,但是Coq 8.12应该为所有实际目的统一它们,只是将第二个证明标记为不透明。

答案 1 :(得分:2)

我看到的一个区别是Definition可以给出立即定义,而LemmaTheorem不能给出。

Definition one := 1.

Lemma two := 2. (* syntax error *)
Theorem three := 3. (* syntax error *)

其余的只有Example有用。

Remark four := 4. (* syntax error *)
Fact five := 5. (* syntax error *)
Corollary six := 6. (* syntax error *)
Property seven := 7. (* syntax error *)
Proposition eight := 8. (* syntax error *)
Example nine := 9. (* works! *)