Algorithmique et Programmation Fonctionnelle Algorithmique et Programmation Fonctionnelle RICM3 Cours 9 : Lambda-calcul Benjamin Wack Polytech 2013 - 2014 1 / 37 Algorithmique et Programmation Fonctionnelle La dernière fois I Typage I Polymorphisme I Inférence de type I Ordre supérieur 2 / 37 Algorithmique et Programmation Fonctionnelle Correction de l’exercice let flop f x y = f y x On pose x : α On pose y : β f y est typable seulement si f : β → γ et alors f y : γ f y x = (f y) x est typable seulement si γ = α → δ et alors f y x : δ D’où f : β → α → δ D’où flop : (β → α → δ) → (α → β → δ) 3 / 37 Algorithmique et Programmation Fonctionnelle Plan Contexte λ-termes Évaluation Modélisation Récursivité Conclusion 4 / 37 Algorithmique et Programmation Fonctionnelle Contexte Historique L’informatique n’est pas une science nouvelle I Représentation symbolique de l’information calculi = petits cailloux I Algorithmes al-Khwarizmi 783-850, Euclide -300, Babylone -1800 I Langages symboliques Musique, équations, chimie I Machines Boulier (mémoire), Pascaline (calculatrice), métier Jacquard (programmable)... mais ce ne sont pas des ordinateurs ! 6 / 37 Algorithmique et Programmation Fonctionnelle Contexte Le premier ordinateur ENIAC 1946 Première machine universelle (capable d’exécuter tout programme) ENIAC modifié 1948 Programme stocké en mémoire (architecture de Von Neumann) Machine de Turing 1937 I un ruban infini (' mémoire) I une tête de lecture / écriture (' bus) I une “table d’actions” (' processeur) I modèle théorique de ce qu’est un algorithme... I ...mais il existe une machine capable de toutes les simuler 7 / 37 L’ordinateur n’a pas été découvert, il a été inventé ! Algorithmique et Programmation Fonctionnelle 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 I Variables = mémoire ruban infini (et même à accès direct) I Conditionnelle = branchement enchaînement d’un calcul et d’une action I Boucle = manipulation du registre PC cycle dans la table d’action I ... 8 / 37 Algorithmique et Programmation Fonctionnelle Contexte À quel machine correspond un langage fonctionnel ? Aucune ! I Au modèle fonctionnel : le λ-calcul I proposé par Alonzo Church en 1936 pour modéliser ce qu’est une fonction calculable (i.e. par une machine) I Les deux modèles ont été montrés équivalents en 1937 par Turing. 9 / 37 Algorithmique et Programmation Fonctionnelle λ-termes Syntaxe Notations I x , y , z... sont des variables I A, B, C ...M, N sont des termes Termes Un terme peut être : I une variable x I une abstraction λx .A où A est un terme et x une variable (équivaut à fun x -> A) I une application A B où A et B sont deux termes I et c’est tout ! 11 / 37 Algorithmique et Programmation Fonctionnelle λ-termes Conventions Application prioritaire λx .x y = λx .(x y ) et pas (λx .x ) y Application associative à gauche (AB1 B2 . . . Bk ) = (. . . ((AB1 )B2 ) . . . Bk ) Abréviation des abstractions (λx1 .λx2 . . . . λxk .A) = (λx1 .(λx2 . . . . (λxk .A) . . .) = (λx1 x2 . . . xk .A) Quizz I A B C = ((A B) C ) I f (λx .x ) y = (f (λx .x )) y I λx .(λy .y z) x = λx .((λy .(y z)) x ) 12 / 37 Algorithmique et Programmation Fonctionnelle λ-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 : I ∀x .P(x ) I for (int i=0 ; i<n ; i++) { ... } I Rb a f (x )dx On parle de variable liée, ou aussi variable muette. 13 / 37 Algorithmique et Programmation Fonctionnelle λ-termes α-conversion Peut-on vraiment choisir un nom arbitraire pour une variable liée ? λx .x y 6= λ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 14 / 37 Algorithmique et Programmation Fonctionnelle λ-termes Substitution On note A[x := B] pour « remplacer les occurrences de x par B dans A ». Précautions : I (λx z.y )[x := A] = λA.y ?? λA.y n’est pas valide DONC ne pas remplacer après un λ. I (λx z.x z)[x := y ] = λx .y ?? x est liée au λ DONC ne pas la remplacer. I (λx z.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. 15 / 37 Algorithmique et Programmation Fonctionnelle É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 ) - : int = 6 6 ;; 17 / 37 Algorithmique et Programmation Fonctionnelle Évaluation Notations I → pour →β I →∗ la clôture réflexive transitive : A →∗ B ssi ∃n ≥ 0, A0 , . . . , An , A = A0 → A1 → . . . → An = B → passe au contexte : I si A → B alors AC → BC et CA → CB I si A → B alors λx .A → λx .B 18 / 37 Algorithmique et Programmation Fonctionnelle Évaluation Exercices I (λx .xx )(λy .y ) →β (λy .y )(λy .y ) →β λy .y I (λx .(λy .xy ))y =α (λx .(λz.xz))y →β λz.yz 19 / 37 Algorithmique et Programmation Fonctionnelle Évaluation η-réduction (λx .Ax ) B →β A B pour tout B mais λx .Ax 6→β A d’où une autre réduction λx .Ax →η A si x n’apparaît pas dans A Aucun intérêt pour le calcul, mais utile pour le typage. 20 / 37 Algorithmique et Programmation Fonctionnelle Modélisation Expressivité Que peut-on calculer avec ça ? I “Tout” ! (thèse de Church-Turing) I En particulier tout ce qui constitue les algorithmes Structures de contrôle I Conditionnelle I Boucles ? 22 / 37 Algorithmique et Programmation Fonctionnelle Modélisation Expressivité * Données I Booléens I Entiers I n-uplets I Et bien sûr, fonctions 23 / 37 Algorithmique et Programmation Fonctionnelle Modélisation Booléens vrai = λxy .x faux = λxy .y 24 / 37 Algorithmique et Programmation Fonctionnelle 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 →∗ A Exercice : ifthenelse faux A B →∗ B 25 / 37 Algorithmique et Programmation Fonctionnelle 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 26 / 37 Algorithmique et Programmation Fonctionnelle 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 π2 = λs.s faux Vérifier que π2 λz.zAB →∗ B 27 / 37 Algorithmique et Programmation Fonctionnelle 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 : si n = λfx .f n x comment écrire A tel que An →∗ 2n ? λnfx .n(λy .f (f y )) x 28 / 37 Algorithmique et Programmation Fonctionnelle Modélisation En TD I Successeur 1. soit en ajoutant un f en tête, 2. soit en queue. I addition I multiplication I exponentielle I test à zéro 29 / 37 Algorithmique et Programmation Fonctionnelle 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. 31 / 37 Algorithmique et Programmation Fonctionnelle 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. I Combinateur Y de Church (YF =β F (YF ) ) I Combinateur Θ de Turing (ΘF →∗ F (ΘF ) ) 32 / 37 Algorithmique et Programmation Fonctionnelle 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 )) 33 / 37 Algorithmique et Programmation Fonctionnelle Récursivité Point fixe de Turing Θ Comment trouver Θ tel que ΘF →∗ F (ΘF ) Θ = (λg.λh.h(ggh))(λg.λh.h(ggh)) 34 / 37 Algorithmique et Programmation Fonctionnelle Conclusion Aujourd’hui I Lambda-calcul 36 / 37 Algorithmique et Programmation Fonctionnelle Conclusion Prochaine fois I Traits impératifs I Compléments 37 / 37