列表上的归纳 - 证明更强的财产(Haskell)

时间:2016-08-27 10:24:53

标签: haskell recursion induction equational-reasoning

我会立即说出这是一项任务,我不是在寻找答案 - 只是一些方向,因为我已经在这方面工作了很长一段时间了。给定以下尾递归和函数:

sumTR [ ] acc = acc  
sumTR (x:xs) acc = sumTR xs (x + acc)  

我们必须通过归纳证明:

sumTR xs (sumTR ys acc) = sumTR (ys ++ xs) acc  

在证明基本情况(引入xs并将ys视为常数)之后,我到达了:

sumTR x:xs(sumTR ys acc) = ... = sumTR xs (x + sumTR ys acc)  
sumTR (ys ++ x:xs) acc = ... = sumTR xs (sumTR ys (x + acc))

我们的讲师经历了一个更简单的例子(sum1 xs = sum2 xs,其中sum1是简单的递归),当他达到你无法使它们更相似的程度时,他证明了这一点。更强的财产',注意像sum2 xs acc = acc + xs之和。然后他设置了一个涉及所有acc'的归纳假设,然后在之后设置acc为0。

我遇到的主要问题是acc已经在LHS和RHS,所以我觉得我已经接近了,但我并没有真正证明一个更强大的财产(这个问题没有& #39;具体要求它,但我认为我们应该使用它)。此外,我不确定在将元素输出(或插入)函数时,我允许多大程度地使用添加的关联性。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:4)

ys上进行归纳要容易得多,从那时起为空ys,我们有

sumTR xs (sumTR [] acc) =  -- by first case of (inner) sumTR
sumTR xs acc =             -- by definition of (++)
sumTR ([] ++ xs) acc       -- Q.E.D.

y:ys,我们有

sumTR xs (sumTR (y:ys) acc) =    -- by second case of (inner) sumTR
sumTR xs (sumTR ys (y + acc)) =  -- by induction
sumTR (ys ++ xs) (y + acc) =     -- by second case of sumTR, "in reverse"
sumTR (y:(ys ++ xs)) acc =       -- by definition of (++)
sumTR ((y:ys) ++ xs) acc         -- Q.E.D.

使用ys帮助了我们,因为(++)是通过左手参数的递归来定义的,在这种情况下是ys