方案:Beta减少挑战

时间:2015-11-19 20:41:18

标签: lambda functional-programming scheme racket lambda-calculus

我的老师已经给了课堂一些样本考试题目(课程基本上是关于Scheme(球拍)和lambda演算),我遇到了以下问题:

  

定义(β-reduce e),这样,当可以进行β减少时(即,当e具有((λ v e1) e2)形式时,并且没有阻止β减少的自由变量冲突并且首先需要一些α重命名,它返回β减少的结果。否则,它返回#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 ))))

如果有人能帮助我深究这一点,我将非常感激!

1 个答案:

答案 0 :(得分:3)

这不是一个完整的答案,而是试图让你开始。

您需要在var app = angular.module('app', ['ngAnimate', 'ngTouch', 'ui.grid','ui.grid.edit', 'ui.grid.selection', 'ui.grid.rowEdit', 'ui.grid.cellNav']); app.controller('MainCtrl', function($scope) { $scope.gridOptions = { enableSorting: true, columnDefs: [ { field: 'A' }, { field: 'B' }, { field: 'C', enableSorting: false } ], onRegisterApi: function( gridApi ) { $scope.gridApi = gridApi; } }; $scope.gridOptions.data = [{'A':'a1', 'B':'b1', 'C':'c1'}, {'A':'a3', 'B':'b3', 'C':'c3'}, {'A':'a2', 'B':'b2', 'C':'c2'}]; }); 中考虑e1e2的任意表达式。

另一个例子:

((λ v e1) e2)

不要试图将整个事物写成一个重要的功能,将问题分解为可管理的部分。
您可能需要以下内容:

  • 确定表达式是函数应用程序的另一种方法。
  • 一个函数(β-reduce '((λ x (x x)) (λ y y)) ⇒ ((λ y y) (λ y y)) ,它接受​​一个表达式并返回表达式中可用的名称。
  • 一个函数free-variables,它接受​​变量substitute-variable,表达式v和表达式E1,并替换E2v的所有自由出现次数{1}} E1

如果E2(free-variables '(λ v E1))的交集为空,则可以进行替换。

如果您的课程结构合理,您已经编写了这些功能,或者与它们非常相似的功能。

请记住,减少只需要一个步骤" - 您应该只减少最外层的应用程序,如您给出的第一个示例所示。