2001.12.17 小テストの解答例

問題

任意のリスト xs と ys について、
   rev (xs ++ ys) = (rev ys) ++ (rev xs)
が成立することを帰納法を用いて証明せよ。ここで、
   [] ++ xs = xs                  (1)
   (y:ys) ++ xs = y:(ys ++ xs)    (2)
   rev [] = []                    (3)
   rev (x:xs) = (rev xs) ++ [x]   (4)

解答例

まず、次の二つの補題を証明する。
   補題A    ∀xs:[a], Q(xs)
      ここで Q(xs)は、xs ++ [] = xs
   補題B    ∀xs:[a], R(xs)
      ここで R(xs)は、∀ys,zs :[a] (xs ++ ys) ++ zs = xs ++ (ys ++ zs)

補題Aの証明
   Base) Q([])を示す。
         左辺 = [] ++ []
              = []              by (1)
              = 右辺
   Ind)  Q(x:xs)を示す。
         左辺 = (x:xs) ++ []
              = x:(xs ++ [])    by (2)
              = x:xs            by I.H. Q(xs)
              = 右辺
補題Bの証明
   Base) R([])を示す。
         左辺 = ([] ++ ys) ++ zs
              = ys ++ zs         by (1)
              = [] ++ (ys ++ zs) by (1)
              = 右辺
   Ind)  R(x:xs)を示す。
         左辺 = ((x:xs) ++ ys) ++ zs
              = (x:(xs ++ ys)) ++ zs  by (2)
              = x:((xs ++ ys) ++ zs)  by (2)
              = x:(xs ++ (ys ++ zs))  by I.H. R(xs)
              = (x:xs) ++ (ys ++ zs)  by (2)
              = 右辺
問題の証明
   Base) P([])を示す。
         左辺 = rev([] ++ ys)
              = rev ys                by (1)
              = (rev ys) ++ []        by 補題A
              = (rev ys) ++ (rev [])  by (3)
              = 右辺
   Ind)  P(x:xs)を示す。
         左辺 = rev ((x:xs) ++ ys)
              = rev (x:(xs ++ ys))             by (2)
              = (rev (xs ++ ys)) ++ [x]        by (4)
              = ((rev ys) ++ (rev xs)) ++ [x]  by I.H. P(xs)
              = (rev ys) ++ ((rev xs) ++ [x])  by 補題B
              = (rev ys) ++ (rev (x:xs))       by (4)
              = 右辺

Last modified: Dec.21 2001.