【发布时间】:2019-03-04 00:50:36
【问题描述】:
我已经在 Lambda 微积分上苦苦挣扎了很长一段时间了。有很多资源可以解释如何减少嵌套的 lambda 表达式,但指导我编写自己的 lambda 表达式的资源较少。
我正在尝试使用纯 lambda 演算(即单参数函数、教堂数字)在 Racket 中编写递归斐波那契解决方案。
这些是我一直使用的教会数字的定义:
(define zero (λ (f) (λ (x) x)))
(define one (λ (f) (λ (x) (f x))))
(define two (λ (f) (λ (x) (f (f x)))))
(define three (λ (f) (λ (x) (f (f (f x))))))
(define four (λ (f) (λ (x) (f (f (f (f x)))))))
(define five (λ (f) (λ (x) (f (f (f (f (f x))))))))
(define six (λ (f) (λ (x) (f (f (f (f (f (f x)))))))))
(define seven (λ (f) (λ (x) (f (f (f (f (f (f (f x))))))))))
(define eight (λ (f) (λ (x) (f (f (f (f (f (f (f (f x)))))))))))
(define nine (λ (f) (λ (x) (f (f (f (f (f (f (f (f (f x))))))))))))
这些是我一直试图合并的单参数函数:
(define succ (λ (n) (λ (f) (λ (x) (f ((n f) x))))))
(define plus (λ (n) (λ (m) ((m succ) n))))
(define mult (λ (n) (λ (m) ((m (plus n)) zero))))
(define TRUE (λ (t) (λ (f) t)))
(define FALSE (λ (t) (λ (f) f)))
(define COND (λ (c) (λ (x) (λ (y) ((c x) y)))))
(define iszero (λ (x) (x ((λ (y) FALSE) TRUE))))
(define pair (λ (m) (λ (n) (λ (b) (((IF b) m) n)))))
(define fst (λ (p) (p TRUE)))
(define snd (λ (p) (p FALSE)))
(define pzero ((pair zero) zero))
(define psucc (λ (n) ((pair (snd n)) (succ (snd n)))))
(define pred (λ (n) (λ (f) (λ (x) (((n (λ (g) (λ (h) (h (g f))))) (λ (u) x))(λ (u) u))))))
(define sub (λ (m) (λ (n) ((n pred) m))))
(define leq (λ (m) (λ (n) (iszero ((sub m) n))))) ;; less than or equal
(define Y ((λ (f) (f f)) (λ (z) (λ (f) (f (λ (x) (((z z) f) x))))))) ;; Y combinator
我首先在 Racket 中编写递归斐波那契:
(define (fib depth)
(if (> depth 1)
(+ (fib (- depth 1)) (fib (- depth 2)))
depth))
但在我的多次尝试中,我一直没有成功使用纯 lambda 演算来编写它。即使是开始也很困难。
(define fib
(λ (x) ((leq x) one)))
我打电话给(例如):
(((fib three) add1) 0)
这至少有效(正确返回零或一教堂),但添加任何超出此范围的内容都会破坏一切。
我对 Racket 非常缺乏经验,而 Lambda 微积分对于一个直到最近才开始使用它的人来说真是令人头疼。
我想了解如何构建这个函数,并将递归与 Y 组合器结合起来。我特别感谢任何代码旁边的解释。让它与 fib(zero) 到 fib(six) 一起工作就足够了,因为我可以担心以后扩展 Church 的定义。
编辑:
我的iszero 函数在我的实现中是一个隐藏的破坏者。这是一个正确的版本,其中包含来自 Alex 的答案的更新布尔值:
(define iszero (λ (x) ((x (λ (y) FALSE)) TRUE)))
(define TRUE (λ (t) (λ (f) (t))))
(define FALSE (λ (t) (λ (f) (f))))
有了这些变化,并结合了 thunk,一切都正常运行了!
【问题讨论】:
标签: lambda racket fibonacci lambda-calculus