2014-09-04
1
IFT359 – Programmation fonctionnelle
Thème #1
Introduction à la programmation fonctionnelle,
le λ-calcul
1
LES STYLES DE PROGRAMMATION
LA PROGRAMMATION FONCTIONNELLE
2
Les styles de programmation
• Programmation impérative
– programmation structurée
• Programmation logique
• Programmation objet
• Programmation fonctionnelle
• Ne pas confondre style de programmation et langage de
programmation.
– Il est possible de faire de la programmation fonctionnelle en C et
inversement de faire de la programmation impérative en DrRacket.
Les langages sont conçus pour favoriser un style de programmation.
• Dans ce cours, vous apprenez la programmation fonctionnelle
– Apprendre à programmer avec DrRacket est le moyen préconisé pour
atteindre ce but
3
La programmation fonctionnelle
Un aperçu
• Utilise sous sa forme stricte que deux formes syntaxiques
– fonction
– application de fonction
• Les fonctions sont des objets de première classe
• La récursion est la principale structure de contrôle
• Une grande attention est portée aux listes
– sous une forme stricte, les listes sont définies comme une fonction
– la récursion sur les sous-listes remplace les boucles
• Plusieurs langages fonctionnelles déconseillent l’utilisation de
– l’affectation
– les effets de bord
• Un programme n’est pas une séquence d’instructions mais une
expression à évaluer et des définitions de fonctions
4
2014-09-04
2
Les langages multiparadigmes
• Plusieurs langages modernes ont intégré des concepts propres aux
langages fonctionnels.
– ramasse-miette
–λ
–fermeture
–macro
– immutabilité
• Plusieurs langages fonctionnels intègrent les concepts de la
programmation objet et de la programmation logique.
– Une version primitive des objets existait dans les premières versions de
LISP
5
LE λ-CALCUL
LE PLUS SIMPLE LANGAGE DE
PROGRAMMATION
6
Le λ-calcul : introduction
• Conçu par Alonzo Church en 1941
• Fondation formelle de la programmation fonctionnelle
• Le λ-calcul est à la programmation fonctionnelle ce que la machine
de Turing est aux langages comme C, C++, Java
• Le plus simple langage de programmation
– Syntaxe minimal
•λ-termes = variable | abstraction | application [| constante]
– Les constantes ne sont pas nécessaires, elles symbolisent des fonctions connues
et permettent de simplifier les calculs
– Une abstraction est une fonction
– Exécution d’un programme
• est une séquence de réduction
7
Le λ-calcul : syntaxe
Soit (pour cette diapositive et les suivantes)
– a, b, c …des constantes,
– u, v, w … des variables,
– U, V, W … des λ-termes ( variable, constante, abstraction, application)
• Les variables et les constantes sont des ensembles disjoints
d’identificateurs
• abstraction = λ(x)V
– elle est interprétée comme une fonction qui associe à x l’expression V
(qui contient généralement des occurrences de x)
– x est une variable liée dont la portée est V
– une variable liée peut être renommée sans conséquence
– une variable non liée est dite libre
• U V est un λ-terme nommé application
– dans le cas où U est une abstraction, une application est interprétée
comme l’application d’une fonction U à un argument V
8
2014-09-04
3
Le λ-calcul : syntaxe
• La portée d’une variable liée par une λ s’étend le plus loin à droite
• La portée est statique, la valeur de la liaison est la même pour toute la
portée
• Attention λ(x)x Y (λ(x)U x V) x = λ(x1)x1Y (λ(x2) U x2V) x1
• Les λs’associe à droite
–λ(x)λ(y)U =λ(x)(λ(y)U).
– On supprime les () et les λ intermédiaires dans des abstractions qui se
suivent
•λ(x)λ(y)U = λ(xy)U
• Les applications s’associe à gauche
–X1X2... Xn=
((X1X2) ... Xn)
•x2est l’argument de la fonction x1et le résultat ultime de l’application de x1à
x2est une fonction dont l’argument est x3…
– Les applications ont précédence sur les abstractions
•λ(x) X Y Z = λ(x)(X Y) Z = (λ(x)((X Y) Z))
9
Le λ-calcul : syntaxe
• Dans la littérature, la syntaxe traditionnelle utilise le . pour séparer
les variables d’une abstraction de son corps.
– U   . U
–   . .  . 
10
Le λ-calcul : syntaxe
• pour simplifier l’écriture, on écrira souvent
– U V plutôt que (U V)
– U V W plutôt que ((U V) W)
–…
–(λ(x1x2) U) a1a2plutôt que (((λ(x1) (λ(x2) U)) a1) a2)
–…
• Par contre, nous distinguerons entre U et (U)
– Si U = x y z alors (U) est (((x y) z)) et non pas ((x y) z)
i.e. x y z est une abréviation de ((x y) z)
11
λ-calcul : Exemple de λ-termes
Pour simplifier, on considère que +, 2 et 3 sont des λ-termes
• La fonction f: x
↦
x+2 sera dénotée (λ (x)(+ x 2))
• L'application de f à 3s'écrit ((λ (x) (+ x 2))3)
• L’évaluation de ((λ (x) (+ x 2))3) est (+ 3 2) = ((+ 3) 2).
– Le reste dépend des fonctions qui sont représentées par + 3 2
• La fonction identité f: x
↦
x est (λ (x) x)
• La fonction constante f: x
↦
2 est (λ (x) 2)
• La est une fonction qui retourne une fonction
constante
– L’application 2s’évalue comme étant 2
– La notion d’évaluation d’une application sera définie formellement dans
les diapositives qui suivent et sera appelée la β-réduction
12
2014-09-04
4
Le λ-calcul : variable liée et libre
• Variables liées
– Varlié(a) = {}
• si on ne donne pas la définition de a, on fait abstraction des variables que sa
définition peut contenir.
– Varlié(x) = {}
– Varlié(XY)= Varlié(X) U Varlié(Y)
– Varlié ((λ (x) X)= Varlié(X) U {x}
• Variables libres
– une variable non liée est dite libre
• Dans l'expression ((λ (x) x) x), il y a 2 occurences de x mais ce sont
deux variables différentes
– il faut lire ((λ (x1) x1) x)
–x
1est liée
– x est libre
13
Le λ-calcul : un programme
• Un programme est un λ-terme.
Pour simplifier l’écriture, on crée souvent plusieurs définitions
• L’exécution d’un programme est une séquence de réduction
–X Y signifie que X a été réduit à Y
– l’exécution s’arrête lorsqu’il n’y a plus d’applications qui peuvent être
réduites (aucune substitution non triviale peut être appliquée).
–le λ-terme résultant est dit dans la forme normale de X
• L’opération primitive permettant la réduction est la substitution
– On dit alors souvent évaluation par substitution
– Comme on fait avec un éditeur des copy-paste pour effectuer une
substitution, alors j’associe souvent la substitution au copy-paste.
– Vous serez étonné de la puissance de calcul du copy-paste.
14
Le λ-calcul : α-conversion
•α-conversion
– deux λ-termes sont équivalents s’il est possible de les rendre identiques
après avoir renommer les variables liées dans une expression par une
autre qui n’est pas libre dans cette expression
– si y n’est pas libre dans M alors λ(x)M αλ(y)M et λ(x)M αλ(y)M
– on renomme que les variables x qui sont liés par un λ
–Exemple
•(λ(x)((λ(y)y) x)) α(λ(y)((λ(y)y) y)) est correcte parce que y n’est pas libre
dans ((λ(y)y) x). Plus précisément en dépit du même nom, nous avons deux
variables y différentes.
• inutile cependant de jouer avec le feux
15
Le λ-calcul : substitution
• Substitution notée T[x := U]
– la substitution dans T de la variable x par U et se définit par récurrence
sur T :
1. si T est une constante alors T[x := U]=T
2. si T=x alors T[x := U]=U
3. si T≠x et T est une variable alors T[x := U]=T
4. si T = V W alors T[x := U] = V[x := U] W[x := U]
5. si T = λ(y)V et y≠x et y est non libre dans U alors T[x := U] = λ(y)(V[x := U])
6. si T = λ(y)V et y≠x et y est libre dans U alors T[x := U] = λ(z)((V[y:=z])[x := U])
7. si T = λ(y)V et x=y alors T[x := U] = T
• #6 consiste à utiliser l’ α-conversion avant d’appliquer 5. L’ α-conversion est
nécessaire parce que le résultat d’une substitution ne doit pas entrainer de
confusion entre deux variables qui portent le même nom. Cette confusion
entraîne la capture d’une variable libre y dans U par le λ(y)
• La substitution est l’opération d’évaluation primitive
16
2014-09-04
5
Le λ-calcul : substitution
• Exemple du cas 5 : y est non libre dans U
–T ==λ(y)V
– U == λ(y)xyz
– V == azyx
• on suppose ici que le z de U et le z de V est la même variable;
i.e. on suppose que celui qui a composé la question ou le problème n'avait
pas l'intention de se tirer dans le pied.
– T[x := U] == λ(y)V[x:=U]
== (λ(y) azyx)[x:=U]
== (λ(y) azyx [x:=U]) ;;; application de 5
== λ(y)a[x:=U] z[x:=U] y[x:=U] x[x:=U] ;;; application de 4
== λ(y)a z y λ(y)xyz ;;; application de 1,2,3
17
Le λ-calcul : substitution
• Exemple du cas 6 : y est libre dans U
–T==λ(y)V
– U == xyz
– V == azyx
– T[x := U] == (λ(y) V) [x := U]
== λ(w)((V[y:=w])[x:U]) ;;; -conversion
== λ(w)((azyx [y:=w])[x:U])
== λ(w)((a[y:=w]z[y:=w]y[y:=w]x[y:=w])[x:U]) ;;;application 4
== λ(w)(azwx [x:=U]) ;;; application de 1,2,3
== λ(w)a[x:=U] z[x:=U] w[x:=U] x[x:=U] ;;; application 5 puis 4
== λ(w)a z w xyz ;;; application de 1,2,3
18
Le λ-calcul : substitution
• exemple du cas 6 : y == x
i.e. la variable à substituer est la variable de l’abstraction
–T==λ(y)V
– U == xyz
– V == azyx
– T[y := U] == (λ(y)azyx)[y:=U] {ne pas confondre avec λ(y)(azyx)[y:=U] *
– == (λ(y)azyx)
* la substition s’applique au tout vs la sustitution s’applique à azyx
19
Le λ-calcul : β-conversion
•β-réduction
– ne s’applique qu’aux expressions réductibles que l’on nomme rédex et
qui ont toujours la forme (λ(x)M) N
–(λ(x)M) N βM[x :=N]
–Exemple
•(λ(x)xy)a β (xy)[x := a] = ay
•((λ(x)x x)(λ(y)y)) β(x x) [x := (λ(y)y)) ] =(λ(y)y) (λ(y)y)
βy[y:= (λ(y)y))]=λ(y) y
•((λ(x)(λy(x) y))y) α((λ(x)(λ(y1)x y1))y) β(λ(y1)x y1) [x:=y] = (λ(y1)y y1)
• Remarque dans ((λ(x)(λ(y)x y))y) le y de (λ(y)x y) est lié alors que celui à
l’extérieur est libre, ce n’est donc pas la même variable bien que leurs noms
soient identiques. Le renommage est nécessaire pour éviter la capture après
la β-réduction. Nous avons implicitement utilisé le cas 6 de la réduction.
•β-abstraction
– M[x :=N] β(λ(x)M) N
20
1 / 15 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!