构造演算中的递归

标签 recursion functional-programming coq lambda-calculus

如何在(纯)calculus of constructions中定义递归函数?我在那里没有看到任何定点组合器。

最佳答案

CS stack exchange中的人也许能够提供更多见解,但这是一次尝试。

归纳数据类型在结构演算中定义为 Church encoding :数据类型是其折叠函数的类型。最基本的例子是自然数,其定义如下,使用类似 Coq 的表示法:

nat := forall (T : Type), T -> (T -> T) -> T

此编码产生两件事:(1) 用于构造自然数的术语 zero : natsucc : nat -> nat,以及 (2) 运算符 nat_rec 用于编写递归函数。

zero : nat
zero T x f := x

succ : nat -> nat
succ n T x f := f (n T x f)

nat_rec : forall T, T -> (T -> T) -> nat -> T
nat_rec T x f n := n T x f

如果我们对项 x : Tf : T -> T 提出 F := nat_rec T x f,我们会看到以下方程有效:

F zero = x
F (succ n) = f (F n)

因此,nat_rec 允许我们通过指定基本情况的返回值 x 和要处理的函数 f 来定义递归函数递归调用的值。请注意,这不允许我们在自然数上定义任意递归函数,而只能定义那些对其参数的前驱执行递归调用的函数。允许任意递归将为部分函数打开大门,这将损害微积分的可靠性。

这个例子可以推广到其他归纳数据类型。例如,我们可以将自然数列表的类型定义为其右折叠函数的类型:

list_nat := forall T, T -> (nat -> T -> T) -> T

关于构造演算中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53195843/

相关文章:

monads - 在 Coq 中证明延续传递式 Monad

C 代码 : Passing expression as an argument in recursion call

c++ - 递归算法对数组中每个值小于 x 的元素求和

scala - 过滤 Scala Multimap 并输出为元组列表

java - 如何正确理解RxJava的groupBy行为?

functional-programming - 列表 OCaml 的第一个和最后一个元素

coq - `auto` 如何与条件(if)交互

python - 二叉树获取每个级别的所有节点

java - 递归回溯问题 - 数独求解示例

string - Coq 中字符的单引号表示法?