熟悉的Fibonacci函数的Haskell实现
fibSlow n
| n == 0 = 1 --fib.1
| n == 1 = 1 --fib.2
| otherwise = fibSlow(n-1) + fibSlow(n-2) --fib.3
fibSlow正确性的归纳证明是什么?
答案 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一书中的一些手续。