Lambda 计划:减少测试版挑战
我的老师给了全班一些考试题样本(课程基本上是关于Scheme(Racket)和lambda微积分),我遇到了以下问题: 定义Lambda 计划:减少测试版挑战,lambda,functional-programming,scheme,racket,lambda-calculus,Lambda,Functional Programming,Scheme,Racket,Lambda Calculus,我的老师给了全班一些考试题样本(课程基本上是关于Scheme(Racket)和lambda微积分),我遇到了以下问题: 定义(β-reduce e)以便,当β-reduce是可能的时(即e的形式为((λv e1)e2),并且不存在阻止β-reduce的自由变量冲突,并且需要先进行一些α-rename),它返回β-reduce的结果。否则,它将返回#f 例如: (β-reduce '((λ x (((λ x (x y)) x) (x b))) z)) ⇒ (((λ x (x y)) z) (z b
(β-reduce e)
以便,当β-reduce是可能的时(即e
的形式为((λv e1)e2)
,并且不存在阻止β-reduce的自由变量冲突,并且需要先进行一些α-rename),它返回β-reduce的结果。否则,它将返回#f
例如:
(β-reduce '((λ x (((λ x (x y)) x) (x b))) z)) ⇒ (((λ x (x y)) z) (z b))
(β-reduce '((λ x (((λ y (x y)) x) (x b))) y)) ⇒ #f
我还没走多远(至少可以说)。我开始想我应该在((λx(x))y)
的形式中寻找一些东西,因为那时我需要做beta缩减,但是我一直在想如何用y
替换内部表达式,如果有更多的子表达式,那么在内部递归。另外,我真的不确定何时返回#f
以下是我得到的:
(define beta-reduce
(lambda (e)
(cond
((and (equal? 'lambda (caar e)) (symbol? (last e)))
replace inner bound variable and recurse ))))
如果有人能帮我弄清真相,我将非常感激 这不是一个完整的答案,而是试图让你开始 您需要考虑<代码> E1 和<代码> E2<代码> > <代码>((SV V E1)E2)< /代码> ./P> 另一个例子:
(β-reduce '((λ x (x x)) (λ y y)) ⇒ ((λ y y) (λ y y))
不要试图把整个事情写成一个大函数,把问题分解成可管理的部分。您可能需要以下内容:
- 确定表达式是函数应用程序的另一种方法
- 一个函数
,它接受一个表达式并返回表达式中自由出现的名称free variables
- 一种函数
,它接受变量替换变量
、表达式v
和表达式E1
,并用E2
替换E2
中所有自由出现的E1
v
(自由变量’(λve1))
和(自由变量E2)
的交集为空,则可以使用该替代
如果你的课程有一个合理的结构,你已经写了这些函数,或者类似的东西
请记住,缩减只需要一个“步骤”——您应该只缩减最外层的应用程序,如前面给出的第一个示例所示