2008-10-30 8 views
0

Оценка:Что я делаю неправильно с этой оценкой схемы?

((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5) 

Это то, что я сделал:

  • оценить ((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

    • оценить 5 -> 5
  • оценить (((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4)

    • оценить 4 -> 4
  • оценить ((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3)

    • оценить 3 -> 3
  • (lambda (x) (lambda (y) (lambda (x) (+ x y)))) ->(lambda (x) (lambda (y) (lambda (x) (+ x y))))

  • применяются (lambda (x) (lambda (y) (lambda (x) (+ x y)))) к 3

    • заменителем 3 ->x в (lambda (y) (lambda (x) (+ x y))

    • (lambda (y) (lambda (x) (+ 3 y))

    • оценить (lambda (y) (lambda (x) (+ 3 y)) -> (lambda (y) (lambda (x) (+ 3 y))

    • apply (lambda (y) (lambda (x) (+ 3 y)) к 4

    • subsitute 4 -> y в (lambda (y) (lambda (x) (+ 3 y))

    • (lambda (y) (+ 3 4))

    • оценить (lambda (y) (+ 3 4)) -> (lambda (y) (7))

      • subsitute 5 ->?

А потом я застрял.

ответ

2

Я предлагаю вам разбить это на индивидуальные «определенные» процедуры.

(define part1 (lambda (y) (lambda (x) (+ x y)))) ; basically an adder 
(define part2 (lambda (x) part1)) ; just return part1, x has no effect 

Позовите (((part2 3) 4) 5) => 9

1
-substitute 3 -> x in (lambda (y) (lambda (x) (+ x y)) 
-(lambda (y) (lambda (x) (+ 3 y)) 

Во-первых, это не так.Вы не подставляете 3 для всех вхождений x, только для бесплатных. x, который вы заменяете здесь, связан внутренним лямбда-выражением и поэтому не является бесплатным.

Во-вторых, нет ничего плохого в том подставляя значение переменной, которая никогда не используется, так что подставляя 5 для y в (+ 3 4) хорошо и дает (+ 3 4).

1

Ваша первая замена неправильная; x в (+ x y) связан самым внутренним lambda, а не внешним. Это означает, что результатом этой замены является только (lambda (y) (lambda (x) (+ x y))). 3 «потерян». (Может быть, вы должны смотреть на правила замены и применять их шаг за шагом, чтобы добытчика лучше понять его.)

Независимо от этого, чтобы закончить еще можно применить (lambda (y) (7)) (или (lambda (y) (+ 4 x)) если зафиксировать выше) 5 для получения 7 (или (+ 4 5), что составляет 9).

 Смежные вопросы

  • Нет связанных вопросов^_^