【发布时间】:2015-03-25 13:43:45
【问题描述】:
lambda 演算上的 n 元组通常定义为:
1-tuple: λ a t . t a
1-tuple-fst: λ t . t (λ a . a)
2-tuple: λ a b t . t a b
2-tuple-fst: λ t . t (λ a b . a)
2-tuple-snd: λ t . t (λ a b . b)
3-tuple: λ a b c t . t a b c
3-tuple-fst: λ t . t (λ a b c . a)
3-tuple-snd: λ t . t (λ a b c . b)
3-tuple-trd: λ t . t (λ a b c . c)
... and so on.
我的问题是:是否有可能实现一个函数,接收一个教堂号码N 并为任何 N 返回相应的 N 元组?此外,是否可以扩展此函数以便它也返回相应的访问器? 该算法不能使用任何形式的递归,包括定点组合器。
~
编辑:根据要求,详细说明我的尝试。
我希望该功能不依赖于递归/定点组合器,因此,显而易见的方法是使用教堂编号进行重复。话虽如此,我已经尝试随机测试许多表达式,以了解它们是如何成长的。例如:
church_4 (λ a b c . a (b c))
减少到:
(λ a b c d e f . a ((((e d) c) b) a)))))
我比较了许多相似组合 church_4 (λ a b c . (a (b c))) 的减少与我想要的结果,并注意到我可以将访问器实现为:
firstOf = (λ max n . (firstOf (sub max n) (firstOf n)))
access = (λ max idx t . (t (firstOf (sub max idx) (firstOf idx))))
sub 是减法运算符,access church_5 church_2 表示访问 6 元组的第三个(因为 2 是自然的第三个)元素。
现在,关于元组。请注意,问题在于找到一个术语my_term,例如:
church_3 my_term
有以下范式:
(λ a b c d t . ((((t a) b) c) d))
如你所见,我几乎找到了它,因为:
church_3 (λ a b c . a (b c)) (λ a . a)
减少到:
(λ a b c d . (((a b) c) d))
这几乎是我需要的结果,只是缺少t。
这是我迄今为止所尝试的。
【问题讨论】:
-
那么你有什么尝试?你在 Haskell 中对 Church 数字的编码是什么?你将如何在 Haskell 中实现
1-tuple和1-tuple-fst? -
我要问的另一个问题是您想要的最终目标是什么。也许有另一种方法可以做你想做的事,而不必创建广义元组。另外,这些元组随后将如何使用?
-
我错了,这个问题是针对无类型 lambda 的。并不是每个正确的术语都可以被分配一个类型。
-
@amakarov 我认为类型可以在 Calculus of Constructions 或其他相关的 LC-s 中给出。
-
Viclib:是的,请详细说明。
标签: haskell lambda functional-programming lambda-calculus