練習問題 4.3.4

map f (xs++ys) = map f xs ++ map f ys
を証明し,それを使って,
map f . concat = concat . map (map f)
を証明せよ.



map f (xs++ys) = map f xs ++ map f ys
の証明


xs上の帰納法.

[]の場合
    map f ([]++ys)
=       { ++ の定義 }
    map f ys
=       { ++ の定義 }
    [] ++ map f ys
=       { map の定義 }
    map f [] ++ map f ys

x:xs の場合
    map f ((x:xs) ++ ys)
=       { ++ の定義 }
    map f (x:(xs ++ ys))
=       { map の定義 }
    f x : map (xs ++ ys)
=       { 帰納法の仮定 }
    f x : (map f xs ++ map f ys)
=       { ++ の定義 }
    (f x : map f xs) ++ map f ys
=       { map の定義 }
    map f (x:xs) ++ map f ys
任意のxsに対して
map f (concat xs) = concat (map (map f) xs)
を xs 上の帰納法を用いて証明する.


⊥の場合
    map f (concat ⊥)
=       { concatの定義,場合の枯渇 }
    map f ⊥
=       { mapの定義,場合の枯渇 }
    ⊥
=       { concatの定義,場合の枯渇 }
    concat ⊥
=       { mapの定義,場合の枯渇 }
    concat (map (map f) ⊥)

[]の場合
    map f (concat [])
=       { concat の定義 }
    map f []
=       { map の定義 }
    []
=       { cocnat の定義 }
    concat []
=       { mapの定義 }
    concat (map (map f) [])

xs:xss の場合
    map f (concat (xs:xss))
=       { concat の定義 }
    map f (xs ++ concat xss)
=       { map f (xs++ys) = map f xs ++ map f ys だから }
    map f xs ++ map f (concat xss)
=       { 帰納法の仮定 }
    map f xs ++ concat (map (map f) xss)
=      { concat の定義 }
    concat  (map f xs : map (map f) xss)
=      { map の定義 }
    concat (map (map f) (xs:xss))