1
我會馬上說出這是一個任務,我不是在尋找答案 - 只是某個方向,因爲我一直在爲它現在有一段時間了。給出下面的尾遞歸總和函數:列表中的歸納 - 證明更強的屬性(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是簡單而又重複的),當他到達的地步,你不能讓他們更多的相似,他證明通過記下sum2 xs acc = acc + xs的總和這樣的「更強的屬性」。然後,他設置了一個歸納假設,涉及'for all acc',然後在以後設置爲0。
我遇到的主要問題是acc已經在LHS和RHS上,所以我覺得我已經接近了,但是我並沒有真正證明它是一個更強大的屬性(問題並沒有要求它具體而言,但我認爲我們應該使用它)。此外,我不確定在將元素取出(或將其插入)函數時,我可以使用多少的添加關聯性。
任何幫助表示讚賞!
爲什麼通過'ys'而不是'xs'進行歸納來寫這個證明更容易,因爲'++'是通過它的第一個參數遞歸定義的:'(++)(x:xs) ys = x:xs ++ ys',所以'y:ys ++ xs'平凡等於'y:(ys ++ xs)',而'ys ++(x:xs)'不能被簡單地簡化。 – user2407038