Le combinateur à virgule fixe FIX (alias le combinateur Y) dans le calcul lambda (non typé) ( ) est défini comme:
Je comprends son objet et je peux tracer parfaitement l'exécution de son application; Je voudrais comprendre comment dériver FIX des premiers principes .
Voici ce que j'obtiens quand j'essaye de le dériver moi-même:
- FIX est une fonction: FIX
- FIX prend une autre fonction, , pour la rendre récursive: FIX≜ λ f . …
- Le premier argument de la fonction est le "nom" de la fonction, utilisé là où une application récursive est destinée. Par conséquent, toutes les apparences du premier argument de doivent être remplacées par une fonction, et cette fonction doit attendre le reste des arguments de (supposons simplement que prend un argument): FIXf f≜ λ f . … F ( λ y . … Y )
C'est là que je ne sais pas "faire un pas" dans mon raisonnement. Les petites ellipses indiquent où mon FIX manque quelque chose (bien que je ne puisse le savoir qu'en le comparant au "vrai" FIX).
J'ai déjà lu Types et langages de programmation , qui ne tente pas de le dériver directement, et renvoie plutôt le lecteur à The Little Schemer pour une dérivation. J'ai lu cela aussi, et sa "dérivation" n'était pas si utile. De plus, il s'agit moins d'une dérivation directe que d'une utilisation d'un exemple très spécifique et d'une tentative ad hoc d'écrire une fonction récursive appropriée dans .
Réponses:
Je n'ai lu cela nulle part, mais voici comment je pense que aurait pu être dérivé:Y
Ayons une fonction r récursive , peut-être une factorielle ou autre chose comme ça. De manière informelle, nous définissons comme un terme pseudo-lambda où apparaît dans sa propre définition:f ff f f
Tout d'abord, nous réalisons que l'appel récursif peut être factorisé comme paramètre:
Maintenant, nous pourrions définir si nous avions seulement un moyen de le passer comme argument à lui-même. Ce n'est pas possible, bien sûr, car nous n'avons pas de à portée de main. Ce que nous avons à portée de main est . Puisque contient tout ce dont nous avons besoin pour définir , nous pouvons essayer de passer comme argument au lieu de et essayer de reconstruire partir de lui plus tard à l'intérieur. Notre première tentative ressemble à ceci:f M M f M f ff f M M f M f f
Cependant, ce n'est pas complètement correct. Avant, obtenu est substitué à à l' intérieur . Mais maintenant, nous passons place. Nous devons corriger en quelque sorte tous les endroits où nous utilisons pour que reconstruisent de . En fait, ce n'est pas difficile du tout: maintenant que nous savons que , partout où nous utilisons nous le remplaçons simplement par .r M M r f M f = M M r ( r r )f r M M r f M f=MM r (rr)
Cette solution est bonne, mais nous avons dû modifier intérieur. Ce n'est pas très pratique. Nous pouvons le faire plus élégamment sans avoir à modifier en introduisant un autre qui envoie à son argument appliqué à lui-même: En exprimant comme nous obtenonsM λ M M ′ λ x . M ( x x )M M λ M M′ λx.M(xx)
De cette façon, lorsque est substitué à , est substitué à , qui est par définition égal à . Cela nous donne une définition non récursive de , exprimée en terme lambda valide!x M M r f fM x MM r f f
La transition vers est maintenant facile. Nous pouvons prendre un terme lambda arbitraire au lieu de et effectuer cette procédure dessus. Nous pouvons donc factoriser et définirM MY M M
En effet, réduit à tel que nous l'avons défini.fYM f
Remarque: J'ai dérivé tel qu'il est défini dans la littérature. Le combinateur que vous avez décrit est une variante de pour appel par valeur langues, parfois aussi appelé . Voir cet article Wikipedia .Y ZY Y Z
la source
Comme l'a souligné Yuval, il n'y a pas qu'un seul opérateur à virgule fixe. Il y a beaucoup d'entre eux. En d'autres termes, l'équation du théorème à virgule fixe n'a pas de réponse unique. Vous ne pouvez donc pas en dériver l'opérateur.
C'est comme demander comment les gens dérivent comme solution pour . Ils ne le font pas! L'équation n'a pas de solution unique.x = y(x,y)=(0,0) x=y
Juste au cas où ce que vous voulez savoir, c'est comment le premier théorème du point fixe a été découvert. Permettez-moi de dire que je me suis également demandé comment ils étaient parvenus aux théorèmes de point fixe / récursivité lorsque je les ai vus pour la première fois. Cela semble si ingénieux. Particulièrement sous la forme de théorie de calculabilité. Contrairement à ce que dit Yuval, il n'est pas vrai que les gens jouent jusqu'à ce qu'ils trouvent quelque chose. Voici ce que j'ai trouvé:
Pour autant que je m'en souvienne, le théorème est à l'origine dû à SC Kleene. Kleene est venu avec le théorème du point fixe d'origine en récupérant la preuve de l'incohérence du calcul lambda original de Church. Le calcul lambda original de Church souffrait d'un paradoxe de type Russel. Le calcul lambda modifié a évité le problème. Kleene a étudié la preuve de l'incohérence probablement pour voir comment le calcul lambda modifié souffrirait d'un problème similaire et a transformé la preuve de l'incohérence en un théorème utile dans le calcul lambda modifié. Par son travail sur l'équivalence du calcul lambada avec d'autres modèles de calcul (machines de Turing, fonctions récursives, etc.), il l'a transféré à d'autres modèles de calcul.
Comment dériver l'opérateur que vous pourriez demander? Voici comment je garde cela à l'esprit. Le théorème à virgule fixe consiste à supprimer l'auto-référence.
Tout le monde connaît le paradoxe du menteur:
Ou sous une forme plus linguistique:
Maintenant, la plupart des gens pensent que le problème avec cette phrase est lié à l'auto-référence. Ce n'est pas! L'auto-référence peut être éliminée (le problème est avec la vérité, une langue ne peut pas parler de la vérité de ses propres phrases en général, voir l'indéfinissabilité du théorème de vérité de Tarski ). Le formulaire où l'auto-référence est supprimée est le suivant:
Pas d'auto-référence, nous avons des instructions sur la façon de construire une phrase, puis d'en faire quelque chose. Et la phrase qui se construit est égale aux instructions. Notez que dans -calculus, nous n'avons pas besoin de guillemets car il n'y a pas de distinction entre les données et les instructions.λ
Maintenant, si nous analysons cela, nous avons où est les instructions pour construire et y faire quelque chose.MM Mx xx
Donc est et nous avonsM λx.f(xx)
C'est pour un fixe . Si vous voulez en faire un opérateur, nous ajoutons simplement et nous obtenons :f λf Y
Je viens donc de garder à l' esprit le paradoxe sans autoréférence et qui me permet de comprendre ce que est sur le point .Y
la source
Vous devez donc définir un combinateur à virgule fixe
mais sans récursivité explicite. Commençons par le combinateur irréductible le plus simple
La
x
première lambda est remplacée à plusieurs reprises par la deuxième lambda. Une simple conversion alpha rend ce processus plus clair:C'est-à-dire que la variable dans la première lambda disparaît toujours. Donc, si nous ajoutons un
f
au premier lambdale
f
bob upNous avons le
omega
dos. Il devrait être clair maintenant, que si nous ajoutons unf
à la deuxième lambda, alors lef
apparaîtra dans la première lambda et ensuite il montera:Puisque
nous pouvons réécrire l'expression comme
ce qui est juste
et nous avons notre équation
Y f = f (Y f)
. LeY
combinateur est donc essentiellementf
f
enrouléla source
Vous avez peut-être vu l'exemple classique d'une équation sans forme normale:
Une équation similaire est suggérée par celle pour la récursivité générale:
(A) est un moyen d'écrire des équations récursives générales dans le calcul lambda (au-delà du récursif primitif). Alors, comment résolvez-vous l'équation ? Branchez dans dans l'équation ci-dessus pour obtenir:Yf=f(Yf) f R
Y = λ f . ( λ x . f ( x x ) ) ( λ x . f ( x x ) )
la source