La subtilité réside là où se fait la distinction entre langue et métalangage. Comme l'a dit René Magritte :
(λf.λx.fx)((λy.y)(λz.z))(λw.w)est un terme lambda, écrit dans la syntaxe des termes lambda. Appelons ce terme lambdat. LaisserM être le terme lambda (λf.λx.fx)((λy.y)(λz.z)). je peux écriret=M(λw.w)(et c'est une vraie égalité): je n'ai fait que donner un nom à un sous-terme. Si vous considérez le côté droit de cette égalité "M(λw.w)», Il n'est pas écrit dans la syntaxe des termes lambda; il est écrit dans une notation mathématique où nous permettons à une lettre de représenter un terme lambda.
Quand on écrit une règle comme
e2→e′2ve2→ve′2
il énonce l'axiome suivant: pour tout terme lambda
e2 et
e′2 et toute valeur
v, si
e2 réduit à
e′2 puis
ve2 réduit à
ve′2. Ici, nous utilisons à nouveau des méta-notations (c'est-à-dire des notations mathématiques pour raisonner sur une langue): la flèche
→exprimer la relation de réduction; métavariables où une lettre indique le tri (
e pour les termes lambda,
vpour les valeurs) et les indices et les nombres premiers distinguent les métavariables du même type; la notation de fraction pour écrire un axiome inductif.
Quand on écrit la règle
e→e′E[e]→vE[e′]
puis encore
E[⋅]est une méta-notation, qui fait partie du métalangage et non de la syntaxe du terme lambda. La règle signifie: pour tout terme lambda
e et
e′ et tout contexte d'évaluation
E[⋅], si
e réduit à
e′ puis
E[e] réduit à
E[e′].
Si nous appelons le contexte (λf.λx.fx)[⋅](λw.w) par le (méta-) nom Et, puis t=Et[(λy.y)(λz.z)]. Encore une fois, il s'agit d'une égalité entre deux termes lambda, c'est-à-dire que le même terme lambda est des deux côtés du signe égal. Ce que nous avons à gauche et à droite sont deux méta-notations différentes pour le même terme lambda(λf.λx.fx)((λy.y)(λz.z))(λw.w): un qui utilise un nom que nous lui avons donné, un autre un peu plus compliqué impliquant un contexte auquel nous avons donné un nom.
Étant donné le terme t, comment trouvez-vous comment cela peut réduire?
- Avec la notation utilisant plusieurs règles, vous devez trouver un arbre de déduction (en général - ici la dérivation est linéaire, vous n'avez donc qu'à trouver une chaîne menant à un axiome).
- Avec la notation utilisant des contextes d'évaluation, vous devez trouver un contexte d'évaluation approprié.
La grammaire du contexte d'évaluation suit la structure des règles d'évaluation, il ne s'agit donc pas vraiment de deux méthodes mais de deux manières différentes d'exprimer la même définition.
Pour comprendre cela, je recommande fortement l'exercice suivant: dans votre langue préférée, implémentez l'évaluation lambda-term call-by-value de manière simple, avec un type représentant les termes lambda et une fonction effectuant une étape de réduction.