Résolution d'équations fonctionnelles pour des fonctions inconnues dans le calcul lambda

14

Existe-t-il des techniques pour résoudre des équations fonctionnelles pour des fonctions inconnues dans le calcul lambda?

Supposons que la fonction d'identité soit définie de manière extensionnelle en tant que telle:

jeX=X

(c'est-à-dire en écrivant une équation pour le comportement attendu de cette fonction) et maintenant je veux la résoudre pour en faisant une transformation algébrique pour obtenir la formule intensionnelle de cette fonction:je

je=λX.X

qui indique exactement comment la fonction fait ce qui était attendu (c'est-à-dire comment l'implémenter dans le calcul lambda).

Bien entendu, la fonction d'identité n'est utilisée qu'à titre d'exemple. Je m'intéresse aux méthodes plus générales de résolution de telles équations. En particulier, je voudrais trouver une fonction qui réponde à l'exigence suivante:B

BF(λX.M)=(λX.FM)

c'est-à-dire "injecte" la fonction donnée dans la fonction lambda donnée avant son "corps" (qui est une expression lambda arbitraire), éventuellement en la démontant et en construisant une nouvelle, de sorte qu'elle devienne un paramètre auquel la fonction est appliquée.F(λX.M)MF

BarbaraKwarc
la source

Réponses:

13

Il s'agit d'un problème connu, connu sous le nom d' unification d'ordre supérieur .

Malheureusement, ce problème est indécidable en général. Il existe un fragment décidable, connu sous le nom de fragment de motif de Miller. Il est largement utilisé, entre autres, pour la vérification de type de programmes dépendants avec des métavariables ou la correspondance de modèles. Ce fragment est l'endroit où les variables d'unification ne sont appliquées qu'à des variables de programme liées distinctes.

Cet article fournit un excellent didacticiel sur le fonctionnement de l'unification d'ordre supérieur et en décrit une implémentation (relativement) simple.

Malheureusement, il ne semble pas que votre fonction tombe dans ce fragment de modèle. Cela dit, ce que je regarde est assez similaire à la composition des fonctions. La fonction suivante satisfait-elle votre propriété?

B=λF g X .F (g X)

Nous avons:

  • B F (λX.M)
  • α=B F (λy.[y/X]M) par -équivalenceα
  • =λX.F ((λy.[y/X]M)X)
  • =λX.F ([X/y][y/X]M)
  • =λX.F M
jmite
la source
1
Oui, ça y ressemble :) Ce qui est drôle, c'est que j'ai presque eu cette solution, mais pour une raison quelconque, je pensais qu'appeler sur quelque chose "l'exécuterait", gâcher l'expression: q Ce que j'ai manqué c'est que nous pouvons remplacer la variable par une autre variable liée à l'extérieur. (λx.M)
BarbaraKwarc
1
Merci aussi pour le lien vers le papier, je vais le vérifier, et j'accepterai votre réponse dans quelques jours pour donner une chance aux autres aussi.
BarbaraKwarc
3
Est-ce une unification d'ordre supérieur? La question semble concerner le calcul lambda non typé plutôt que le calcul lambda simplement tapé.
Peter Taylor
2

Je pense avoir une réponse partielle, concernant l'équation avec la fonction d'identité:

jeX=X

Nous voulons le résoudre en trouvant la formule pour , qui sera de la forme avec une expression encore inconnue comme corps. Remplaçons-le par dans l'équation originale:( λ p . M ) M Ije(λp.M)Mje

(λp.M)X=X

puis appliquez la fonction à sur le côté gauche:X

M[p/X]=X

Mais qu'avons-nous ici? :> Cette équation est la formule de l'expression que nous recherchons, après y avoir substitué chaque occurrence de par , et elle dit qu'elle devrait ressembler au côté droit après :) En d'autres termes, la fonction que nous recherchait c'est:p xMpX

je=(λX.X)

ce qui bien sûr est la bonne réponse :)


Essayons la même approche pour trouver la formule du combinateur . Nous voulons qu'il fonctionne de telle manière que, appliqué à lui-même, il se produise appliqué à lui-même:ω

ωω=ωω

Maintenant, trouvons la formule pour qui est de la forme pour une expression encore inconnue . En substituant cela dans l'équation, nous obtenons:ω(λX.M)M

(λX.M)ω=ωω

Son application au paramètre de gauche donne la formule de :M

M[X/ω]=ωω

Cela dit qu'après avoir substitué chaque occurrence de dans par cela a produit , donc nous pouvons déduire que l'expression originale avant la substitution aurait dû être , donc la fonction que nous cherchions devrait ressemble à ca:XMωωωMXX

ω=(λX.XX)

ce qui est effectivement le cas :)


J'ai le sentiment, cependant, que cela pourrait devenir si facile simplement parce que le côté droit était déjà dans la forme que nous recherchons.

BarbaraKwarc
la source
Existe-t-il une manière algorithmique de passer de à ? M[X/ω]=ωωω=(λX.XX)
Zhengqun Koo
Dans ces deux cas simples - oui, il y a: inversez simplement la substitution. Mais comme je l'ai dit, ces cas peuvent fonctionner par pure «chance»: que le côté droit est déjà dans la forme requise. Quand je l'ai essayé avec des exemples plus complexes, cela n'a pas fonctionné. C'est pourtant ce que je recherche: d'une manière algorithmique.
BarbaraKwarc
1
Notez que est satisfait par tout choix de , d'une manière triviale. Un algorithme pour résoudre cette équation pour peut produire n'importe quel terme. ωω=ωωωω
chi