Functional programming 用coq解释一个简单的操作

Functional programming 用coq解释一个简单的操作,functional-programming,coq,Functional Programming,Coq,我有以下代码, 这里O是字符O而不是0 我只是想知道它是如何计算为2的?我的意思是,它实际上是如何用一个数字进行检查和减法的?我没有在这里减去任何东西,它还在工作吗?我想知道这里的基本思想是什么?当我调用minustwo 4时,coq如何知道它是一个数字,以及它如何返回结果?匹配在这里是如何工作的?使用Coq可以很容易地一步一步地跟踪正在发生的事情。但是在我们做这件事之前,我们需要知道你的程序在没有语法糖分的情况下对Coq来说是什么样子的。为此,请在程序中键入以下内容: Set Printing

我有以下代码, 这里O是字符O而不是0


我只是想知道它是如何计算为2的?我的意思是,它实际上是如何用一个数字进行检查和减法的?我没有在这里减去任何东西,它还在工作吗?我想知道这里的基本思想是什么?当我调用minustwo 4时,coq如何知道它是一个数字,以及它如何返回结果?匹配在这里是如何工作的?

使用Coq可以很容易地一步一步地跟踪正在发生的事情。但是在我们做这件事之前,我们需要知道你的程序在没有语法糖分的情况下对Coq来说是什么样子的。为此,请在程序中键入以下内容:

Set Printing All.
如果现在打印负数2,您将看到

Print minustwo

> match n return nat with
> | O => O
> | S n0 => match n0 return nat with
>           | O => O
>           | S n' => n'
>           end
> end
您的模式匹配实际上分为两个模式匹配

不要让我们一步一步地看Coq是如何评估负2 4的。为此,创建以下定理:

Goal (minustwo 4 = 2).
我们不太关心这个定理本身,我们更关心的是它包含了项minustwo4。现在,我们可以一步一步地简化表达式,您应该在ide中运行它,以实际查看发生了什么

首先,我们使用一种称为cbv delta的策略来展开minustwo的定义

我们现在可以使用战术cbv beta调用该函数

我们现在可以用

cbv iota; cbv beta.  (* pattern match *)
因为科克把比赛分成了两场,我们又得重来一次

cbv iota; cbv beta.  (* pattern match *)
这就是为什么2减4等于2


顺便说一句,模块Playground1内的nat、O、S、pred与模块外的不同。我想你对名称空间感到困惑。嗨,我对COQ很陌生,我对战术一无所知。只是学习基础知识。你有使用函数式编程语言的经验吗?如果不是,我不认为Coq是开始学习的最好的函数式编程语言,只是对于初学者来说没有太多的文档。我建议先学习Haskell的基础知识。例如本教程:谢谢。我正在学习OCAml。我也发现了这一点。
cbv beta.   (* do the function call *)
cbv iota; cbv beta.  (* pattern match *)
cbv iota; cbv beta.  (* pattern match *)
reflexivity.

Qed.