Haskell 如何检查生成无限列表的函数的实现?

Haskell 如何检查生成无限列表的函数的实现?,haskell,template-haskell,Haskell,Template Haskell,编写一个函数,该函数接受函数f和数字n,并返回列表[fn,f(n+1),f(n+2),f(n+3),f(n+4)] 以下是我的解决方案: func f n = f n : func f (n+1) 但我不确定这是否正确。如何检查我的执行情况?您可以提供一个共感应证明。共归纳推理类似于归纳推理,但它允许“无限”结构。对于像数据流和无限列表这样的事情,这是一个自然的选择 您希望func拥有的属性类似于 ∀ f:Int->a,∀ n:Int,∀ i:Int,(i>=0)⟹ (func f n)!!i

编写一个函数,该函数接受函数
f
和数字
n
,并返回列表
[fn,f(n+1),f(n+2),f(n+3),f(n+4)]

以下是我的解决方案:

func f n = f n : func f (n+1)

但我不确定这是否正确。如何检查我的执行情况?

您可以提供一个共感应证明。共归纳推理类似于归纳推理,但它允许“无限”结构。对于像数据流和无限列表这样的事情,这是一个自然的选择

您希望
func
拥有的属性类似于

∀ f:Int->a,∀ n:Int,∀ i:Int,(i>=0)⟹ (func f n)!!i==f(n+i))
用共归纳法证明某事物类似于归纳法:假设它是所有子结构的共归纳假设,然后用上层结构证明它。由于
func
只有一个定义,因此只有这样的证明义务

这意味着,如果你能证明

∀ f : Int -> a, ∀ n : Int, ∀ i : Int, (i ≥ 0 ⟹ (func f n) !! i == f (n + i))
⟹
∀ f : Int -> a, ∀ n : Int, ∀ i : Int, (i ≥ 0 ⟹ (f n : (func f (n + 1))) !! i == f (n + i))
然后你会证明你的函数定义是正确的


由于您实际上可以证明上述语句,因此您的函数定义是正确的。

在生成无限列表时,您可以使用
take
检查不同长度的有限前缀。例如,
是否需要5(func(+1)3)=[4,5,6,7,8]
?@Silver我相信您的解决方案是正确的(尽管我认为您有一个拼写错误-您在函数体中编写了
funk
,而不是
func
)。但正如@chepner所说,您可能应该使用
take
测试您的函数。谢谢,我更正了一个输入错误。至于“take”,我记下了这张纸条。你的意见对我很重要。写这篇文章的另一种方法是
mapf[n..]
。您可以测试的一个属性是:
take k(drop m(func f n))==take k(func f(n+m))
:第一个
k
元素应该是相同的,无论您是从
n+m
开始还是从
n
开始并跳过
m
元素。