haskell(制定并证明基础案例和归纳步骤)

时间:2015-04-20 17:38:59

标签: haskell

我对haskell有一些了解,但需要支持来制定和证明基础案例和归纳步骤。

用户定义的Haskell函数

addtoall :: Int -> [Int] -> [Int]
下面定义的

,为整数列表的每个条目添加一个指定的数字(第一个参数ofaddtoall)。

addtoall :: Int -> [Int] -> [Int]
addtoall n [] = [] -- a.0
addtoall n (x:xs) = (x + n) : (addtoall n xs) -- a.1

以下举例说明了其行为 addtoall:

Exam> addtoall 3 [7,2,9,12]
[10,5,12,15]

查看此处显示的交互式会话。

Exam>
addtoall 3 [7,2,9,12]
[10,5,12,15]

Exam>
addtoall 2 [10,5,12,15]
[12,7,14,17]

Exam>
addtoall 2 (addtoall 3 [7,2,9,12]
[12,7,14,17]

基于此,怀疑对于所有类型的有限列表xs [Int]和Int类型的所有数字m和n

addtoall m (addtoall n xs) = addtoall (m + n) xs

通过xs上的结构感应证明此声明。它应该分两步进行

a)制定并证明基本情况 b)制定并证明归纳步骤

1 个答案:

答案 0 :(得分:3)

因为这显然是某种功课,我只会告诉你一个开始。

所以你应该使用结构归纳 - 你在这里唯一的结构是列表的结构(练习甚至告诉你);)所以基本情况将是[] - 什么是归纳情况?

现在你必须为两种情况证明这一点。

怎么做

要使用xs上的结构归纳来证明这一点,您必须证明两种情况:

  • 基本情况xs := []
  • 带有xs := y:ys
  • 归纳案例

在这两种情况下,最简单的方法是在左侧和右侧工作以查看两者是否最终相等(如果您知道如何在左侧工作并将其更改为右侧) - 始终使用函数定义和你从手头的案例中得到的信息。

例如在归纳案例中,您不仅拥有xs = y:ys,还可以使用

addtoall m (addtoall n ys) = addtoall (m+n) ys (Ind)

基本情况

所以首先简单地将两面朝下并用定义::

按摩它们

左:

addtoall m (addtoall n [])
{ a.0 }
= addtoall m []
{ a.0 }
= []

右:

addtoall (m+n) []
{ a.0 }
= []
显然双方都是平等的,你证明了第一部分。

不要考虑归纳案例(提示:你肯定需要a.1并且必须以某种方式使用归纳法)并尝试它...它应该不难 - 你基本上只有重写你已经拥有的东西,然后玩评估者

归纳案例

请使用此模板试用:

左:

addtoall m (addtoall n (y:ys))
{ a.1 - inner }
= addtoall m ((y+n) : addtoall n ys)
{ a.1 - outer }
= ((y+n)+m) : addtoall m (addtoall n ys)
{ Ind }
= ((y+n)+m) : addtoall (m+n) ys
{ arithm }
= (y+(m+n)) : addtoall (m+n) ys

右:

addtoall (m+n) (y:ys)
{ a.1 }
(y+(m+n)) : addtoall (m+n) ys

记住到底你应该看到同样的事情

备注

  • 我认为你在那里做了正确的事情,但你应该真正添加所需的步骤(但你的解决方案看起来像你想要左右看到的东西 - 所以努力吧)
  • 通常你会在归纳案例中写x:xs但我想确保你尝试这些步骤 - 我也担心你可能会错过解释xs:=x:xs;)

外部链接