Functional programming 定义和输入Coq之间的差异

Functional programming 定义和输入Coq之间的差异,functional-programming,coq,theorem-proving,Functional Programming,Coq,Theorem Proving,Coq中的定义和“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). in

Coq中的定义和“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.

这个证明的目的是什么?

我认为你所问的问题与Coq中的
定义
Let
命令之间的区别并没有太大关系。相反,您似乎想知道为什么Coq中的某些定义包含验证脚本

Coq的一个有趣的特性是,用于编写证明和程序的语言实际上是相同的。这种语言被称为Gallina,这是人们在使用Coq时使用的编程语言。当您编写类似于
funx=>x+5
的东西时,这是一个加里纳的程序

然而,在进行校对时,人们通常使用另一种语言,称为Ltac。这是出现在
exp
示例中的语言。这可能会让您相信Coq中的证明是用不同的语言表示的,但事实并非如此:Ltac脚本所做的是用Gallina实际构建证明术语。您可以通过使用
Print
命令看到这一点,例如

Print exp.
即使校样和程序是用同一种语言编写的,但有一种单独的语言来编写校样的原因是,在编写校样时,Gallina有点难以直接使用。试着直接在一个复杂的定理上使用
Print
命令,看看这有多困难


现在,尽管Ltac主要用于编写校对,但没有任何东西禁止您使用它来编写普通程序,因为最终产品是相同的:一个Gallina术语。通常,人们在编写程序时更喜欢使用Gallina,因为它更容易阅读。然而,人们可能会求助于Ltac来编写程序,因为直接在Gallina中编写程序太麻烦了。我个人更倾向于直接使用Gallina编写函数,例如您的示例中的
exp
,尽管这可能是一个品味问题。

谢谢。我还想知道let和define之间的区别。粗略地说,两者之间的区别在于
let
部分的末尾不存在,而
Definition
s存在。因此,您不能在节之外引用由其名称定义的对象。