Recursion 递归和归纳证明之间的关系是什么?

Recursion 递归和归纳证明之间的关系是什么?,recursion,type-theory,induction,Recursion,Type Theory,Induction,递归和归纳证明之间的关系是什么 比如说,fn(n) 递归是fn(n)调用自身,直到满足基本条件 归纳法是当基本条件满足时,尝试证明(基本情况+1)也是正确的 看来递归和归纳是不同的方向。一个从n到基本情况,另一个从基本情况到无限 有人能详细解释一下这个想法吗?递归和归纳几乎是同一回事!如果使用具有依赖类型的编程语言(如Agda),这一点会变得很明显,但在某种程度上也可以在没有依赖类型的情况下进行演示 记住,由于类型不同,类型是命题,程序是证明。当您编写类型为Nat->Nat(我将使用Haskel

递归和归纳证明之间的关系是什么

比如说,
fn(n)

递归是
fn(n)
调用自身,直到满足
基本条件

归纳法是当
基本条件
满足时,尝试证明
(基本情况+1)
也是正确的

看来递归和归纳是不同的方向。一个从
n
基本情况
,另一个从
基本情况
无限


有人能详细解释一下这个想法吗?

递归和归纳几乎是同一回事!如果使用具有依赖类型的编程语言(如Agda),这一点会变得很明显,但在某种程度上也可以在没有依赖类型的情况下进行演示

记住,由于类型不同,类型是命题,程序是证明。当您编写类型为
Nat->Nat
(我将使用Haskell表示法)的函数时,您试图证明,给定一个自然数,您的程序将终止并生成另一个自然数。现在我们可以有这样一个定义:

f 0 = 1
f (1 + n) = n * f n
这既是
f
的递归定义,同时也是其终止的归纳证明

您可以通过以下方式将其作为证据阅读:

让我们证明fx对于任意x终止

  • 基本情况:根据定义,我们有
    f0
    常量,因此它终止
  • 归纳情况:如果我们假设
    fn
    termiates,
    f(1+n)
    也终止(因为它调用的所有函数都终止)
请注意,由于递归不限于递减其计数器的函数,因此归纳也不限于自然数。还有与结构递归相对应的结构归纳法,这两种方法在数学/编程中都非常流行。当试图在更复杂的数据结构(列表/树等)上证明事物/定义函数时,将使用这些方法

现在,解决您对递归/归纳的“方向”的担忧。在这里考虑“需求方向”和“供应方向”是有帮助的。p> 定义递归函数时,需求(方法调用)从较大的值流向基本情况。另一方面,供应(返回值)从基本情况流向参数的较大值。“确定性”是思考供应的另一种方式。它从基本情况开始,并通过递归情况传播到无穷大

现在,当你们做归纳证明时,定理是你们的供给,而目标是你们的需求。你们可以在基本情况下得出一个定理t0,然后用归纳情况改进到任意大的tn:你们的供给从0流向无穷大。现在,如果你有一个目标gn,你可以用归纳步骤从中得到一个更小的目标G(n-k),直到你达到零。这样,您的需求从n变为0

正如你所看到的,在这两种情况下,供给的方向都是“到无穷大”,而需求的方向在这两种情况下都是“到零”

您还可以在不改变归纳和递归含义的情况下颠倒归纳和递归描述中的明显顺序:

归纳法是指当证明pn成立时,你需要首先通过反复应用归纳法将你的目标降低到p0,然后使用基本情况证明最终的目标


类似地,递归是指首先定义基本情况,然后根据前面的值定义进一步的值。看,方向很容易互换