Что я делаю не так с этой оценкой Схемы?

Оценивать:

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

Вот что я сделал:

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

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

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

    • evaluate 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)) to 4

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

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

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

      • subsitute 5 -> ?

И тогда я застрял.


person dave    schedule 30.10.2008    source источник


Ответы (3)


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

(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

person leppie    schedule 30.10.2008

-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).

person Matthias Benkard    schedule 30.10.2008

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

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

person mweerden    schedule 30.10.2008