練習問題 4.6.3
foldlに対する融合定理は次のものである.
fが正格関数で
f a = bかつ任意の
x,
yについて
f (g x y)= h (f x) yであるならば,
f . foldl g a = foldl h bである. 帰納法による証明の中で場合
(x:xs)では,
f (foldl g (g a x) xs) = foldl h (h (f a) x) xs
であることを示す必要がある.そのためには2つめの帰納法の仮定,すなわち,任意の
x,
yおよび任意のリスト
zsにおいて,
f (foldl g (g x y) zs) = foldl h (h (f x) y) zs
であることを使う必要がある. この等式を証明し,
foldlに対する融合定理の証明を完成せよ.
任意の
x,
yおよび任意のリスト
zsにおいて,
f (foldl g (g x y) zs) = foldl h (h (f x) y) zs
であることをzs上の帰納法によって示す.
[] の場合
f (foldl g (g x y) [])
= { foldl の定義 }
f (g x y)
= { f (g x y) = h (f x) y だから }
h (f x) y
= { foldl の定義 }
foldl h (h (f x) y) []
z:zs の場合
f (foldl g (g x y) (z:zs))
= { foldl の定義 }
f (foldl g (g (g x y) z) zs)
= { 帰納法の仮定 }
foldl h (h (f (g x y)) z) zs
= { foldl の定義 }
foldl h (f (g x y)) (z:zs)
= { f (g x y) = h (f x) y であるから }
foldl h (h (f x) y) (z:zs)
foldlの融合定理
f は正格,かつ,f a = b,かつ,任意の x,y に対して f (g x y) = h (f x) y ならば,任意のzsに対して
f (foldl g a zs) = foldl h b zs
証明はzs上の帰納法による.
[]の場合
f (foldl g a [])
= { foldl の定義 }
f a
= { f a = b }
b
= { foldl の定義 }
foldl h b []
x:xsの場合
f (foldl g a (x:xs))
= { foldl の定義 }
f (foldl g (g a x) xs)
= { f (foldl g (g x y) zs) = foldl h (h (f x) y) zs であるから }
foldl h (h (f a) x) xs
= { f a = b }
foldl h (h b x) xs
= { foldl の定義 }
foldl h b (x:xs)