Calcul de lambda
Dans la logique mathématique et le de l'informatique, le calcul , aussi le λ-calcul du lambda de , est un système formel conçu pour étudier la définition de la fonction , l'application et la récursion de fonction de . Il a été présenté par l'église d'Alonzo de et le Stephen Cole Kleene dans les années 30 en tant qu'élément d'un plus grand effort de baser la base des mathématiques sur des fonctions plutôt que place (dans les espoirs d'éviter des obstacles comme le paradoxe de Russell de ). Le paradoxe de Kleene-Rosser de prouve que le calcul de lambda ne peut pas éviter des paradoxes placer-théorétiques, mais le calcul de lambda a émergé comme outil utile dans la recherche sur les problèmes dans le computability ou la théorie de récursion, et forme la base d'un paradigme de appelé de programmation par ordinateur la programmation fonctionnelle .
Le calcul de lambda peut être considéré comme langage de programmation idéalisé et minimalistic. C'est un cousin étroit de la machine , une autre abstraction minimaliste de Turing de capable d'exprimer n'importe quel algorithme. La différence entre les deux est que le calcul de lambda adopte à un la position fonctionnelle des algorithmes, alors que la machine de Turing d'original adopte à un la position impérative . C'est-à-dire, une machine de Turing maintient le « état » - un « cahier » des symboles qui peuvent changer d'une instruction en prochain. Le paradigme impératif peut être vu dans des langages de programmation comme C ou BASIC. En revanche, le calcul de lambda est apatride, il traite exclusivement les fonctions qui acceptent et renvoient des données (autres fonctions y compris), mais ne produit aucun effet secondaire en « état » et n'apporte pas des changements aux données entrantes (immuabilité .) Le paradigme fonctionnel peut être vu dans des langues modernes comme le blèsent , arrangement et Haskell .
L'église a employé le calcul de lambda pour donner une réponse négative au Entscheidungsproblem et au problème d'arrêt . Le calcul de lambda - et le paradigme de la programmation fonctionnelle - est encore influent, particulièrement parmi la communauté du renseignement artificielle.
Cet article traite le " ; calculus" non classé de lambda ; comme à l'origine conçu par Church. Depuis lors, un certain dactylographié les calculs de lambda ont été développés.
Histoire
À l'origine, l'église avait essayé de construire un système formel complet pour les bases des mathématiques ; quand le système s'est avéré être susceptible de l'analogue du paradoxe de Russell de , il a séparé dehors le calcul de lambda et l'avait l'habitude pour étudier le Computability , aboutissant à sa réponse négative au Entscheidungsproblem .
Description sans cérémonie
Dans le calcul de lambda, le chaque expression de est une fonction unaire , c., une fonction de avec seulement une entrée (appelé un argument). Quand il est appliqué à une autre expression (c'est-à-dire, appelé avec l'expression en tant que son argument), il renvoie une valeur simple, appelée le son résultat. De plus, depuis encore le chaque expression de est une fonction unaire , chaque argument de et chaque résultat est également une fonction (en effet, une fonction unaire juste comme celui-ci), rendant le calcul de lambda tout à fait intéressant et unique dans les deux les mathématiques du calcul même. Une fonction est anonyme définie par une expression de lambda qui exprime l'action de la fonction sur son argument. Par exemple, le " ; ajouter-two" ; f de fonction tels que   ; f ( X ) = X + 2  ; serait exprimé en calcul de lambda comme   ; X de λ. X + 2  ; (ou d'une manière equivalente comme   ; y de λ. y + 2 ;   ; le nom de l'argument formel est peu important) et l'application du f (3) de de fonction serait écrite comme   ; ( X de λ.  ; Noter cette partie de ce qui fait ce " de description ; informal" ; est ce le X de d'expression + 2 (ou même le numéro 2) n'est pas une partie de calcul de lambda ; une explication de la façon dont des nombres et l'arithmétique peuvent être représentés dans le calcul de lambda est au-dessous de . L'application de fonction est associatif laissé par :   ; y du X du f = ( X de f ) y .  ; Considérer la fonction qui prend une fonction comme argument et s'applique l'au nombre 3 :   ; f de λ.  ; Cette dernière fonction a pu être appliquée à notre " plus tôt ; ajouter-two" ; fonction comme suit :   ; ( f de λ.  ; Les trois expressions :( f de λ. X + 2)
( X de λ. X + 2) 3
3 + 2 être équivalent.
Une fonction de deux variables est exprimée en calcul de lambda en fonction d'un argument qui renvoie une fonction d'un argument (voir le corroyer ). Par exemple, le   de fonction ; f ( X , y ) = X -   du y ; serait écrit comme   ; X de λ. Une convention commune est d'abréger des fonctions au curry comme, dans cet exemple,   ; y du X de λ. Tandis que ce n'est pas une partie de la définition formelle de la langue, le X n du X 2 du X 1 de λ de …. expression est employé comme abréviation pour le X 1 de λ de . X 2 de λ. … X n de λ. expression Non chaque expression de lambda peut être réduite à une valeur définie comme celle ci-dessus ; considérer par exemple le de ( X de λ. X ) du X ou de ( X de λ. X ) ( X du X du X de λ. X ) du X du X et essai pour visualiser ce qui se produit quand vous commencez à s'appliquer la première fonction à son argument.   ; ( X de λ.   du X du X ) ; est également connu comme Combinator de ω ;   ; (( X de λ. X du X ))  ; est connu comme Ω,   ; (( X de λ. X ) ( X du X du X de λ. X du X du X ))  ; comme Ω2, etc.
Les expressions de calcul de lambda peuvent contenir les variables , c. variables de librement non liées par n'importe quel λ. Par exemple, le   variable ;   du y ; est libre dans le   d'expression ; ( X de λ.   du y ) ; , représentant une fonction qui produit toujours le y de de résultat. De temps en temps, ceci rend nécessaire le retitrage des arguments formels, par exemple afin de réduire le de ( y de X de λ. y ) de les premiers besoins un de retitrer les occurrences peu importantes du y avec un nom se produisant pas déjà dans la limite, indiquent le de du z ( z de X de λ. y ) de sorte que la réduction ne mélange pas vers le haut les noms et ne rapporte pas correctement le z de λ de . Dans la première ligne de cet exemple, le premier y définit le paramètre formel, la seconde emploie le paramètre formel, et le tiers, écrit dans cette police , est une variable libre.
Si on formalise seulement la notion de l'application de fonction et remplace l'utilisation des expressions de lambda en employant les combinators de , on obtient la logique combinatoire .
Définition formelle
Formellement, une expression de lambda est le défini inductivement en tant qu'un de ce qui suit : V, un variable, où V est n'importe quelle marque . (L'ensemble précis de marques est arbitraire, mais doit être infini.E), un abstraction, où le V est n'importe quels marque et E est n'importe quelle expression de lambda. Une abstraction correspond à une fonction anonyme .Pour unclutter la notation, des parenthèses peuvent être omises si elles sont superflues. Quand il y a des parenthèses manquant, l'application de fonction est laissée associative, et à des grippages d'un lambda autant que possible après elle. Par exemple, le   d'expression ; (( X de λ. ( X de X )) ( y de λ. y ))  ; peut être simplement écrit comme   ; ( X de λ.
Libérer et bondir les variables
Chacun variable dans une expression de lambda est le libre ou le attaché. Par exemple, le X dans le   ; ( y de X )   ; est libre, alors que le X dans le   ; X de λ. ( y de X )   ; est lié. Une variable attachée a un lambda spécifique qu'elle est associée à, alors qu'une variable libre ne fait pas. Avec précision, les variables libres d'une expression de lambda sont le défini inductivement comme suit : Dans une expression du   de forme ; V ,   ; là où le V de est une variable, ce V de est l'occurrence libre simple.Une expression qui ne contient aucune variable libre serait clôturé par .
α-conversion
L'alpha conversion permet à des noms variables attachés d'être changés. Par exemple, une alpha conversion de   ; X de λ.   du X ; serait   ; y de λ. Fréquemment dans les utilisations du calcul de lambda, des limites qui diffèrent seulement par alpha conversion sont considérées équivalentes.Les règles précises pour l'alpha conversion ne sont pas complètement insignifiantes. D'abord, alpha-en convertissant une abstraction, les seules occurrences variables qui sont retitrées sont ceux qui sont liées à la même abstraction. Par exemple, une alpha conversion de   ; X du X .   du X ; a pu avoir comme conséquence le   ; X du y .   du X ; , mais lui pourrait résultat de not dans le   ; X du y . Ce dernier a une signification différente de l'original.
En second lieu, l'alpha conversion n'est pas possible si elle aurait comme conséquence une obtention variable capturée par une abstraction différente. Par exemple, si nous remplaçons le X de par le y de dans le y du X . le X , nous obtenons le y du y . y , qui est pas du tout identique.
Substitution
Substitution, écrite le E : = E&prime ; , correspond au remplacement d'un V variable par le E&prime d'expression ; chaque endroit il est libre dans E. La définition précise doit faire attention afin d'éviter la capture variable accidentelle (voir également le macro hygiénique ). Par exemple, elle n'est pas correcte pour le (λ x.y) : = x à avoir comme conséquence le (le λ x.x), parce que le x substitué a été censé être libre mais a fini vers le haut d'être lié. La substitution correcte est dans ce cas-ci (λ z. Les règles précises sont définies inductivement comme suit : V : =
β-réduction
La bêta réduction exprime l'idée de l'application de fonction. La bêta réduction de   ; (( V de λ. E&prime du E ) ;   de ) ; est simplement   ; E : = '' E&prime ; ''   ; .
η-conversion
La conversion d'Eta exprime l'idée du Extensionality , qui dans ce contexte est que deux fonctions sont le même si et seulement si ils donnent le même résultat pour tous les arguments. convertis d'Eta-conversion entre le   ; X de λ.   du X du f ; et   ;   du f ; toutes les fois que le X de ne semble pas libre dans le f de .Cette conversion n'est pas toujours équivalente quand des expressions de lambda sont interprétées comme programmes. Évaluation de   ; X de λ.   du X du f ; peut se terminer même lorsque l'évaluation du f ne fait pas.
Arithmétique dans le calcul de lambda
Il y a plusieurs manières possibles de définir les nombres normaux dans le calcul de lambda, mais de loin les plus communs sont les numéros d'église de qui peuvent être définis comme suit :0 de
: = X du f de λ.
1 du X : = X du f de λ.
2 du X du f : = X du f de λ.
3 du f ( de f X ) : = X du f de λ. f ( f ( X de f )) et ainsi de suite. Un numéro d'église est une fonction évoluée - il prend un f de de fonction de simple-argument, et renvoie une autre fonction de simple-argument. Le numéral n de d'église est une fonction qui prend un f de de fonction comme argument et renvoie la composition du n -th de du f de , c. le f de de fonction composé avec lui-même des temps du n de . C'est dénoté du f de ( n ) et est en fait la puissance du n -th de du f de (considéré en tant qu'opérateur) ; le du f de (0) est défini pour être la fonction d'identité. De telles compositions répétées (d'un simple f de de fonction) se conforment aux lois de des exposants , qui est pourquoi ces numéros peuvent être employés pour l'arithmétique. Noter que 1 renvoie le f lui-même de , c. c'est essentiellement la fonction d'identité, et le de 0 renvoie la fonction d'identité. (Noter également que dans le calcul original du lambda de l'église, le paramètre formel d'une expression de lambda a été exigé pour se produire au moins une fois dans le corps de fonction, qui a rendu la définition ci-dessus de 0 impossible.)
Nous pouvons définir une fonction de successeur, qui prend un n de de nombre et renvoie le n de + 1 en ajoutant une application additionnelle du f de : SUCC de : = X du f du n de λ. f ( de f de n X ) Puisque la composition du m -th de du f de composé avec la composition du n -th de du f de donne la composition du m+n -th de du f de , l'addition peut être définie comme suit : PLUS de : = X du f du n du m de λ. f ( de f de m X ) du n PLUS peut être considéré comme fonction prenant deux nombres normaux comme arguments et renvoyant un nombre normal ; il peut vérifier que le   3 du PLUS 2 de ;   ; et   ;   ; 5 sont les expressions équivalentes de lambda. Depuis ajouter le m de à un nombre peut être accompli en ajoutant 1 des temps du m de , une définition équivalente est : PLUS de : = m de λ. m SUCC De même, la multiplication peut être définie en tant que MULT de : = f du n du m de λ. m ( de n f ) Alternativement MULT de : = n du m de λ. m (PLUS n ) 0, depuis multiplier le m de et le n de est le même que répétant le " ; ajouter le n " de ; temps du m de de fonction et puis application de lui à zéro. La fonction de prédécesseur définie par le   ; n de PRED = n - 1  ; pour un positif n et   de de nombre entier ; PRED 0 = 0  ; est considérablement plus difficile. Le PRED de de formule : = X du f du n de λ. h ( f de g )) ( u de λ.   du u ) ; peut être validé en montrant inductivement cela si T dénote le ( h de g de λ. h ( f de g )), puis T ( n ) ( u de λ. h ( de f ( n -1) ( X )) ) pour le n de > 0. Deux autres définitions de PRED sont données ci-dessous, un using les conditionals et l'autre using les paires . Avec la fonction de prédécesseur, la soustraction est franche. Définition du SUB de : = n du m de λ. m , du n PRED le n du m de SUB rapporte le m - le n de quand le m de > n et 0 autrement.
Logique et attributs
Par convention, les deux définitions suivantes (connues sous le nom de booleans d'église) sont employées pour les valeurs booléennes TRUE et FALSE : TRUE de : = y du X de λ. FALSE dedu X : = y du X de λ. du y (note que FALSE est équivalent au numéro zéro d'église défini ci-dessus) Puis, avec ces deux λ-limites, nous pouvons définir quelques opérateurs de logique (ce sont juste des formulations possibles ; d'autres expressions sont également correctes) : AND de : = p q de λ. OR de
du p q p : = p q de λ. NOT de
du p p q : = p de λ un b . p b un IFTHENELSE : = p de λ. p Nous pouvons maintenant calculer quelques fonctions de logique, par exemple : ≡ de de FALSE de AND de
VÉRITABLE ( p q de λ. le p q p ) VÉRITABLE →β FAUX VÉRITABLE le VÉRITABLE ≡ FAUX de
( de x/y de λ. X ) →β VRAI FAUX FALSE et nous voyons que le AND FALSE VRAI est équivalent à FALSE.
Un attribut de est une fonction qui renvoie une valeur booléenne. L'attribut le plus fondamental est ISZERO qui renvoie TRUE si son argument est le numéro 0 d'église, et FALSE si son argument est n'importe quel autre numéro d'église : ISZERO de : = n de λ. ) TRUE FAUX Les essais suivants d'attribut si le premier argument a lieu moins-que-ou-égal-à la seconde : LEQ de : = m n de λ. ISZERO ( SECONDAIRE m n ) , et depuis le m de = m n de LEQ du n IFF et n m , il de LEQ est franc pour établir un attribut pour l'égalité numérique.
La disponibilité des attributs et la définition ci-dessus de TRUE et de FALSE le rendent commode pour écrire le " ; si puis - else" ; expressions dans le calcul de lambda. Par exemple, la fonction de prédécesseur peut être définie comme 'le PRED de : = n de λ. ISZERO ( g 1) k (PLUS ( g k ) 1)) ( v de λ. 0) 0 ce qui peut être vérifié en montrant inductivement ce n ( g k de de λ. ISZERO ( g 1) k (PLUS ( g k ) 1)) ( v de λ. 0) sont le " ; ajouter le n - 1" de ; fonctionnent pour le n de > 0.
Paires
Une paire (2-tuple) peut être définie en termes de TRUE et FALSE, en employant le codage d'église de pour les paires . Par exemple, PAIR encapsule les paires ( X de , y de ), FIRST renvoie le premier élément des paires, et SECOND renvoie la seconde. PAIR := f du y du X de λ. FIRST de
du y du X du f : = p de λ. SECOND de
du p TRUE : = p de λ. NIL de
du p FALSE : = NULL VRAI de
du λ X.FALSE)
Une liste chaînée peut être définie comme ZÉRO pour la liste vide, ou PAIR d'un élément et d'une plus petite liste.
Comme exemple de l'utilisation des paires, la fonction de décaler-et-incrément qui trace le ( m , n ) au (le n , le n +1) peut être définie en tant que Φ de : = X de λ. PAIRES (DEUXIÈME x) (SUCC (DEUXIÈME X )) ce qui nous permet de donner peut-être la version la plus transparente de la fonction de prédécesseur : PRED de : = n de λ. D'ABORD ( n Φ (PAIRES 0 0))
Récursion
La récursion est la définition d'une fonction using la fonction elle-même ; sur le visage de lui, le calcul de lambda ne permet pas ceci. Cependant, cette impression est fallacieuse. Considérer par exemple le le factoriel f ( n ) de de fonction de périodiquement défini près f ( n ) = 1 de de, si n = 0 ; et n · f ( n -1), si n >0.
Dans le calcul de lambda, on ne peut pas définir une fonction qui s'inclut. Pour venir à bout ceci, on peut commencer par définir une fonction, ici appelée le g de , qui prend un f de de fonction comme argument et renvoie une autre fonction qui prend le n de comme argument : g de de
: = n du f de λ. (1, si n = 0 ; et n · f ( n -1), si n >0) .
La fonction que le g de renvoie est le 1 constant, ou le n chronomètre l'application du f de de fonction au n -1 de . Using l'attribut de ISZERO, et des définitions booléennes et algébriques décrites ci-dessus, le g de de fonction peut être défini dans le calcul de lambda.
Cependant, le g de par lui-même n'est toujours pas récursif ; afin d'employer le g de pour créer la fonction factorielle récursive, la fonction passée au g de comme f de doit avoir les propriétés spécifiques. À savoir, la fonction passée comme f de doit augmenter au de fonction le g appelé avec un argument -- et cet argument doit être la fonction qui a été passée comme f de encore !
En d'autres termes, le f de doit augmenter au g ( f ) de . Cet appel au g de alors augmentera à la fonction factorielle ci-dessus et calculera vers le bas à un autre niveau de récursion. Dans cette expansion le f de de fonction apparaîtra encore, et encore augmentera au g ( f ) de et continuera la récursion. Ce genre de fonction, où le f de = g ( f ) , s'appelle un à point fixe du g de , et il s'avère qu'il peut être mis en application dans le calcul de lambda using ce qui est connu en tant que l'opérateur paradoxal de ou opérateur à point fixe de et est représenté comme Y de -- le combinator du Y : Y de de
= g de λ. g ( X de X )) ( X de λ. g ( X de X ))
Dans le calcul de lambda, le Y g de est un point fixe du g de , car il augmente au g ( de Y g ) de . Maintenant, pour accomplir notre appel récursif à la fonction factorielle, nous appellerions simplement le   ; n ,   du g ( g de Y ) ; là où le n est le nombre nous calculons le factoriel de.
Le donné n = 5, par exemple, ceci augmente à : de
( n de λ. (1, si n = 0 ; et n ·(( Y g ) ( n -1)), si n >0)) 5
1, si 5 = 0 ; et 5·( g ( Y g ) (5-1)), si 5>0
5·
4) 5 (de g ( Y g )·( n de λ. (1, si n = 0 ; et n ·(( Y g ) ( n -1)), si
4) 5 du n >0)·(1, si 4 = 0 ; et 4·( g ( Y g ) (4-1)), si
5 de 4>0) ·(4·( g ( Y g ) 3))
5 de ·(4·( n de λ. (1, si n = 0 ; et n ·(( Y g ) ( n -1)), si
5 du n >0) 3)) ·(4·(1, si 3 = 0 ; et 3·( g ( Y g ) (3-1)), si 3>0))
5 de ·(4·(3·( g ( Y g ) 2)))…
Et ainsi de suite, évaluant la structure de l'algorithme périodiquement. Chaque fonction périodiquement définie peut être vue comme point fixe d'une autre fonction appropriée, et donc, using le Y de , chaque fonction périodiquement définie peut être exprimée comme expression de lambda. En particulier, nous pouvons maintenant proprement définir l'attribut de soustraction, de multiplication et de comparaison des nombres normaux périodiquement.
Fonctions calculables et calcul de lambda
Un F de de fonction : Le N de → du N des nombres normaux est un de la fonction calculable si et seulement si là existe un f de d'expression de lambda tels que pour chaque paire de X , le y dans le N ,   de ; F ( de X de ) =   du y ; si et seulement si   ;   du X du f ; ==  ; y ,   ; là où le X de et le y de sont les numéros d'église correspondant au X et au y , respectivement. C'est l'une des nombreuses manières de définir le Computability ; voir la thèse d'Église-Turing de pour un examen d'autres approches et de leur équivalence.
Undecidability de l'équivalence
Il n'y a aucun algorithme selon lequel prend comme expressions de l'entrée deux lambda et produit TRUE ou FALSE si les deux expressions sont équivalentes. C'était historiquement le premier problème pour lequel l'insolubilité pourrait être prouvée. Naturellement, afin de faire ainsi, la notion de l'algorithme doit être proprement définie ; L'église a employé une définition par l'intermédiaire des fonctions récurrentes, qui est maintenant connue pour être équivalente à toutes autres définitions raisonnables de la notion.La preuve de l'église ramène d'abord le problème à déterminer si une expression donnée de lambda a un la forme normale . Une forme normale est une expression équivalente qui ne peut pas être réduite pas plus. Alors il suppose que cet attribut est calculable, et peut par conséquent être exprimé en calcul de lambda. Bâtiment sur les premiers travaux à côté de Kleene et de construire une numérotation de Gödel de pour des expressions de lambda, il construit un e de d'expression de lambda qui suit de près la preuve théorème de l'imperfection de Gödel de du premier. Si le e de est appliqué à son propre nombre de Gödel de , des résultats d'une contradiction.
Langages de calcul et de programmation de lambda
Comme précisé par le le de classique de s 1965 de Landin Peter 'une correspondance entre algol 60 et Lambda-notation de l'église, la plupart des langages de programmation sont enracinées dans le calcul de lambda, qui fournit les mécanismes de base pour l'application procédurale d'abstraction et de procédé (sous-programme).
La mise en oeuvre du calcul de lambda sur un ordinateur implique de traiter le " ; functions" ; comme objets de première classe qui soulève des questions d'exécution pour des langages de programmation empiler-basés. Ceci est connu comme problème de Funarg de .
Les contre-parties les plus en avant au calcul de lambda dans la programmation sont les langages de programmation fonctionnelle qui mettent en application essentiellement le calcul augmenté avec quelques constantes et de Datatypes blèsent des utilisations de une variante de notation de lambda pour définir des fonctions, mais seulement son sous-ensemble purement fonctionnel (" ; Le pur blèsent < ! -- ce qui est le " ; vrai lisp" pur ; ? Arrangement de (langage de programmation) ? -->" ;) est vraiment équivalent au calcul de lambda.
Les langues fonctionnelles ne sont pas les seules pour soutenir des fonctions car les langues impératives , par exemple Pascal de première classe des objets de nombreux, ont longtemps soutenu passer des sous-programmes comme arguments à d'autres sous-programmes. En C et C-comme le sous-ensemble de C++ le résultat équivalent est obtenu en passant les indicateurs de au code des fonctions (sous-programmes). De tels mécanismes sont limités aux sous-programmes écrits explicitement dans le code, et ne soutiennent pas directement des fonctions de plus haut niveau. Quelques langages de type objet impératif ont des notations qui représentent des fonctions de n'importe quel ordre ; de tels mécanismes sont disponibles dans le C++ , la causerie et plus récemment dans le Eiffel (" ; agents" ;) et C# (" ; delegates" ;). Comme exemple, le " d'Eiffel ; agent" intégré ; expression
agent (x de : VRAI) : Le VRAI résultent : = x * extrémité de x
dénote un objet correspondant au x*x du λ X. d'expression de lambda (avec l'appel par valeur). Elle peut être traitée comme n'importe quelle autre expression, par exemple assigné à une variable ou passé autour aux routines. Si la valeur de square est l'expression ci-dessus d'agent, alors le résultat de s'appliquer square à une valeur a (β-réduction) est exprimé comme square.item (), où l'argument est passé comme tuple .
Un exemple du python de ceci emploie la forme de lambda de fonctions :
fonctionnel = lambda X : X ** 2
Ceci crée une nouvelle fonction anonyme et des noms il le fonctionnel qui peut être passé à d'autres fonctions, stockées dans les variables, le python etc. peut également traiter n'importe quelle autre fonction créée avec le rapport standard de def comme objets de première classe
Le même se tient pour l'expression de causerie
: X | X * x
C'est un objet de première classe (fermeture de bloc), qui peut être stocké dans les variables, passées comme arguments, etc.
Un exemple semblable de C++ (using la bibliothèque de Boost.Lambda) :
DST : : for_each (c.end (), DST : : cout << _1 * _1 << DST : : endl) ;
Ici le for_each standard de fonction de bibliothèque réitère au-dessus de tous les membres du récipient « c », et imprime la place de chaque élément. La notation _1 est convention de Boost.Lambda (à l'origine dérivée de Boost.Bind) pour représenter le premier élément de texte d'attente (le premier argument), représenté comme X ailleurs.
Un délégué simple de C# prenant une variable et renvoyant la place. Cette variable de fonction peut alors être passée à d'autres méthodes (ou à délégués de fonction)
//Declare une signature de délégué délégué double MathDelegate (double i) ; //Create un exemple de délégué MathDelegate f = délégué (double i) {Math.Pow de retour (I, 2) ; } ;
variable de fonction de //Passing « f » à une autre méthode, s'exécutant, // et renvoi du résultat de la fonction le double s'exécutent (MathDelegate fonctionnel) { fonctionnel de retour (100) ; }
Dans le cadre 3.NET, C# a des expressions de lambda sous une forme semblable au python ou blèse. Les résolutions d'expression à un délégué comme dans l'exemple précédent mais ce qui précède peuvent être simplifiées à ci-dessous.
//Create un exemple de délégué MathDelegate => i de f = d'I * I ; Exécuter (f) ; // ou plus simplement mis Exécuter (=> i d'I * i) ;
Simultanéité et parallélisme
La propriété d'Église-Rosser du calcul de lambda signifie que l'évaluation (β-réduction) peut être effectuée dans le n'importe quel ordre , même concurremment. (En effet, le calcul de lambda est le referentially transparent.) Tandis que ceci signifie le calcul de lambda peut modeler les stratégies d'évaluation non déterministes de divers , il n'offre aucune notion plus riche du parallélisme , ni peut il exprès toutes les issues de la simultanéité . Le modèle d'acteur de et les calculs de processus tel que le CSP , le CCS , le calcul de π de et le calcul ambiant ont été conçus pour de tels buts.
Bien que le calcul non déterministe de lambda soit capable de l'expression tout le récursif partiel fonctionne , il n'est pas capable d'exprimer tous les calculs de . Par exemple il n'est pas capable d'exprimer le nondeterminism illimité ( c. de chaque expression non déterministe de lambda qui est garantie pour se terminer ; se termine en nombre fini d'expressions). Cependant, il y a des programmes concourants garantis pour s'arrêter qui se terminent en nombre infini des états 1981, Hewitt 2006.
Voir également
style=" deRécursion anonyme
Logique combinatoire
Isomorphisme de Cari-Howard de
Stratégie d'évaluation
Chevaliers de du calcul de lambda
Cube en lambda
Réécriture
Calcul de combinator de SKI de
Système F
Calcul de des constructions
Calcul de lambda dactylographié par
Unlambda
calcul de la Lambda-MU de
Catégorie fermée cartésienne
.
| Random links: | DAS Rheingold | Transfert de temps et de fréquence | Ottmar Liebert | Caradocus | Les brogues | Cálculo_de_la_lambda |