Vous pouvez suivre les étapes suivantes pour réduire les expressions lambda:
- Entièrement entre parenthèses l'expression pour éviter les erreurs et rendre plus évident l'endroit où l'application de la fonction a lieu.
- Recherchez une application de fonction, c'est-à-dire que vous trouvez une occurrence du modèle
(λX. e1) e2
où X
peut être un identificateur valide et e1
et e2
peuvent être des expressions valides.
- appliquer la fonction par le remplacement
(λx. e1) e2
avec e1'
où e1'
est le résultat du remplacement de chaque occurrence libre de x
en e1
avec e2
.
- Répétez les étapes 2 et 3 jusqu'à ce que le motif ne se reproduise plus. Notez que cela peut conduire à une boucle infinie pour les expressions non-normalisation, de sorte que vous devriez arrêter après 1000 itérations ou alors ;-)
Donc, pour votre exemple, nous commencer par l'expression
((λm. (λn. (λa. (λb. (m ((n a) b)) b)))) (λf. (λx. x))) (λf. (λx. (f x)))
ici la sous-expression (λm. (λn. (λa. (λb. (m ((n a) b)) b)))) (λf. (λx. x))
correspond à notre modèle avec X = m
, e1 = (λn. (λa. (λb. (m ((n a) b)) b))))
et e2 = (λf. (λx. x))
. Ainsi, après substitution, nous obtenons (λn. (λa. (λb. ((λf. (λx. x)) ((n a) b)) b)))
, ce qui rend notre expression entière:
(λn. (λa. (λb. ((λf. (λx. x)) ((n a) b)) b))) (λf. (λx. (f x)))
Maintenant, nous pouvons appliquer le modèle à l'ensemble de l'expression avec X = n
, e1 = (λa. (λb. ((λf. (λx. x)) ((n a) b)) b))
et e2 = (λf. (λx. (f x)))
. Donc, après avoir remplacé nous obtenons:
(λa. (λb. ((λf. (λx. x)) (((λf. (λx. (f x))) a) b)) b))
maintenant ((λf. (λx. (f x))) a)
correspond à notre modèle et devient (λx. (a x))
, ce qui conduit à:
(λa. (λb. ((λf. (λx. x)) ((λx. (a x)) b)) b))
Cette fois, nous pouvons appliquer le modèle à ((λx. (a x)) b)
, ce qui réduit à (a b)
, conduisant à :
(λa. (λb. ((λf. (λx. x)) (a b)) b))
maintenant, appliquez le modèle à ((λf. (λx. x)) (a b))
, ce qui réduit à (λx. x)
et obtenez:
(λa. (λb. b))
Maintenant nous avons terminé.
Je pense que vous avez la bonne idée. Une question - est-ce que lambdas s'associe de gauche à droite ou de droite à gauche? Dans votre exemple, par exemple, vous les associez de droite à gauche. – danben
Aussi - ce qui est (λ f x. X)? Est-ce une sorte de raccourci pour (λ f. Λx. X)? – danben
@danben: L'application de fonction est laissée associative et l'abstraction est associative. Ce qui précède est abstraction si je suis correct? ! Et oui, c'est un raccourci. –