2008-10-30 6 views
0

Évaluer:Qu'est-ce que je fais de mal avec cette évaluation du régime?

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

Voici ce que je faisais:

  • évaluer ((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

    • évaluer 5 -> 5
  • évaluer

    • évaluer 4 -> 4
  • évaluer ((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3)

    • évaluer 3 -> 3
  • (lambda (x) (lambda (y) (lambda (x) (+ x y)))) ->(lambda (x) (lambda (y) (lambda (x) (+ x y))))

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

    • substitut 3 ->x dans (lambda (y) (lambda (x) (+ x y))

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

    • évaluer (lambda (y) (lambda (x) (+ 3 y)) -> (lambda (y) (lambda (x) (+ 3 y))

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

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

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

    • évaluer (lambda (y) (+ 3 4)) -> (lambda (y) (7))

      • subsitute 5 ->?

Et puis je suis coincé.

Répondre

2

Je vous suggère de décomposer ceci en procédures individuelles 'définies'.

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

Tél: (((part2 3) 4) 5) => 9

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

D'abord, cela est faux.Vous ne remplacez pas 3 pour toutes les occurrences de x, seulement pour les gratuits. Le x que vous remplacez ici est lié par l'expression interne de lambda et n'est donc pas libre.

Deuxièmement, il n'y a rien de mal à substituer une valeur à une variable qui n'a jamais utilisé, en remplaçant si 5 pour y en (+ 3 4) est fine et les rendements (+ 3 4).

1

Votre première substitution est erronée; le x en (+ x y) est lié par le plus interne lambda, pas le plus à l'extérieur. Cela signifie que le résultat de cette substitution est juste (lambda (y) (lambda (x) (+ x y))). Le 3 est "perdu". (Peut-être que vous devriez regarder les règles de substitution et de les appliquer étape par étape pour getter une meilleure compréhension de celui-ci.)

Indépendamment de cela, vous finir pouvez toujours appliquer (lambda (y) (7)) (ou (lambda (y) (+ 4 x)) si vous fixez ci-dessus) à 5 pour obtenir 7 (ou (+ 4 5) qui évalue à 9).

Questions connexes