斐波纳契函数正确性的归纳证明

时间:2011-07-08 02:53:20

标签: haskell

熟悉的Fibonacci函数的Haskell实现

fibSlow n

| n == 0 = 1 --fib.1

| n == 1 = 1 --fib.2

| otherwise = fibSlow(n-1) + fibSlow(n-2) --fib.3

fibSlow正确性的归纳证明是什么?

2 个答案:

答案 0 :(得分:6)

为了通过归纳证明函数对自然数的正确性,你会证明它对于某些基本情况是正确的,然后假定它对于较低的参数值是正确的,它对于参数的较高值是正确的。因此,您首先验证fibSlow 0 = 1,然后验证fibSlow 1 = 1,然后验证n> 1,fibSlow n等于第(n-1)个斐波那契数加上第(n-2)个斐波纳契数。在这里,您可以假设这些数字是fibSlow (n-1)fibSlow (n-2),因为fibSlow对于归纳假设所有小于n的输入都是正确的。

这似乎相当微不足道......因为它是!在Haskell中这样一个例子的重点是你可以编写明显正确的代码。当你去证明它是正确的时,证据就是自己编写并等于查看代码,并指出它清楚地说明了你要证明的内容。这是像Haskell这样的声明性语言的一个很好的属性。

答案 1 :(得分:0)

道歉我暂时没有正式看到这种材料,所以如果这是家庭作业,你可能最好看其他来源。

我想你想要显示一个单调函数的存在,它描述了递归的“进展”。这种情况应该很简单:论证本身是单调递减的。对于非负n,递归调用将使用较小的n'进行,并且n'将永远不会小于零。

您还可以使用电源感应来证明函数是在所有 n 上定义的。你已声明它在0和1上定义,并且只要它在 n n + 1 上定义就足够了,那么它就在 n + 2上定义了。递归调用的定义很明显。

我想你可以在普通章节中阅读Jech's Set Theory一书中的一些手续。