Недавно у меня была копия "Основы языков программирования", второе издание. На странице 29 книга представляет следующую грамматическую схему для лямбда-исчисления со вкусом схемы:
<expression> ::= <identifier>
::= (lambda (<identifier>) <expression>)
::= (<expression> <expression>)
Затем вводится определение (определение 1.3.3, стр. 31) свободных и связанных переменных, которое гласит:
A variable x occurs free in a lambda calculus expression E if and only if
1. E is a variable reference and E is the same as x; or
2. E is of the form (lambda (y) E'), where y is different from x and x occurs free in E'; or
3. E is of the form (E1 E2) and x occurs free in E1 or E2.
A variable x occurs bound in a lambda calculus expression E if and only if
1. E is of the form (lambda (y) E'), where x occurs bound in E' or x and y are the same variable and y occurs free in E'; or
2. E is of the form (E1 E2) and x occurs bound in E1 or E2.
Такое определение затем легко трансформируется в две процедуры Scheme, называемые соответственно occurs-free?
и occurs-bound?
:
(define occurs-free?
(lambda (var exp)
(cond
((symbol? exp) (eqv? exp var))
((eqv? (car exp) 'lambda)
(and (not (eqv? (caadr exp) var))
(occurs-free? var (caddr exp))))
(else (or (occurs-free? var (car exp))
(occurs-free? var (cadr exp)))))))
(define occurs-bound?
(lambda (var exp)
(cond
((symbol? exp) #f)
((eqv? (car exp) 'lambda)
(or (occurs-bound? var (caddr exp))
(and (eqv? (caadr exp) var)
(occurs-free? var (caddr exp)))))
(else (or (occurs-bound? var (car exp))
(occurs-bound? var (cadr exp)))))))
Можно ожидать, что occurs-bound?
вернет #t
, когда комбинаторы (т.е. процедуры, состоящие только из связанных переменных) будут поданы в качестве входных данных. Однако тест для комбинатора K не пройден:
> (occurs-bound? 'x '(lambda (c) (lambda (x) c)))
#f
Это связано с тем, что пункт 1. в определении связанных переменных гласит, что для привязки переменной она должна быть количественно определена в лямбда-выражении, а затем появиться свободной в своем теле. Поскольку x
игнорируется в теле внутренней лямбды, тест возвращает false.
Очевидно, что occurs-bound?
не представлено в третьем издании, поэтому невозможно провести какое-либо сравнение с самым последним изданием книги.
Является ли приведенное выше определение ошибочным или я что-то упустил? Вот ответ для кода .
Спасибо