我正在阅读这本名为“与Haskell一起思考功能”的书。理查德伯德,并遇到了 Chain Complete 关于无限列表归纳的概念。 它说:
如果xs0,xs1,...是具有极限xs的部分列表序列,并且P(xsn)对所有n成立,则P(xs)也成立,则属性P称为链完成。
作为连锁完整财产的一个例子,它说:
所有方程式e1 = e2,其中e1和e2是涉及普遍量化的自由变量的Haskell表达式,是链完整的。
我很难理解这个例子如何适合链完成的属性。并且它还表明不等式e1 = / = e2不一定是链完整的。如何根据 Chain Complete -ness?
了解这些属性顺便说一下,这可能不一定是关于Haskell的问题,而是数学方面的问题。
答案 0 :(得分:6)
这是一个例子。
假设您的列表xs_1, xs_2, ...
的序列越来越多,且限制为xs
。
对于每个k
,我们都map id xs_k
等于xs_k
。
通过链完整性(AKA Scott连续性),我们得到map id xs
为xs
。
这为我们提供了一种方法来证明限制列表xs
上的属性,这些属性可能是无限的,只能通过它们的近似值xs_k
进行验证。
这里的直觉是,要使xs
成为限制列表,每个xs_k
必须等于xs
或x1:x2:...:xn:undefined
形式的一些较短前缀。注意未定义的尾部,表示循环计算(例如无限递归)。因此,如果我们比较f xs_k
和f xs
,我们发现后者必须至少与前者一样终止。这里的一般想法是,如果我们传递更多或定义的输入,我们得到更多或定义的输出。在数学上,这个概念是通过斯科特命令的单调性捕获的。
f xs
与序列f xs_k
的限制完全相同。最终结果用近似值f
的结果近似。粗略地说,您可以通过使输入收敛来使输出收敛。
不平等不能以完整的方式运作。实际上,将xs = [0..]
作为无限列表,并将近似值xs_k = 0:...:k:undefined
。很明显,对于每个xs_k
,xs
不等于k
。但是我们没有采用不等式的限制,这表明xs
不等于xs
。
结论,这里的主题非常广泛。如果你有兴趣,我建议你阅读有关指称语义的内容,例如阅读Winskel的书。