在the current version of the Software Foundations中,相关解释是故意留有余地的。
首先,我们使用了关键字
Theorem
而不是Example
。 这种差异主要是风格问题;关键字Example
和Theorem
(还有其他一些,包括Lemma
,Fact
和Remark
)对Coq的意义差不多。
(我将用来表示不确定性的措辞加粗。)
在an earlier version of, evidently, the same writing中,它被强加:
该定理和证明的形式与上面的示例几乎完全相同:唯一的不同是我们添加了量词
∀ n:nat
,而我们使用了关键字Theorem
Example
中。的确,后者的差异纯粹是风格问题。关键字Example
和Theorem
(以及其他一些关键字,包括Lemma
,Fact
和Remark
)的含义完全相同给Coq的事情。
(我用粗体字表达了力量)。
从the official documentation看,所有这些单词以及更多单词都属于同一语法类别«断言关键字»:
assertion_keyword ::= Theorem | Lemma
Remark | Fact
Corollary | Property | Proposition
Definition | Example
还有另外两个部分说明了这些关键字的工作方式:«Definitions»和«Assertions and proofs»。简而言之:
定义通过名称与术语的关联来扩展环境。
—并且:
断言声明了一个命题(或类型),该命题(或类型的居民)是使用战术以交互方式构建的。
但是,据我所知,一个定理也扩展了环境,并且可以使用策略构建示例。因此,我看不出这些地方有什么不同。但是软件基金会是一本聪明的书。如果他们选择不确定,一定有原因吗?
答案 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
可以给出立即定义,而Lemma
和Theorem
不能给出。
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! *)