是否存在折叠scott编码列表的非递归术语?

时间:2015-06-02 18:59:29

标签: haskell recursion lambda-calculus church-encoding scott-encoding

假设我有一个scott-encoded列表,例如:

scott = (\ c n -> c 1 (\ c n -> c 2 (\ c n -> c 3 (\ c n -> n))))

我想要一个接收这种列表并将其转换为实际列表([1,2,3])的函数,除了这样的函数不能递归。也就是说,它必须是eta-beta正常形式。该功能是否存在?

1 个答案:

答案 0 :(得分:2)

好的,我试了一下。请随意纠正我,因为我不是这方面的专家。

对于任意xxs,必须是toList (\c n -> c x xs)缩减为可转换为x : toList xs的字词的情况。

只有将c x xs应用于某些(\c n -> c x xs)c,我们才能将左侧缩小为n。所以toList ~ (\f -> f ? ?)。 (顺便说一句,这是我无法想到一个严谨的论点的部分;我有一些想法,但没有一点非常好。我很乐意听到提示)。

现在必须是c x xs ~ (x : toList xs)的情况。但由于xxs是不同的通用变量,并且它们是右侧发生的唯一变量,因此等式位于Miller's pattern fragment,因此c ~ (\x xs -> x : toList xs)是其toList最通用的解决方案

因此,对于某些(\f -> f (\x xs -> x : toList xs) n)n必须减少到toList。显然,{{1}}不能具有正常形式,因为我们总是可以展开递归事件。