2008-10-30 65 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

    • 替補多4 -> y(lambda (y) (lambda (x) (+ 3 y))

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

    • 評估(lambda (y) (+ 3 4)) -> (lambda (y) (7))

      • 替補多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)) 

首先,這是錯誤的。對於所有出現的x,您都不能用3替代,只有免費的。您在這裏替換的x受內部lambda表達式的約束,因此不是免費的。

第二,有什麼不對替代,但從不使用的變量的值,所以在(+ 3 4)y5被罰款和產量(+ 3 4)

1

您的第一個替換是錯誤的; in (+ x y)受最內層lambda的約束,而不是最外層。這意味着替換的結果只是(lambda (y) (lambda (x) (+ x y)))3是「丟失」。 (也許你應該尋找了替代規則並應用它們一步步吸氣劑的一個更好的把握。)

不管這個,才能完成,你仍然可以申請(lambda (y) (7))(或(lambda (y) (+ 4 x))如果您解決以上),以5得到7(或(+ 4 5),其計算結果爲9)。