在Coq中,Defintion和'Let'之间有什么区别?为什么有些定义需要证明? 例如。这是集团理论中g1.v的一段代码。
Definition exp : Z -> U -> U.
Proof.
intros n a.
elim n; clear n.
exact e.
intro n.
elim n; clear n.
exact a.
intros n valrec.
exact (star a valrec).
intro n; elim n; clear n.
exact (inv a).
intros n valrec.
exact (star (inv a) valrec).
Defined.
这个证明的目的是什么?
答案 0 :(得分:11)
我认为您提出的问题与Coq中Definition
和Let
命令之间的差异并不完全相关。相反,您似乎想知道为什么Coq中的某些定义包含校对脚本。
Coq的一个有趣特性是,用于编写校样和程序的语言实际上是相同的。这种语言被称为Gallina,这是人们在使用Coq时使用的编程语言。当你写fun x => x + 5
之类的东西时,这就是加利纳的一个程序。
然而,在做证明时,人们通常使用另一种语言,称为Ltac。这是您exp
示例中显示的语言。这可能会让您相信Coq中的证明用不同的语言表示,但事实并非如此:Ltac脚本的作用是在Gallina中实际构建证明术语。您可以使用Print
命令查看,例如
Print exp.
即使用同一种语言编写证明和程序,使用单独的语言编写证据的原因是Gallina在编写证据时有点难以直接使用。尝试直接在复杂的定理上使用Print
命令来查看它有多难。
现在,尽管Ltac主要用于编写校样,但没有任何条件禁止您使用它来编写正常程序,因为最终产品是相同的:Gallina术语。通常,人们更喜欢在编写程序时使用Gallina,因为它更容易阅读。然而,人们可能会使用Ltac来编写程序,而直接在Gallina中编写程序会过于繁琐。我个人更愿意直接使用Gallina来编写你的例子中的exp
等函数,尽管这可以说是一种品味。