我会立即说出这是一项任务,我不是在寻找答案 - 只是一些方向,因为我已经在这方面工作了很长一段时间了。给定以下尾递归和函数:
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;具体要求它,但我认为我们应该使用它)。此外,我不确定在将元素输出(或插入)函数时,我允许多大程度地使用添加的关联性。
任何帮助表示赞赏!
答案 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
。