我对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)制定并证明归纳步骤
答案 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
;)