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

我的老师给了全班一些考试题样本(课程基本上是关于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 '((λ 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)
的交集为空,则可以使用该替代

如果你的课程有一个合理的结构,你已经写了这些函数,或者类似的东西

请记住,缩减只需要一个“步骤”——您应该只缩减最外层的应用程序,如前面给出的第一个示例所示