練習問題 4.6.6
⊗ が ⊕ 上で分配律を満たすならば,
foldr1 (⊕) . map (x ⊗) = (x ⊗) . foldr1 (⊕)
であることを証明せよ.
foldr1 (⊕) (map (x ⊗) (y:ys)) = (x ⊗) (foldr1 (⊕) (y:ys)) を ys 上の帰納法で示す.
[] の場合
foldr1 (⊕) (map (x ⊗) (y:[]))
= { map の定義 }
foldr1 (⊕) ((x ⊗ y) : map (x ⊗) [])
= { map の定義 }
foldr1 (⊕) ((x ⊗ y) : [])
= { foldr1 の定義 }
if null [] then x ⊗ y else (x ⊗ y) ⊕ (foldr1 (⊕) [])
= { null [] は真だから }
x ⊗ y
= { foldr1 の定義 }
x ⊗ foldr1 (⊕) (y:[])
z:zs の場合
foldr1 (⊕) (map (x ⊗) (y:z:zs))
= { map の定義 }
foldr1 (⊕) ((x ⊗ y) : map (x ⊗) (z:zs))
= { foldr1 の定義 }
if null (map (x ⊗) (z:zs)) then (x ⊗ y)
else (x ⊗ y) ⊕ foldr1 (⊕) (map (x ⊗) (z:zs))
= { not (null (map (x ⊗) (z:zs))) だから }
(x ⊗ y) ⊕ (foldr1 (⊕) (map (x ⊗) (z:zs)))
= { 帰納法の仮定 }
(x ⊗ y) ⊕ (x ⊗ (foldr1 (⊕) (z:zs)))
= { 分配律 }
x ⊗ (y ⊕ foldr1 (⊕) (z:zs))
= { foldr1 の定義 }
x ⊗ (foldr1 (⊕) (y:z:zs))