La question sous-jacente:
Que fait le calcul lambda pour nous que nous ne pouvons pas faire avec les propriétés de fonction de base et la notation généralement apprises en algèbre de collège?
Tout d'abord, que signifie l'abstrait dans le contexte du lambda calcul? Ma compréhension du mot abstrait est quelque chose qui est dissocié de la machinerie, le résumé conceptuel d'un concept.
Cependant, les fonctions lambda, en supprimant les noms de fonction, empêchent un certain niveau d'abstraction. Par exemple:
f(x) = x + 2
h(x, y) = x + 5 y
Mais même sans définir le mécanisme de ces fonctions, on peut facilement parler de leur composition. Par exemple:
1. h(x, y) . f(x) . f(x) . h(x, y) or
2. h . f . f . h
Nous pouvons inclure les arguments si nous voulons, ou nous pouvons résumer complètement pour donner un aperçu de ce qui se passe. Et nous pouvons rapidement les réduire à une seule fonction. Regardons la composition 2. Je peux avoir des couches de détails avec lesquelles je peux écrire en fonction de mon accent:
g = h . f . f . h
g(x, y) = h(x, y) . f(x) . f(x) . h(x, y)
g(x, y) = h . f . f . h = x + 10 y + 4
Réalisons ce qui précède avec lambda calcul, ou au moins définissons les fonctions. Je ne suis pas sûr que ce soit vrai, mais je crois que les première et deuxième expressions augmentent de 2.
(λuv.u(u(uv)))(λwyx.y(wyx))x
Et à multiplier par 5 ans.
(λz.y(5z))
Plutôt que d'être abstrait, cela semble entrer dans le mécanisme même de ce que cela signifie d'ajouter, de multiplier, etc. L'abstraction, à mon avis, signifie un niveau supérieur plutôt qu'un niveau inférieur.
De plus, j'ai du mal à voir pourquoi le calcul lambda est même une chose. Quel est l'avantage de
(λuv.u(u(uv)))(λwyx.y(wyx))x
plus de
h(x) = x + 5 y
ou une notation combinée
Hxy.x+5y
ou même la notation de Haskell
h x y = x + 5 * y
Encore une fois, que fait le calcul lambda pour nous que nous ne pouvons pas faire avec les propriétés et la notation de la fonction de style f (x) que beaucoup connaissent.
Réponses:
Il existe de nombreuses raisons pour lesquelles le calcul lambda est si important.
Une raison très importante est que le calcul lambda nous permet d'avoir un modèle de calcul dans lequel les fonctions calculables sont des citoyens de première classe.
On ne peut pas exprimer des fonctions d'ordre supérieur dans le langage de l'algèbre du collège.
Prenons comme exemple l'expression lambda
Cette expression simple nous montre que, dans le calcul lambda, la composition des fonctions est elle-même une fonction. En algèbre de collège, cela ne s'exprime pas facilement.
Dans le calcul lambda, il est très facile d'exprimer qu'une fonction retournera une fonction comme résultat.
Voici un petit exemple. L'expression (où je suppose ici un calcul lambda appliqué avec addition et constantes entières)
se réduira à
Notez également que dans le calcul lambda, les fonctions sont des expressions et non des définitions de la forme . Cela nous libère de la nécessité de nommer des fonctions et de distinguer entre une catégorie syntaxique d'expressions et une catégorie syntaxique de définitions.f(x)=e
De plus, lorsqu'il devient impossible (ou simplement encombrant sur le plan de la notation) d'exprimer des fonctions d'ordre supérieur, il sera également difficile d'affecter des types à des expressions.
La composition des fonctions est de type polymorphe
dans le système de type Hindley-Milner.
Un argument de vente très fort pour le calcul lambda est la notion précise de calcul lambda typé . Les différents systèmes de types pour les langages de programmation fonctionnels tels que Haskell et la famille ML sont basés sur des systèmes de types pour les calculs lambda, et ces systèmes de types fournissent de fortes garanties sous la forme de théorèmes mathématiques:
Si un programme est bien typé et e se réduit au résiduel e ' , alors e ' sera également bien typé.e e e′ e′
Et si est bien tapé, e ne présentera pas certaines erreurs.e e
Les preuves comme correspondance de programmes sont particulièrement remarquables. L'isomorphisme de Curry-Howard (voir par exemple https://www.rocq.inria.fr/semdoc/Presentations/20150217_PierreMariePedrot.pdf ) montre qu'il existe une correspondance très précise entre le calcul lambda simplement tapé et la logique propositionnelle intuitionniste: pour chaque type correspond une formule logique φ T . Une preuve de ϕ T correspond à un terme lambda de type T , et une bêta-réduction de ce terme correspond à effectuer une élimination de coupure dans la preuve.T ϕT ϕT T
J'exhorte ceux qui pensent que l'algèbre du collège est une bonne alternative au calcul lambda à développer un compte rendu de l'algèbre du collège de type polymorphe d'ordre supérieur avec une notion appropriée d'isomorphisme de Curry-Howard. Si vous pouvez même élaborer un assistant de preuve interactif basé sur l'algèbre du collège qui nous permettrait de prouver les nombreux théorèmes formalisés à l'aide d'assistants de preuve basés sur le calcul lambda tels que Coq et Isabelle, ce serait encore mieux. Je commencerais alors à utiliser l'algèbre du collège, et donc, j'en suis sûr, j'en ferais beaucoup d'autres avec moi.
la source
Lorsque les fonctions sont décrites pour la première fois aux jeunes, elles sont essentiellement identifiées par des graphiques (graphiques), ou peut-être par des formules; c'est ainsi que les fonctions étaient comprises historiquement avant l'avènement des tendances formalistes en mathématiques. De nos jours , les fonctions, comme cela est enseigné dans le premier calcul de l' année, sont des fonctions réelles, qui est, les fonctions de à R .R R
Les fonctions du calcul lambda sont beaucoup plus générales. La définition exacte dépend de si votre calcul lambda est tapé ou non. Dans le calcul lambda pur non typé, tout est fonction. C'est beaucoup plus général que les fonctions réelles du calcul.
Même les langages procéduraux utilisent parfois des idées du calcul lambda. La fonction de tri en C accepte comme paramètre une fonction de comparaison , qu'elle utilise pour comparer des éléments. Le calcul lambda va beaucoup plus loin - les fonctions acceptent non seulement les fonctions comme entrées, mais peuvent également les produire.
Le calcul lambda est un modèle de calcul équivalent en puissance aux machines de Turing. C'est un système complet en soi. Le calcul lambda pur n'a pas "5" ou "+" comme termes primitifs - ils peuvent être définis à l'intérieur du calcul, tout comme "5" et "+" ne sont pas des primitives de la théorie des ensembles. (Les langages de programmation pratiques implémentent nativement les nombres naturels pour des raisons d'efficacité.)
Je soupçonne que l'une des raisons pour lesquelles vous n'êtes pas impressionné par le calcul lambda est que ses idées ont tellement imprégné le discours de programmation qu'il ne semble plus innovant.
la source
L'utilisation d'expressions lambda dans les langages de programmation présente un avantage similaire; vous pouvez écrire ce que fait la fonction là où elle est nécessaire plutôt que d'avoir à définir une toute nouvelle fonction ailleurs dans votre programme.
Beaucoup de gens trouvent cette notation à double évaluation déroutante et / ou troublante, ainsi que cette utilisation récursive de la définition ponctuelle d'une fonction. La version abstraction lambda
n'a pas ce problème.
Enfin, il existe un théorème de non-sens abstrait selon lequel "le calcul lambda simplement tapé" est fondamentalement la même chose que la "catégorie fermée cartésienne" - donc si jamais vous vous retrouvez à vouloir faire un calcul dans une catégorie fermée cartésienne, c'est probablement une bonne idée d'utiliser il suffit de taper lambda calculus pour le faire.
la source
Je dirai d'emblée que je ne suis pas un expert sur ce sujet, mais je viens de passer un peu de temps à l'étudier et l'une des choses les plus fascinantes pour moi dans n'importe quel sujet est l'histoire derrière. Donc, pour moi, comprendre un peu l'histoire derrière le calcul lambda aide à expliquer pourquoi il est utile.
Le bref résumé est qu'au début des années 1900 après la théorie des ensembles a commencé à décoller et en mathématiques a été re-Envisagé basée sur des ensembles, certains mathématiciens ont remarqué que si une théorie des ensembles définition permet d'affirmer qu'une certaine structure réelle , ils ne pas vous dire comment pour le construire et le calculer. Les définitions de la théorie des ensembles ne sont donc pas constructives . Mathématiciens commença à se demander s'il y avait un moyen de développer constructives définitions qui vont au - delà prouver que quelque chose est et au lieu de prouver comment c'est .
De Wikipédia :
Il a ensuite été démontré que le calcul lambda et la machine de Turing pouvaient tous deux représenter n'importe quelle fonction calculable et sont donc équivalents.
En théorie, tout fonction ou concept mathématique peut être codé sous forme de calcul lambda et calculé. Cela signifie que le calcul lambda peut être une base complètement distincte pour les mathématiques, bien qu'évidemment extrêmement fastidieuse.
Le calcul lambda n'est pas "utile" dans le sens où vous n'écrirez pas de code en l'utilisant, mais il constitue la base de la sémantique dénotationnelle qui est utilisée pour décrire les programmes et leurs effets dynamiques. Ceci est utilisé dans les discussions sur l'exactitude du programme et la signification sémantique. Il a aussi évidemment fortement influencé le développement des langages de programmation fonctionnels, qui tirent tout leur concept d'exécution du calcul lambda.
J'espère que cela pourra aider.
Modifier pour ajouter: je viens de signaler cet article montrant la relation entre la topologie, le calcul lambda et la physique. Le survolant brièvement, je suis tombé sur cette déclaration fantastique:
Le fait est que le calcul lambda est un modèle idéalisé de calcul logiciel et, en tant que tel, n'est lié à une implémentation particulière dans aucun langage de programmation. Il modélise le calcul pur .
la source
la source
Le calcul lambda n'a pas été conçu pour être un langage de programmation. En effet, il a été créé dans les années 1930, des décennies avant même que nous ayons des ordinateurs programmables. Il a plutôt été créé comme un modèle formel pour étudier le calcul lui-même. Si vous êtes déçu de la facilité avec laquelle il exprime le code ou les fonctions mathématiques, c'est parce que ce n'est pas à cela qu'il sert.
la source
Le calcul lambda existe pour que des fonctions anonymes (aka lambda) puissent être créées. Si vous ne supprimez pas les noms de fonctions, l'espace de noms peut être encombré et on peut manquer de noms de fonctions disponibles. Ceci est particulièrement important lorsqu'il s'agit de «fonctions d'ordre supérieur» qui renvoient des fonctions (ou des pointeurs de fonction) pour des raisons évidentes.
Essentiellement, les fonctions lambda sont équivalentes aux variables de portée locale. La programmation fonctionnelle sans fonctions lambda est analogue à la programmation procédurale sans aucune variable locale, c'est-à-dire une idée terrible.
"pourquoi le calcul lambda est même une chose" les mathématiciens aiment la redondance. le calcul lambda est rarement utilisé en mathématiques car, comme vous l'avez découvert, la notation n'est pas très utile.
«Si vous pouvez même élaborer un assistant de preuve interactif basé sur l'algèbre du collège qui nous permettrait de prouver les nombreux théorèmes formalisés à l'aide d'assistants de preuve basés sur le calcul lambda tels que Coq et Isabelle, ce serait encore mieux. puis commencer à utiliser l'algèbre du collège, et donc, j'en suis sûr, j'en ferais beaucoup d'autres avec moi. Avez-vous entendu parler de métamath? Aucun calcul lambda impliqué ici, ne peut prouver la plupart des théorèmes coq / isabelle
la source
let
, mais bien qu'illet
puisse être encodé avec des fonctions anonymes, vous ne pouvez clairement pas aller dans l'autre sens. La programmation fonctionnelle ne nécessite pas de "fonctions lambda", par exemple FP ou Sisal de Backus .