Haskell中的结构归纳和归纳假设

时间:2015-01-20 14:05:38

标签: haskell induction

我正在尝试使用结构归纳法使用以下语句证明' 。所有列表 ' 的类型为 [Int] ,所有' m' 属于类型内部

foldl (+) m ns = m + (sum ns)

说明:

sum :: [Int] -> Int         -- summation of an Int list
sum []     = 0              -- s.1
sum (x:xs) = x + (sum xs)   -- s.2

foldl :: (a -> b -> a) -> a -> [b] -> a    -- fold left
foldl _ s []     = s                       -- fl.1
foldl f s (x:xs) = foldl f (f s x) xs      -- fl.2

如果有人可以帮我解决这个问题,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

我们想要证明所有nsmfoldl (+) m ns = m + sum ns。我们将在ns上进行归纳。换句话说,我们证明该属性适用于空列表,并且只要n:ns适用ns,它就会成立。

首先,让我们看一下空列表,让m为任意数字。我们的目标是证明foldl (+) m [] = m + sum []。有很多方法可以做到这一点,但我们将通过等式推理将方程的左侧转换为右侧。

foldl (+) m []  -- by definition of foldl
m               -- by right identity of addition
m + 0           -- by the definition of sum
m + sum []      -- QED

现在针对(:)案例。我们的列表为n:ns。假设任何ns的{​​{1}}属性都存在(这是归纳假设)。我们的目标是证明m。我们再次使用等式推理。

foldl (+) m (n:ns) = m + sum (n:ns)

我们已经完成了。


新学生证明写作的一个常见问题是,他们不确定他们所做的事情是否真的有意义,这让他们感到紧张。我建议您查看AgdaCoq等证明助手。它们非常适合构建校对技巧。作为Agda的一个小例子,上面的证明可以在那里写得非常相似,但有一些句法差异:

foldl (+) m (n:ns)    -- by the definition of foldl
foldl (+) (m + n) ns  -- by the induction hypothesis, applied to (m + n)
(m + n) + sum ns      -- by associativity of addition
m + (n + sum ns)      -- by the definition of sum
m + sum (n:ns)        -- QED