La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Programmation fonctionnelle Lambda-calcul

Présentations similaires


Présentation au sujet: "Programmation fonctionnelle Lambda-calcul"— Transcription de la présentation:

1 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 Les systèmes -applicatifs, Grammaire du -calcul Notion de variables libres et liées,

2 Programmation fonctionnelle Lambda-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

3 Programmation fonctionnelle Lambda-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.

4 Programmation fonctionnelle Lambda-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

5 Programmation fonctionnelle Lambda-calcul
Introduction Exemple de langages fonctionnels: LISP ( Processor of Listes, Mac Carthy 1960) ISWIN ( Landin 66) FP ( Backus 78) HOPE (80) MIRANDA(85)

6 Programmation fonctionnelle Lambda-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)] ?

7 Programmation fonctionnelle Lambda-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

8 Programmation fonctionnelle Lambda-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

9 Programmation fonctionnelle Lambda-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.

10 Programmation fonctionnelle Lambda-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)

11 Programmation fonctionnelle Lambda-calcul
Grammaire du -calcul ( L L L ) c'est ( (L L) L ) (xyL ) c'est (x (yL) ) Exemple : (xx) est obtenu par abstraction : f(x) ((xx)3) est obtenu par application : f(3)

12 Programmation fonctionnelle Lambda-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}

13 Programmation fonctionnelle Lambda-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}

14 Programmation fonctionnelle Lambda-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}

15 Programmation fonctionnelle Lambda-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 }

16 Programmation fonctionnelle Lambda-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.

17 Programmation fonctionnelle Lambda-calcul
Changement de variable liée : (Alpha-conversion) Un changement de variable liée dans un terme X est le remplacement d'une partie de X de la forme y.Z, avec y non liée dans Z, par v.[v/y]Z pour tout v qui n'est ni libre ni liée dans Z. (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.

18 Programmation fonctionnelle Lambda-calcul
Substitution Soit N et M dans L et x une variable libre de M. [N/x]M : substituer N à 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)

19 Programmation fonctionnelle Lambda-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)

20 Programmation fonctionnelle Lambda-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) : Si x n'est pas liée dans M alors (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

21 Programmation fonctionnelle Lambda-calcul
Contraction : Béta-conversion Ici aussi, il y a possibilité de confusion de variables. Supposons M = x.xy et N = y. La substitution de x par N sans tenir compte des variables liées dans M nous donne y.yy Mais si nous transformons M en z.zy ( par (alpha) ) puis nous substituons x par y nous obtenons finalement z.zy Il s'agit en d'autres termes d'une substitution aux occurrences libre de x dans M. Donc, une telle confusion peut apparaître si une variable libre dans N est liée dans N. Ainsi, l'objet Béta-rédex a pour contractant [N/x]M qui est une Béta-contraction.

22 Programmation fonctionnelle Lambda-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.

23 Programmation fonctionnelle Lambda-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...

24 Programmation fonctionnelle Lambda-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

25 Programmation fonctionnelle Lambda-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

26 Programmation fonctionnelle Lambda-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.

27 Programmation fonctionnelle Lambda-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 ?

28 Programmation fonctionnelle Lambda-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 )

29 Programmation fonctionnelle Lambda-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.

30 Programmation fonctionnelle Lambda-calcul
Fonctions récursives soit Fact = ( n. si (= n 0) 1 (* n (Fact ( - x 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.

31 Programmation fonctionnelle Lambda-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.

32 Programmation fonctionnelle Lambda-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 ( 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 ( ))) * 1 ( 1) 1

33 Programmation fonctionnelle Lambda-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.


Télécharger ppt "Programmation fonctionnelle Lambda-calcul"

Présentations similaires


Annonces Google