私は、Coursera での Scala の関数型プログラミングの講義に従っています。ビデオ 5.7 の最後で、Martin Odersky は次の方程式の正しさを帰納法によって証明するよう求めています。
(xs ++ ys) map f = (xs map f) ++ (ys map f)
複数のリストが含まれている場合、帰納法による証明をどのように処理するのですか?
xs が Nil で ys が Nil である基本ケースを確認しました。xs を x::xs に置き換えたときに方程式が成立することを帰納法によって証明しましたが、ys を y::ys に置き換えた方程式もチェックする必要がありますか?
そしてその場合(エクササイズをあまり台無しにすることなく...とにかく採点されません)、どのように処理します(xs ++ (y::ys)) map f
か?
これは、私が同様の例で使用したアプローチであり、
(xs ++ ys).reverse = ys.reverse ++ xs.reverse
証明 (基本ケースと簡単な x::xs ケースを省略):
(xs ++ (y::ys)).reverse
= (xs ++ (List(y) ++ ys)).reverse //y::ys = List(y) ++ ys
= ((xs ++ List(y)) ++ ys).reverse //concat associativity
= ys.reverse ++ (xs ++ List(y)).reverse //by induction hypothesis (proven with x::xs)
= ys.reverse ++ List(y).reverse ++ xs.reverse //by induction hypothesis
= ys.reverse ++ (y::Nil).reverse ++ xs.reverse //List(y) = y :: Nil
= ys.reverse ++ Nil.reverse ++ List(y) ++ xs.reverse //reverse definition
= (ys.reverse ++ List(y)) ++ xs.reverse //reverse on Nil (base case)
= (y :: ys).reverse ++ xs.reverse //reverse definition
これは正しいですか ?