Lambda Calculus: comment fonctionnent les contextes d'évaluation

8

Dans le calcul lambda pur, nous avons l'ensemble de termes définis par induction (la grammaire):

e::=xλx.ee1e2

Dans le cadre de la stratégie d'évaluation de l'appel par valeur, nous avons les règles d'inférence pour la réduction bêta et les règles sur la façon d'évaluer les applications (règles de congruence). J'essaie de comprendre comment les contextes d'évaluation peuvent remplacer les règles de congruence sans réellement changer la syntaxe du langage. Sans contextes d'évaluation, nous avons les éléments suivants:

e1e1e1e2e1e2
et
e2e2ve2ve2.

Cela a du sens, car si nous avons une instance d'une expression t=(λf.λx.fx)((λy.y)λz.z)λw.w, il est clair qu'il a la forme e1e2e1e2 Et ainsi

(λf.λx.fx)((λy.y)λz.z)λw.w(λf.λx.fx)(λz.z)λw.w

Si nous remplaçons les règles de congruence par des contextes d'évaluation:

E::=[]EevE
alors nous n'avons besoin que d'une seule règle pour exprimer les règles de congruence du langage:
eeE[e]E[e].

Je suis confus quant à la façon dont les contextes d'évaluation peuvent nous dire comment évaluer l'expression td'en haut sans changer la syntaxe de la langue. Je ne comprends pas comment le contexte d'évaluation "fonctionne" sans réécrituret comme

Et=(λf.λx.fx)[]λw.w

t=Et[((λy.y)λz.z)]. Il n'y a aucune raison a priori évidente d'évaluert sous appel par valeur sans connaissance de Et. Je ne sais vraiment pas où je vais mal. Quelqu'un peut-il m'aider à corriger ma pensée?

baffld
la source
La réduction n'est pas conforme aux stratégies de réduction telles que l'appel par valeur. Voir aussi ici .
Martin Berger
Je ne comprends pas votre réponse; votre utilisation de la «congruence» en tant que verbe n'a aucun sens pour moi. J'ai lu les réponses dans le lien que vous avez fourni, mais je ne comprends toujours pas pourquoiEest présenté comme une forme syntaxique, mais il n'est jamais réellement utilisé dans la syntaxe du langage pour lequel il est défini.
baffld
Je n'utilise pas la congruence comme verbe. Je ne comprends pas ce que tu veux dire. E est une méta-variable s'étendant sur des contextes d'évaluation. Les contextes d'évaluation sont un sous-ensemble approprié de contextes. Les contextes sont des programmes percés.
Martin Berger

Réponses:

8

La subtilité réside là où se fait la distinction entre langue et métalangage. Comme l'a dit René Magritte :

Ceci n'est pas une pipe.

(λ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

e2e2ve2ve2
il énonce l'axiome suivant: pour tout terme lambda e2 et e2 et toute valeur v, si e2 réduit à e2 puis ve2 réduit à ve2. Ici, nous utilisons à nouveau des méta-notations (c'est-à-dire des notations mathématiques pour raisonner sur une langue): la flècheexprimer 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

eeE[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 lambdae 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.

Gilles 'SO- arrête d'être méchant'
la source
2
En rapport avec votre dernier paragraphe: tous les logiciens et tous ceux qui étudient la syntaxe devraient être obligés de mettre en œuvre la substitution.
Andrej Bauer