Algorithmique et Programmation Fonctionnelle RICM3 Cours 9 : Lambda-calcul Benjamin Wack Polytech 2014-2015 1 / 35
La dernière fois Typage Polymorphisme Inférence de type 2 / 35
Plan Contexte λ-termes Évaluation Modélisation Récursivité Propriétés du λ-calcul 3 / 35
Contexte Qu est-ce qu un langage de programmation? Un langage commun entre l homme et la machinela machine = Assembleur Un langage commun entre l homme et un modèle de la machine Variables = mémoire accès par références et pas par adresses Conditionnelle = branchement enchaînement d un calcul et d une action Boucle = manipulation du registre PC cycle dans la table d action... 5 / 35
Contexte À quel machine correspond un langage fonctionnel? Aucune! Au modèle fonctionnel : le λ-calcul proposé par Alonzo Church en 1936 pour modéliser ce qu est une fonction calculable (i.e. par une machine) Les deux modèles ont été montrés équivalents en 1937 par Turing. 6 / 35
λ-termes Syntaxe Notations x, y, z... sont des variables A, B, C...M, N sont des termes Termes Un terme peut être : une variable x une abstraction λx.a où A est un terme et x une variable (équivaut à fun x -> A) une application A B où A et B sont deux termes et c est tout! 8 / 35
λ-termes Conventions Application prioritaire λx.x y = λx.(x y) et pas (λx.x) y Application associative à gauche (AB 1 B 2... B k ) = (... ((AB 1 )B 2 )... B k ) Abréviation des abstractions (λx 1.λx 2.... λx k.a) = (λx 1.(λx 2.... (λx k.a)...) = (λx 1 x 2... x k.a) Quizz A B C = ((A B) C) f (λx.x) y = (f (λx.x)) y λx.(λy.y z) x = λx.((λy.(y z)) x) 9 / 35
λ-termes Notion de variable liée Quelle différence y a-t-il entre fun x -> x et fun y -> y? Aucune, ce qui importe n est pas le nom de la variable mais les endroits où elle est présente. Situations similaires omniprésentes en informatique et en mathématiques : x.p(x) for (int i=0 ; i<n ; i++) {... } b a f (x)dx On parle de variable liée, ou aussi variable muette. 10 / 35
λ-termes α-conversion Peut-on vraiment choisir un nom arbitraire pour une variable liée? λx.x y λy.y y (capture) α-conversion = renommer une variable liée sans utiliser une variable déjà présente dans le terme Exemple : λx.xy = α λz.zy 11 / 35
λ-termes Substitution On note A[x := B] pour «remplacer les occurrences de x par B dans A». Précautions : (λx.y)[x := A] = λa.y?? λa.y n est pas valide DONC ne pas remplacer après un λ. (λx.x)[x := y] = λx.y?? x est liée au λ DONC ne pas la remplacer. (λx.y)[y := x] = λx.x?? y n est pas liée mais le devient DONC renommer avant Bref : toujours effectuer une α-conversion avant de substituer. 12 / 35
λ-termes Substitution On note A[x := B] pour «remplacer les occurrences de x par B dans A». Précautions : (λz.y)[x := A] = λz.y λa.y n est pas valide DONC ne pas remplacer après un λ. (λz.z)[x := y] = λz.z x est liée au λ DONC ne pas la remplacer. (λz.y)[y := x] = λz.x y n est pas liée mais le devient DONC renommer avant Bref : toujours effectuer une α-conversion avant de substituer. 12 / 35
Évaluation β-réduction Les λ-termes sont des expressions qui ont donc vocation à être évaluées. Une règle locale (λx.a) B β A[x := B] peut être appliquée partout dans le terme, répétée... Exemples : (λx.x) B β B (λx.x y) λz.z β (λz.z) y β y (fun x -> x ) 6 ;; - : int = 6 14 / 35
Évaluation Notations pour β la clôture réflexive transitive : A B ssi n 0, A 0,..., A n, A = A 0 A 1... A n = B passe au contexte : si A B alors AC BC et CA CB si A B alors λx.a λx.b 15 / 35
Évaluation Exercices (λx.xx)(λy.y) β (λy.y)(λy.y) β λy.y (λx.(λy.xy))y = α (λx.(λz.xz))y β λz.yz 16 / 35
Modélisation Expressivité Que peut-on calculer avec ça? Tout! (thèse de Church-Turing) En particulier tout ce qui constitue les algorithmes Structures de contrôle Conditionnelle Boucles? 18 / 35
Modélisation Expressivité * Données Booléens Entiers n-uplets Et bien sûr, fonctions 19 / 35
Modélisation Booléens vrai = λxy.x faux = λxy.y 20 / 35
Modélisation Conditionnelle ifthenelse = λbuv.buv Vérifions ifthenelse vrai A B A ifthenelse vrai A B = (λbuv.buv) vrai A B (λuv.vrai uv) A B (vrai A B) = (λxy.x)a B Exercice : ifthenelse faux A B B A 21 / 35
Modélisation Exercice : définir les connecteurs logiques non non = λb.ifthenelse b faux vrai λb.b faux vrai et et = λab.ifthenelse a b faux λab.a b faux ou ou = λab.ifthenelse a vrai b λab.a vrai b 22 / 35
Modélisation Couples Le couple (A, B) est représenté par λz.zab Projections π 1 = λs.s vrai Vérifier que π 1 λz.zab A Vérifier que π 2 λz.zab B π 2 = λs.s faux 23 / 35
Modélisation Entiers de Church 0 = λfx.x 1 = λfx.fx 2 = λfx.f (fx) et d une manière générale : n = λfx.f (f (...(fx)...)) = λfx.f n x avec f itérée n fois. Exemple : itération itere = λnuv.nuv v est le cas de base et u une fonction. Si n est nul, on calcule v, sinon on calcule u n (v). 24 / 35
Modélisation En TD Successeur 1. soit en ajoutant un f en tête, 2. soit en queue. addition multiplication exponentielle test à zéro 25 / 35
Récursivité Une première boucle Soit ω = λx.xx et Ω = ωω = (λx.xx)(λx.xx) (λx.xx)(λx.xx) β (λx.xx)(λx.xx) Donc Ω β Ω β... Propriété La β-réduction ne termine pas en général. 27 / 35
Récursivité Notion de point fixe Théorème Tout λ-terme F a un point fixe x, x = β Fx Définition Un λ-terme Y tel que pour tout F, YF soit un point fixe de F est un combinateur de point fixe. Combinateur Y de Church (YF = β F (YF ) ) Combinateur Θ de Turing (ΘF F (ΘF ) ) 28 / 35
Récursivité Point fixe de Church Y Comment trouver Y tel que YF = β F (YF )? Indice : partir de (λx.xx)(λx.xx) Y = λf.(λx.f (xx))(λx.f (xx)) 29 / 35
Récursivité Point fixe de Turing Θ Comment trouver Θ tel que ΘF F (ΘF ) Θ = (λg.λh.h(ggh))(λg.λh.h(ggh)) 30 / 35
Algorithmique et Programmation Fonctionnelle Propriétés du λ-calcul Church-Rosser Confluence Soient t, u 1 et u 2 des λ-termes tels que t u 1 et t u 2. Alors il existe un λ-terme v tel que u 1 v et u 2 v. t u 1 u 2 Preuve difficile. v 32 / 35
Propriétés du λ-calcul Terminaison Normalisation faible Tout terme admet une suite finie de β-réductions à la suite desquelles il n est plus réductible. Normalisation forte Aucun terme n admet de suite infinie de β-réductions. À condition de rajouter un système de types. 33 / 35
Propriétés du λ-calcul Corollaire Unicité de la forme normale Si la réduction d un terme donne un terme en forme normal alors ce terme est unique. Preuve Supposons que t se β-réduise en u et v deux termes normaux distincts. En appliquant le théorème, il exite w tel que u w et v w. Or comme u et v sont normaux nous obtenons u = w et v = w. 34 / 35
Propriétés du λ-calcul Conclusion Aujourd hui Lambda-calcul Expressivité Un autre apport d un système de types Prochaine fois Traits impératifs Compléments 35 / 35