2010-06-20 23 views
3

Je suis coincé à l'étape suivante. Il sera grand si quelqu'un peut me aider:Chiffre d'église pour l'addition

2 = λfx.f(f x) 
3 = λfx.f(f(f x)) 
ADD = λm n f x. m f (n f x) 

Mes pas sont:

(λm n f x. m f (n f x)) (λf x.f(f(f x))) (λf x.f(f x)) 
-> ((λn f x. (λf x.f(f(f x))) f (n f x))) (λf x.f(f x)) 
-> ((λf x. (λf' x'.f'(f'(f' x'))) f ((λf" x".f"(f" x")) f x) 

Est-ce la fin de parenthèse? Je me trompe vraiment sur les substitutions et les parenthèses. Existe-t-il une technique formelle et plus facile pour résoudre ces problèmes?

Répondre

8

Essayez Alligator Eggs!

Voici mes pas, que je Dérivée à l'aide d'alligator œufs:

ADD 2 3 
-> (λm n f x. m f (n f x)) (λf x.f(f(f x))) (λf x.f(f x)) 
-> (λn f x. (λf x.f(f(f x))) f (n f x)) (λf x.f(f x)) 
->  (λf x. (λf x.f(f(f x))) f ((λf x.f(f x)) f x)) 
->  (λf x. (λx.f(f(f x))) ((λf x.f(f x)) f x)) 
->  (λf x.  f(f(f(λf x.f(f x)) f x))))) 
->  (λf x.  f(f(f (λx.f(f x)) x))))) 
->  (λf x.  f(f(f  (f(f x)) ))))) 
+0

+1 Ce fait ma journée, merci! –

+0

merci beaucoup. Franchement, je n'ai pas compris comment aller avec les œufs d'Alligator! –

+0

J'ai par le passé trébuché sur ces alligators, mais cela m'a semblé comme des freakings de quelque fou. Bien que je connaisse très bien Lambda Calculus, je ne pouvais pas comprendre ce que ces alligators avaient à faire avec cela et comment cela pourrait-il aider à l'interpréter: -P Donc, mon opinion personnelle est que ça aide beaucoup à comprendre le LC, mais introduit confusion supplémentaire. – SasQ

0

Y at-il une technique formelle, plus facile à résoudre ces problèmes?

Il est beaucoup plus facile d'écrire un réducteur et prettyprinter pour les termes lambda que de faire des réductions à la main. Mais PLT Redex peut vous donner une longueur d'avance sur les réductions; essayez de définir des règles pour la réduction d'ordre normal, et tout ce que vous avez à faire est de vous soucier de prettyprinting the results with no redundant parentheses.

Vous apprendrez probablement beaucoup plus, aussi.

0

Mon conseil, de ma propre expérience limitée mais récente:

  1. Est-ce une chose à la fois: effectuer une conversion alpha, une réduction de bêta ou une conversion eta. Notez dans la marge de la page que vous travaillez sur ce que vous avez fait pour atteindre la ligne suivante. Si ces mots ne vous sont pas familiers, ce qu'ils font sera - jetez un coup d'oeil sur Wikipedia.

Un résumé rapide de ces étapes de réduction:

Alpha signifie simplement changer les noms des variables dans un contexte toujours:

λfx. f (f x) => λgx. g (g x)

Beta signifie simplement appliquer le lambda à un argument

(λf x. f x) b => λx. b x

Eta est simplement «déballer» une fonction inutilement enveloppée qui ne change pas sa signification.

λx.f x => f

Puis

  1. Utilisez beaucoup de conversion alpha pour modifier les noms des variables pour rendre les choses plus claires. Tous ces f s, ça va toujours être déroutant.Vous avez fait quelque chose de similaire avec le " sur votre deuxième ligne

  2. Imaginez que vous êtes un calcul! Ne pas sauter en avant ou sauter une étape lorsque vous évaluez une expression. Fais juste la prochaine chose (et une seule chose). Ne vous déplacez plus vite qu'une fois que vous êtes sûr de vous déplacer lentement. Envisagez de nommer certaines expressions et de ne leur substituer que des expressions lambda lorsque vous devez les évaluer. Je note habituellement la substitution dans la marge de la page comme by def car ce n'est pas vraiment une étape de réduction. Quelque chose comme:

    add two three 
    (λm n f x. m f (n f x)) two three | by def 
    

Ainsi, en suivant les règles ci-dessus, voici mon exemple travaillé:

two = λfx. f (f x) 
three = λfx. f (f (f x)) 
add = λmnfx. m f (n f x) 

0 | add two three 
1 | (λm n f x. m f (n f x)) two three   | by def 
2 | (λn f x. two f (n f x)) three    | beta 
3 | (λf x. two f (three f x))     | beta 
4 | (λf x. two f ((λfx. f (f (f x))) f x))  | by def 
5 | (λf x. two f ((λgy. g (g (g y))) f x))  | alpha 
6 | (λf x. two f ((λy. f (f (f y))) x))   | beta 
7 | (λf x. two f (f (f (f x))))     | beta 
8 | (λf x. (λfx. f (f x)) f (f (f (f x))))  | by def 
9 | (λf x. (λgy. g (g y)) f (f (f (f x))))  | alpha 
10 | (λf x. (λy. f (f y)) (f (f (f x))))   | beta 
11 | (λf x. (λy. f (f (f (f (f x))))))   | beta