これは課題のためだとすぐに言いますが、答えを探しているわけではありません。かなり長い間取り組んできたので、何らかの方向性を求めているだけです。次の末尾再帰合計関数があるとします。
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 にあるため、近づいたように感じますが、より強力なプロパティを実際に証明していないことです (質問では具体的に求められていませんが、私は使用することになっていると思います)。また、関数から要素を取り出す (または要素を挿入する) ときに、加算の結合性をどの程度まで使用できるかわかりません。
どんな助けでも大歓迎です!