340 likes | 495 Views
Programmation fonctionnelle Lambda-calcul. A. Introduction Définition, Caractéristiques, Schéma fonctionnel, Quelques langages fonctionnels B. Lambda-calcul Variables et fonctions en mathématiques La -notation, Fonction à plusieurs arguments
E N D
Programmation fonctionnelleLambda-calcul • A. Introduction • Définition, • Caractéristiques, • Schéma fonctionnel, • Quelques langages fonctionnels • B. Lambda-calcul • Variables et fonctions en mathématiques • La -notation, • Fonction à plusieurs arguments • Les systèmes -applicatifs, • Grammaire du -calcul • Notion de variables libres et liées,
Programmation fonctionnelleLambda-calcul • B. Lambda-calcul • Changement de variables • Substitution • Contraction • Réduction • Théorie propre du -calcul • Forme normale • Ordre de réduction • Théorème de Church-Rosser ( première forme ) • Théorème de Church-Rosser ( deuxième forme ) • Fonctions récursives
Programmation fonctionnelleLambda-calcul • Introduction • Définition : • Le traitement est décrit par application de fonction. • Exemple : f[g(x, h(x), f(x-1, g(h(x-1), 2) ] • Caractéristiques : • Facilité d'exprimer et de prouver les programmes. • Basé sur un système formel (Lambda-calcul) • Absence d'affectation • Absence de contrôle explicite ( GOTO, EXIT). les langages fonctionnels ne sont pas impératifs. • calcul basé sur les fonctions.
Programmation fonctionnelleLambda-calcul • Introduction • Schéma de programme fonctionnel: • Un seul type de contrôle implicite : Si Cond alors inst1 sinon inst2 Fsi. • Les instructions peuvent être : conditionnelle, appel de fonction. • Exemple • Fact(n) : Si n = 0 alors 1 sinon mult(n, Fact(n-1)) Fsi
Programmation fonctionnelleLambda-calcul • Introduction • Exemple de langages fonctionnels: • LISP ( Processor of Listes, Mac Carthy 1960) • ISWIN ( Landin 66) • FP ( Backus 78) • HOPE (80) • MIRANDA(85)
Programmation fonctionnelleLambda-calcul • Variables et fonctions en mathématiques : Inconvénient de la notation usuelle • En mathématiques, la notation usuelle f(x) ne nous permet pas de distinguer entre la fonction elle-même et la valeur de la fonction pour une valeur déterminée de la variable. • Ce défaut apparaît clairement dans les théories qui utilisent les fonctions de fonctions: Par exemple, dans les théories qui utilisent les opérateurs P et Q, l'application de l'opérateur P à la fonction f(x) est généralement notée P[f(x)]. Que signifie alors P[f(x+1)] ?
Programmation fonctionnelleLambda-calcul • La -notation • Si nous notons par M l'expression qui contient x qui indique la valeur de la fonction quand l'argument a la valeur x nous écrivons x(M) pour désigner la fonction elle-même. Cette formation est abstraction fonctionnelle. • Pour désigner la valeur de la fonction pour la valeur 0 par exemple nous écrivons x(M) (0). • Ainsi, x(x2) est la fonction carré. • Autres abréviations : xM, µx.M
Programmation fonctionnelleLambda-calcul • Fonction à plusieurs arguments • Pour des fonctions à plusieurs arguments, nous pouvons aussi définir une abstraction fonctionnelle : • nx1x2....xn.M • y(x+y) : désigne l'opération d'addition de l'argument y à x. ( x est alors fixe). • c'est f(y) = x+y • x(y(x+y)) c'est f(x,y) = x +y • 2xy.x+y ou x: y.x+y
Programmation fonctionnelleLambda-calcul • Les systèmes -applicatifs • Un système applicatif, défini de manière générales, est un système dans lequel les seules opérations sont l'abstraction fonctionnelle et des applications. • L'application est représentée par une simple juxtaposition. Ainsi fab signifie f appliqué à a, puis le résultat appliqué à b. • Donc fab est (fa)b. • fabc c'est ((fa)b)c • De cette façon, les valeurs de fonctions à plusieurs variables sont construites progressivement.
Programmation fonctionnelleLambda-calcul • Grammaire du -calcul • Syntaxe • V = { x, y, ...} ensemble des variables. • C = { a, b, ...} ensemble des constantes. • L --> C / op • L --> V • L --> ( L L ) associativité à gauche(application) • L --> (V L) associativité à droite(abstraction fonctionnelle)
Programmation fonctionnelleLambda-calcul • Grammaire du -calcul • ( L L L ) c'est ( (L L) L ) • (xyL ) c'est (x (yL) ) • Exemple : • (xx) est obtenu par abstraction : f(x) • ((xx)3) est obtenu par application : f(3)
Programmation fonctionnelleLambda-calcul • Notion de variables libres et liées • Une occurrence d'une variable x dans Y est liée ssi x est à l'intérieur d'une partie de Y de la forme x.Z, sinon elle est libre. • Variables libres • Soit X, Y dans L et soit x dans V et a dans C. • Varlib(a) = {} • Varlib(x) = {x} • Varlib(XY)= Varlib(X) U Varlib(Y) • Varlib(xX)= Varlib(X) - {x}
Programmation fonctionnelleLambda-calcul • Notion de variables libres et liées • Variables liées • Varlié(a) = {} • Varlié(x) = {} • Varlié(XY)= Varlié(X) U Varlié(Y) • Varlié(xX)= Varlié(X) U {x}
Programmation fonctionnelleLambda-calcul • Notion de variables libres et liées : Exemple • X = ( (x(y.y) z.x) • de la forme X = ( M N) • Varlib(X) = • Varlib(y.y) - {x}Uvarlib(x)-{z} • Varlib(y)- {y} - {x} U {x} - {z} • {y} - {y} - {x} U {x} - {z} • {} U {x} • {x}
Programmation fonctionnelleLambda-calcul • Notion de variables libres et liées : Exemple • X = ( (x(y.y) z.x) ) • de la forme X = ( M N) • Varlié(X) = • Varlié(y.y) +{x}UVarlié(x)+ {z} • Varlié(y) + {y} + {x} U {} + {z} • {} + {y} + {x} U {} + {z} • { x, y, z }
Programmation fonctionnelleLambda-calcul • Notion de variables libres et liées • Nous remarquons que x est liée dans M mais libre dans N. Nous pourrions écrire indifféremment • X = ( (t(y.y)) z.x)) • car on peut toujours changer le nom de la variable liée.
Programmation fonctionnelleLambda-calcul • Changement de variable liée : (Alpha-conversion) • (Alpha) : Si y n'est pas libre dans M, alors x.M = y[y/x]M. • Congruence : • X est congruent à Y ssi Y est le résultat d'application d'une série de changements de variables liées. • La congruence est une relation d'équivalence.
Programmation fonctionnelleLambda-calcul • Substitution • Soit N et M dans L et x une variable libre de M. • [N/x]M : substituer N aux occurrence libre de x dans M. • [N/x]a = a • [N/x]x = N • [N/x]y = y si y # x • [N/x](M1M2) = [N/x]M1 [N/x]M2 • [N/x](µxM) = (xM)
Programmation fonctionnelleLambda-calcul • Substitution • [N/x]( yM) = • x # y • y non libre dans N • c'est (y [N/x] M ) • y libre dans N • c'est z [N/x] ([z/y]M) • Exemple : • Prenons M = y.xy et N = y • [t/x] y.xy = y.yt (1) • [y/x] y.xy = y.yy (confusion) • =[y/x] z.xz =z.zt ce qui est équivalent à(1)
Programmation fonctionnelleLambda-calcul • Contraction : Béta-conversion • Une -expression de la forme ( x.M) N s'appelle un Béta-radical ou Béta-rédex ou rédex. • avec ( x.M) une abstraction fonctionnelle et • (x.M) N une application • (Beta) : (x.M) N = [N/x] M • si x.M est une fonction, son application à n'importe quel N doit être vue comme le résultat de la substitution de x par N dans M
Programmation fonctionnelleLambda-calcul • Remarques • Les règles (Alpha) et (Béta) prises ensemble constituent la Beta-conversion. • La règle (Alpha) prise seule constitue la Alpha-conversion.
Programmation fonctionnelleLambda-calcul • Réduction • X se réduit à Y (=>) ssi Y est le résultat d'une série(éventuellement vide) de changement de variables liée et de contractions. • => est réflexive et transitive. • Exemples : • 1. ( x.xy)F => Fy • 2. (x.y)F => y • 3. (x.(y.yx)z)v)=> [v/x](( y.yx)z) == (y.yv)z => [z/y] (yv] == zv • 4. (x.xxy)( x.xxy) => (x.xxy)( x.xxy)y • => (x.xxy)( x.xxy)yy => ect...
Programmation fonctionnelleLambda-calcul • Théorie propre du -calcul • L'ensemble des énoncés de la forme X >> Y qui sont vrai. • Règles : Alpha, Béta, Axiome( X >> X) • et les règles de déductions : • 1. X >> Y ==> ZX >> ZY • 2. X >> Y ==> XZ >> YZ • 3. X >> Y ==> x.X >> x.Y • 4. X >> Y et Y >> Z ==> X >> Z
Programmation fonctionnelleLambda-calcul • Théorie propre du -calcul • Formellement, nous dirons que X >> Y ssi il existe une preuve de cet énoncé utilisant uniquement les axiomes et les règles ci dessus. • (Eta) : Si x n'est pas libre dans M,alors x.(Mx) = M • (Tau) : Si x n'est pas libre ni dans M ni dans N alors • Mx = Nx ==> M = N
Programmation fonctionnelleLambda-calcul • Forme normale : • Un objet sera dit être dans une forme normale, d'une certaine -expression s'il ne contient aucun rédex. [ (x.M) N ] • Dans l'exemple 3, zv est la forme normale de ( x.(y.yx)z)v) • Le terme de l'exemple 4 n'a pas de forme normale.
Programmation fonctionnelleLambda-calcul • Ordre de réduction • Ordre normal : Plus externe, plus à gauche dans le même niveau. ( par nom) • par valeur : Plus interne, Plus à gauche dans le même niveau • Il existe d ’autres ordres • Deux chemins différents de réduction peuvent-ils aboutir à des formes normales différentes ?
Programmation fonctionnelleLambda-calcul • Théorème de Church-rosser première forme • Si U=>X et U=>Y, il existe Z tel que X=>Z et Y=>Z. • Corollaire : • Si U a des formes normales X et Y, alors X est congruent à Y ( On peut passer de X à Y par des changements de variables )
Programmation fonctionnelleLambda-calcul • Théorème de Church-rosser ( deuxième forme ) • Si E1 ==> E2 et Si E2 forme normale • alors il existe une suite de réduction de E1 à E2 selon l ’ORDRE NORMAL. • L ’ordre normal garantit de trouver une forme normale si elle existe mais ne garantit pas de la trouver par un nombre minimum de réduction.
Programmation fonctionnelleLambda-calcul • Fonctions récursives • soit Fact = (n. (si (= n 0) 1 (* n (Fact ( - n 1) ) ) ) • de la forme Fact = n. ( ….Fact …) • par une Béta-abstraction • Fact = ( fac .(n. ( …fac …))) Fact • Fact = H Fact (1) • avec H = ( fac .(n. ( …fac …))) • (1) implique que Fact est un point fixe de H.
Programmation fonctionnelleLambda-calcul • Fonctions récursives • Il suffit donc de trouver un point fixe de H. • On démontre que YH = H (YH) , c ’est à dire que YH est un point fixe de H. • Y est appelé le combinateur du point fixe. • Solution Fact = YH.
Programmation fonctionnelleLambda-calcul • Fonctions récursives : Exemple : Calcul de Fact 1 • YH 1 = • H (YH) 1 • ( fac. n. si (= n 0) 1 (* n (fac ( - n 1 )))) YH 1 • ( n. si (= n 0) 1 (* n ( YH ( - n 1 )))) 1 • si (= 1 0) 1 (* 1 ( YH ( - 1 1 ))) • * 1 ( YH 0 ) • * 1 ( H (YH) 0 ) • * 1 (fac. n. si (= n 0) 1 (* n (fac ( - n 1 )))) (YH) 0 ) • * 1 ( n. si (= n 0) 1 (* n ( YH ( - n 1 )))) 0 • * 1 (si (= 0 0) 1 (* 0 ( YH ( - 0 1 ))) • * 1 ( 1) • 1
Programmation fonctionnelleLambda-calcul • Fonctions récursives : Combinateur Y • Y =( h . (x. h ( x x)) (x.h (x x)) ) • Montrons que YH = H (YH) • YH = ( h . (x. h ( x x)) (x.h (x x)) ) H • YH = (x. H ( x x)) (x.H (x x)) • YH = H (x.H (x x) (x.H (x x) • YH = H ( YH ) • Donc YH point fixe de H.