Sur la page Wikipedia pour les combinateurs à point fixe est écrit le texte plutôt mystérieux
Le combinateur Y est un exemple de ce qui rend le calcul Lambda incohérent. Donc, il devrait être considéré avec suspicion. Cependant, il est prudent de considérer le combinateur Y lorsqu'il est défini uniquement en logique mathématique.
Suis-je entré dans une sorte de roman d'espionnage? Qu'entend-on par déclarations dans le monde que -calculus est "incohérent" et qu'il devrait être "considéré avec suspicion" ?
Réponses:
Il est inspiré d’événements réels, mais sa formulation est à peine reconnaissable et «devrait être considéré avec méfiance» n’a aucun sens.
La cohérence a un sens précis en logique: une théorie cohérente en est une où toutes les déclarations ne peuvent être prouvées. Danslogique classique, cela équivaut à l'absence d'une contradiction,savoir une théorie ne correspond pas si et seulement s'il y a une déclarationtelle que la théorierévèlefoiset sa négation.A A ¬A
Alors qu'est-ce que cela signifie en ce qui concerne le calcul lambda? Rien. Le lambda calcul est un système de réécriture, pas une théorie logique.
Il est possible de visualiser le calcul lambda en relation avec la logique. Considérer les variables comme représentant une hypothèse dans une preuve, les abstractions lambda comme preuves sous une certaine hypothèse (représentée par la variable), et l’application comme assemblant une preuve conditionnelle et une preuve de l’hypothèse. La règle bêta correspond alors à la simplification d’une preuve en appliquant le modus ponens , principe fondamental de la logique.
Ceci, cependant, ne fonctionne que si la preuve conditionnelle est combinée avec une preuve de la bonne hypothèse. Si vous avez une preuve conditionnelle supposant que et que vous avez également une preuve de , vous ne pouvez pas les combiner ensemble. Si vous voulez que cette interprétation du calcul lambda fonctionne, vous devez ajouter une contrainte selon laquelle seules les preuves de l'hypothèse appropriée sont appliquées aux preuves conditionnelles. Cela s'appelle un système de types et la contrainte est la règle de typage qui dit que lorsque vous passez un argument à une fonction, le type de l'argument doit correspondre au type de paramètre de la fonction.n=3 n=2
La correspondance de Curry-Howard est un parallèle entre les calculs typés et les systèmes de preuve.
Un calcul typé qui a un combinateur à point fixe tel que permet de construire un terme de tout type (essayez d'évaluer ). Ainsi, si vous prenez l'interprétation logique dans la correspondance de Curry-Howard, vous obtiendrez une théorie incohérente. Voir Le combinateur Y contredit-il la correspondance de Curry-Howard? pour plus de détails.Y Y(λx.x)
Ce n'est pas significatif pour le calcul lambda pur, c'est-à-dire pour le calcul lambda sans types.
Dans de nombreux calculs typés, il est impossible de définir un combinateur à point fixe. Ces calculs typés sont utiles en ce qui concerne leur interprétation logique, mais pas comme base pour un langage de programmation complet de Turing. Dans certains calculs typés, il est possible de définir un combinateur à point fixe. Ces calculs typés sont utiles comme base pour un langage de programmation complet de Turing, mais pas en ce qui concerne leur interprétation logique.
En conclusion:
la source
true
etfalse
, ainsi, les propositions étaient des objets qui produisaient des valeurs booléennes. (et ont été pris en considération que les propositions sur le domaine des choses où il fait sortir une valeur booléenne).Je voudrais ajouter un à ce que @Giles a dit.
La correspondance de Curry-Howard établit un parallèle entre termes (plus précisément, les types de termes ) et les systèmes de preuve.λ λ
Par exemple, a le type (où signifie "fonction de à "), ce qui correspond à la déclaration logique . La fonction a le type , correspondant à . Nous pouvons convertir n'importe quel type de lambda-calcul en une tautologie logique par, dans un sens, un "filtrage" sur des fonctions.λx.λy.x a→(b→a) a→b a b a⟹(b⟹a) λx.λy.xy (a→b)→(a→b) (a⟹b)⟹(a⟹b)
Le problème se pose lorsque nous considérons le combinateur Y, défini comme . Le problème se pose parce que nous nous attendons à ce que le combinateur Y, en tant que combinateur à "point fixe", ait le type (car il prend une fonction d'un type à ce même type et trouve un point pour cette fonction, qui a ce type). En convertissant cela en une instruction logique, on obtient . C'est une contradiction:λf.(λx.f(xx))(λx.f(xx)) (a→a)→a (a⟹a)⟹a
Si vous acceptez dans un système de types, le système de types devient incohérent. Cela signifie que nous pouvons soit(a→a)→a
la source
fix
. Vous pouvez simplement affirmer qu'il ya une constante pour chaque type . Cela vous donnera déjà un système incohérent en ce qui concerne CH, car cela impliquerait que chaque type soit habité par . Vous pouvez également ajouter -rules pour faire calculer, ce qui transformerait, par exemple, le STLC avec naturals en un système complet de Turing, mais vous n'avez pas à ajouter ces règles de calcul, et le système serait toujours incohérent.