结构感应 - (zip xs ys)!! n =(xs !! n,ys !! n)

时间:2017-02-06 08:13:02

标签: haskell induction

给定n >= 0 and n < min (length xs) (length ys) 显示(zip xs ys)!!n = (xs!!n, ys!!n)结构感应超过xs。

甚至可以以干净的方式做到这一点吗?我无法找到可以使用Induction Hypothesis的任何地方。

1 个答案:

答案 0 :(得分:1)

首先,我将给出zip!!的定义:

zip :: [a] -> [b] -> [(a,b)]
zip [] [] = []                             -- (zip-1)
zip (x:xs) (y:ys) = (x,y) : zip xs ys      -- (zip-2)
zip _ _ = []                               -- (zip-3)

(!!) :: [a] -> Int -> a
(x : _) !! 0 = x                           -- (!!-1)
(_ : xs) !! n = xs !! (n - 1)              -- (!!-2)

让xs,ys和n任意。现在,假设n >=0n < min (length xs) (length ys)。我们在xs上进行了归纳。

  • 案例xs = []。现在我们对ys进行案例分析。在这两种情况下,我们都认为没有n >=0n < min (length xs) (length ys)。所以,这个案子很简单。
  • 案例xs = x : xs'。我们继续ys的案例分析。
  • 案例xs = x : xs'ys = []。同样,我们的定理很简单,因为没有nn >=0n < min (length xs) (length ys)
  • 案例xs = x : xs'ys = y : ys'。现在我们对n进行案例分析。
  • 案例xs = x : xs'ys = y : ys'n = 0。我们有那个

    zip (x : xs') (y : ys') !! 0 = {by equation (zip-2)}
    (x,y) : zip xs' ys'     !! 0 = {by equation (!!-1)}
    (x,y)                        = {by equation (!!-1) - backwards}
    ((x : xs') !! 0, (y : ys') !! 0).
    
  • 案例xs = x : xs'ys = y : ys'n = n' + 1

     zip (x : xs') (y : ys') !! (n + 1) = {by equation zip-2}
     (x,y) : zip xs' ys' !! (n + 1) = {by equation (!!-2)}
     zip xs' ys' !! n               = {by induction hypothesis}
     (xs' !! n , ys' !! n)          = {by equation (!!-2) backwards}
     ((x : xs') !! (n + 1), (y : ys') !! (n + 1))
    

    QED

希望这会有所帮助。