列表归纳 - 证明更强 属性 (Haskell)

Induction on lists - Proving Stronger Property (Haskell)

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

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 是简单的递归),当他达到不能让它们更相似的地步时,他证明了 'stronger property',注意像 sum2 xs acc = acc + sum of xs 这样的东西。然后他设置了一个涉及 'for all acc' 的归纳假设,然后将 acc 设置为 0。

我遇到的主要问题是 acc 已经在左轴和右轴上了,所以我觉得我已经接近了,但我并没有真正证明更强大 属性(这个问题没有‘具体要求它,但我认为我们应该使用它)。此外,我不确定在将元素取出(或插入)函数时,我可以在多大程度上使用加法的关联性。

感谢任何帮助!

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