Faculté des Sciences
de Nice Sophia-Antipolis
L2 Maths 2007-08
Semestre 3
Initiation à la
Programmation Fonctionnelle
(Séances 1 à 7)
Jean-Paul Roy
Département Informatique
http://deptinfo.unice.fr/~roy
Faculté des Sciences de Nice
L2 Maths 2007-08
Initiation à la programmation fonctionnelle
Feuille n° 0 : Préambule...
0.1
SCHEME!
se prononce «!
skime!
»
L’an dernier, à travers le langage C, vous avez étudié la programmation impérative. Cette dénomination
provient de la conception d’un programme comme une suite ordonnée {I1;!...!In;} d’instructions exigeant
impérativement de l’ordinateur qu’il procède à telle ou telle action, par exemple modifier la valeur d’une
variable par l’instruction d’affectation x!= x+y, ou bien afficher la valeur de la variable x à l’écran, ou bien
«!itérer!» une séquence d’instructions via une boucle, etc. Cette conception de la programmation comme
«!pilotage!» de l’ordinateur auquel on donne des instructions est présente dès le début de l’informatique, et peut
paraître au premier abord assez naturelle : on pilote bien des avions ou des machines à laver!! Mais ce n’est pas
la seule conception, et il existe en programmation comme dans la plupart des autres disciplines scientifiques
différentes manières de voir le monde et d’agir sur lui. La programmation fonctionnelle propose un autre style,
plus proche de la pensée mathématique pure donc à priori bien adaptée à la section de DEUG que vous avez
choisie. Pour le matheux, le concept d’instruction n’existe pas, celui d’affectation encore moins : avez-vous déjà
vu une démonstration des objets mathématiques changeraient de valeur entre le début de la preuve et le
CQFD!? Et que dire d’une boucle dans une démonstration!?…
Que va-t-on donc lui emprunter, à ce mathématicien, pour fabriquer des programmes ? Essentiellement deux
concepts fondamentaux :
les fonctions
E
1×L×EnF
et la possibilité de les composer,!la!suite d’instructions étant remplacée par
la composition de fonctions.
• le principe de récurrence, dont l’itération [while ou for
!
en C] n’est en effet qu’un cas particulier!!
Vous voyez que l’idée consiste à revenir aux racines des mathématiques et d’épurer au maximum la
programmation de ce qui n’est pas nécessaire. On vous demandera dans ce cours exactement la même rigueur
[le même purisme] de pensée qu’en algèbre, ni plus ni moins. Ce qui ne veut pas dire qu’en SCHEME on
manipule uniquement des objets mathématiques, mais que les schémas de pensée y sont au fond les mêmes
qu’en maths. En particulier, on peut y raisonner sur un programme, comme on raisonne par exemple sur une
suite définie par récurrence ou sur un système d’équations... Ce cours ne suppose aucune connaissance préalable
de la programmation, C ou autre. Ne raisonnez pas avec des schémas C dans la tête, ce sera une toute autre
méthodologie. Ayez un esprit de débutant, d’ailleurs l’esprit de débutant c’est très zen...
Le propos de la formation à l’informatique en section MP est qu’à travers les langages C et SCHEME, vous
aurez en fait eu une introduction [ne soyons pas trop ambitieux quand même] aux deux paradigmes majeurs de
la programmation [impératif et fonctionnel1], et qu’indépendamment des langages eux-mêmes [qui n’ont que
peu d’importance au final] vous serez à même d’avoir une vision un peu large de cette activité scientifique que
les anglo-saxons qualifient de «!computation!», de calcul au sens large du terme. Programmer, c’est calculer
sur des objets que les mathématiciens et les physiciens, en attendant les transistors, n’ont pu qu’ignorer pendant
des siècles. Ils ont une belle revanche à prendre, et ils le savent2. Leurs systèmes de calcul formel
[MATHEMATICA, MAPLE] utilisés à la fois pour l’enseignement et la recherche, forment un savant mélange de
programmation impérative et fonctionnelle.
0.2 Sommaire des feuilles de TP
1. Expressions préfixées et λ-expressions 7. La structure récursive de liste
2. Ordre applicatif et formes spéciales 8.!Des algorithmes sur les listes
3. Fonctions récursives dans N9.!Comment trier une liste
4. Qu’est-ce qu’une boucle!? 10+…!Thème d’approfondissement
5. Fonctions d’ordre supérieur autour de la structure d’arbre.
6. Doublets et données hiérarchiques
1 Le troisième paradigme, vital de nos jours, est la!» programmation par objets!», exemplifiée par Java, qui est à peu près «!C + objets!».
L’option Scheme du semestre 4 contiendra une introduction à ces fameux «!objets!», entre autres.
2 Il n’est que de considérer des ouvrages comme le «!Cours d’Algèbre!» de M. Demazure, professé à l’Ecole Polytechnique [Cassini éd,
1997], ou les travaux actuels sur le calcul quantique [«!quantum computing!»] que le physicien R. Feynman avait déjà pressenti dès 1981…
0.3 Bibliographie à la B.U.
«!Structure et Interprétation des Programmes Informatiques!» [SICP], Abelson & Sussman, InterEditions.
Superbe rédaction d’un cours professé annuellement au MIT. Lire absolument l’avant-propos et la préface.
La 1ère édition en français la BU] est actuellement épuisée en librairie!; la 2ème édition en anglais [Structure
and Interpretation of Computer Programs] est consultable gratuitement sur www-mitpress.mit.edu/sicp.
«!Recueil de Petits Problèmes en Scheme!» [RPPS], Moreau & al!., Springer-Verlag. 150 pages d’énoncés et
150 pages de solutions, pour tous les goûts et tous les niveaux!: LICENCE, classes prépas…
«!Programmer avec SCHEME!» [PS], Chazarain, Thomson Publishing. Un cours professé durant de nombreuses
années en L3 d’Informatique à la fac. des sciences de Nice.
etc. Une bibliographie plus complète sur les deux sites Web ci-dessous.
0.4 Et sur le «!Web!»!?
On pourra consulter le site local associé à ce cours http://deptinfo.unice.fr/~roy qui contient lui-même de
nombreux liens. Plusieurs universités ou Grandes Ecoles françaises et étrangères proposent des formations à
SCHEME et offrent leurs TP corrigés et autres sujets d’examens aux surfeurs gourmands et motivés!
0.5 Installation du logiciel DRSCHEME
Ce logiciel universitaire, qui en est à sa version 371, est produit par l'équipe PLT !Programming Language
Team!», http://www.plt-scheme.org]. Il est disponible gratuitement pour WINDOWS, MACOS-X, et LINUX
avec 512 Mo de mémoire. Les ordinateurs compatibles PC du MIPS fonctionnent sous Windows-2000.
Attention, quelques aménagements ont été faits sur la version que vous utiliserez ici, notamment des réglages et
des fichiers spéciaux, dont l’aide en ligne en français. Vous trouverez sur le site
http://deptinfo.unice.fr/~roy une rubrique Install DrScheme dans la colonne de gauche, avec des
téléchargements à la clef. Suivez pas à pas les indications, il y a quelques modifications à effectuer par-rapport à
la version standard!!
0.6 Méthode de travail
SCHEME est un langage simple et spartiate, c’est un atout et un danger. Dépourvu de fioritures inutiles, faisant
très peu appel à la mémoire, il exige en contrepartie une parfaite compréhension des mécanismes de base et une
parfaite rigueur intellectuelle au niveau des stratégies de résolution!de problèmes. Vous êtes [supposés] être des
matheux, alors prouvez-le et ça devrait aller de ce côté-ci, il vous suffira de remplacer la «!démonstration par
récurrence!» par la «!programmation par récurrence!»…
Enfin, ça ira si en plus vous travaillez!! Car ne vous bercez pas d’illusions, on n’apprend pas à programmer
en SCHEME 15 jours avant l’examen, le résultat est en général assez ca-tas-tro-phi-que. En revanche, nous vous
assurons qu’un travail régulier, dans les livres et sur machine, et une préparation des TP ne devrait vous causer
aucune suprise lors du dit examen.
Vous ne devez pas arriver en TP sans avoir préparé au moins une partie du TP. Ces feuilles étant des feuilles
d’auto-formation, et en l’absence de cours magistral, l’enseignant est pour apprécier ou critiquer vos solutions,
ou vous donner des explications sur vos erreurs, et en aucun cas vous débiter des solutions toutes faites. Tous les
exercices non optionnels auront été supposés compris et programmés le jour de l’examen de janvier [2h en
amphi, sans documents]. Bon travail et
(bienvenue (dans le monde des parenthèses))
La présence en TP est obligatoire et contrôlée, et comptera dans la note finale [–0.5 point pour chaque
absence non justifiée].
VENEZ TOUJOURS EN TP AVEC UNE «!CLE USB!»!!
Faculté des Sciences de Nice
L2 Maths 2007-08
Initiation à la programmation fonctionnelle
Feuille n° 1 : Consultation avec DRSCHEME...
1.1 Une syntaxe étrange venue dailleurs
Et de loin, des premières années de l’informatique, avec le langage LISP : 1958, rien de bien récent donc, SCHEME
étant lui né vers 1980. Cet ancêtre LISP fut conçu à l’origine pour les besoins des théoriciens de la programmation
[le «!λ-calcul!»], mais aussi et surtout pour des programmeurs qui souhaitaient un langage suffisamment malléable
pour les besoins symboliques de l’Intelligence Artificielle naissante [1956]. La syntaxe des deux langages est donc
très proche, basée sur l’idée [qui se justifiera peu à peu] de représenter une expression mathématique sous une
forme préfixée totalement parenthésée.
En C, on écrit par exemple cos(x+2) pour exprimer le cosinus de x+2. En SCHEME, nous écrirons de manière
«!préfixée!», ce qui signifie que l’opérateur sera toujours en tête de l’expression, et pour éviter toute
ambigüité, nous placerons des parenthèses comme ceci :
(cos (+ x 2))
Donc au lieu d’écrire f(x,y,z), vous écrirez (f x y z) sans virgules, le même processus de conversion
s’opérant à tous les niveaux, c’est-à-dire par récurrence dans les sous-expressions x, y et z. Dans une expression
bien formée, il y aura donc autant de parenthèses ouvrantes que de fermantes. Quelques exemples :
en MATHS en SCHEME
x+y+z
(+ x y z)
xy+z
(+ x (- y) z) ou bien (+ (- x y) z) etc. [-y serait faux]
sin(
ω
t+
φ
)
(sin (+ (* omega t) phi))
x+2y=0
(= (+ x (* 2 y)) 0) ou (zero? (+ x (* 2 y)))
2,71828
2.71828 la notation d’un nombre inexact [réel approché]
13
5
13/5 lorsqu’on le tape et
lors de l’affichage [avec la partie entière]
32i
3-2i ce n’est pas une opération, mais la
notation
d’un nombre complexe !
xax2+3
(lambda (x) (+ (sqr x) 3)) la fonction qui à x associe x2+3
fogoh
(compose f g h) la composition de fonctions
si x=2 alors 3 sinon y+1 (if (= x 2) 3 (+ y 1)) pas de mots then et else superflus...
Voilà. Bravo, vous savez déjà
tout
de la syntaxe de SCHEME : l’art du bon balancement des
parenthèses!! Art subtil, qui vous posera [peut-être] des problèmes au début mais qui ne devrait pas gêner des
matheux qui font des notations leur pain quotidien... Désolé si vous trouvez cette notation compliquée pour des
problèmes simples [comme calculer x2+3], mais elle a été inventée pour simplifier la vie des programmeurs lors des
problèmes compliqués. Wait and see…
Exercice 1.1 : à faire sur papier a) Traduire en notation SCHEME l’expression
sin(x+y/3) -a
.
b) Traduire en notation mathématique usuelle l’expression SCHEME suivante, dans laquelle log désigne la fonction
«!logarithme népérien!» et abs ... vous devinez quoi :
(/ (log (- x 2)) (+ 1 (abs (- x 4))))
c) Rectifiez l’écriture de l’expression SCHEME suivante qui est bien pauvrement parenthésée :
(3 * sqrt(y + 2))
1.2 Le lancement de DRSCHEME
Allez faire votre vie dans le menu Démarrer, cherchez PLT, et lancez DRSCHEME !…
Bienvenue dans DrScheme, version!370[3m]
Langage: Assez gros Scheme.
DRSCHEME est un gros logiciel, dont vous n'exploiterez pas toutes les possibilités, et de loin. Il a été
spécialement conçu pour l'enseignement, la recherche et de le développement de gros programmes en SCHEME. Il est
lui-même [y-compris l'interface graphique] entièrement écrit en SCHEME. Il dispose d'un compilateur vers C, de
bibliothèques d’utilitaires pour le graphisme, pour Internet, etc. mais vous n'avez pas besoin de le savoir, puisque ce
cours MP2 n'est qu'introductif, donc oubliez tout cela. La fenêtre de DRSCHEME, par exemple celle que vous voyez
en arrivant, est composé de deux cadres :
Celui du haut contiendra les définitions de votre programme [un programme SCHEME est donc un
ensemble de définitions]. Il contient un éditeur de programmes SCHEME.
Celui du bas contiendra vos interactions avec DRSCHEME. Vous pourrez faire des calculs et tester vos
programmes «!au toplevel!» comme on dit...
En haut d'une fenêtre se trouvent, de gauche à droite :
• un bouton contenant le nom du fichier en cours d'édition [Sans Nom s'il est encore anonyme] ainsi qu’un
bouton (define …) qui permet de se positionner sur une définition.
• un bouton Sauvegarder pour sauver le fichier. Ce bouton est invisible si le fichier vient d’être sauvegardé...
• un bouton Déboguer qui permet d’exécuter en mode pas à pas, pour comprendre une erreur par exemple.
• un bouton Vérifier pour vérifier la syntaxe sans compiler et colorier le texte.
• un bouton Exécuter pour compiler l'ensemble des définitions et se retrouver au toplevel.
• un bouton Stopper pour forcer l'interruption d'un programme, lorsqu’il ne veut plus s’arrêter.
En bas d'une fenêtre se trouvent la position du curseur p:q [en ligne p et colonne q], Lecture/écriture qui dit si
vous pouvez écrire ou pas, un petit dessin vert représentant l’icône des poubelles américaines, qui s'allume lorsque
DRSCHEME nettoie sa mémoire. Seule la position du curseur peut être importante s’il faut aller en ligne 57 par
exemple…
1.3 Les interactions au toplevel
Arrangez-vous pour que la fenêtre prenne tout l'écran [cliquez dans la case de zoom]. Le toplevel [cadre inférieur
de la fenêtre] peut être vu comme une super-calculette. Un «!prompt!» matérialisé par le signe > attend une
expression à évaluer. Calculons par exemple la moyenne des entiers de [1,10]:
> (/ (+ 1 2 3 4 5 6 7 8 9 10) 10)
; vous pouvez aller à la ligne en plein milieu
11
2
Un clic droit sur le résultat vous permet d’en changer le format, essayez !
Vous souhaitez faire le même calcul jusqu’à 12 ? Inutile de recopier la première ligne à la main. Tapez sur Esc-P
[une fois sur la touche Esc puis une fois sur la touche p, pas les deux en même temps!!], les lignes précédentes sont
recopiées au prompt. Modifiez la ligne, placez le curseur à la fin de la ligne et relancez l’évaluation [celle-ci survient
sur une pression de la touche «!Entrée!» lorsque toutes les parenthèses sont refermées, même si l’expression tient
sur plusieurs lignes].
Exercice 1.2 : Calculez la factorielle 20! en multipliant les entiers de 1 à 20...
SCHEME travaille comme MAPLE «!en précision infinie!» sur les nombres exacts et contrairement à C qui se
limite à des nombres d’une quinzaine de chiffres, ce qui est insuffisant pour fairede l’arithmétique… Les codes
secrets utilisent couramment de grands nombres premiers d’une centaine de chiffres!!
N.B.
11/2
est un nombre rationnel
exact
, à ne pas confondre avec
5.5
qui est un nombre réel
inexact
. Les primitives
exact->inexact
et
inexact->exact
peuvent être utiles!
: (exact->inexact 11/2) 5.5
par exemple.
1 / 29 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !