Dr. Wided LEJOUAD CHAARI
Dr. In s ALAYA LOUHICHI
Dr Ahlem BEN HASSINE
OBJECTIFS DU COURS
Aborder la programmation fonctionnelle
Ma triser les principales primitives du langage Lisp
Comprendre le fonctionnement des programmes Lisp
Ecrire des fonctions simples, ma triser le concept de r cursivit
Utiliser Le_Lisp dans des applications dIA
2
INTRODUCTION
Les principaux paradigmes de programmation :
Le paradigme fonctionnel
Le paradigme proc dural
Le paradigme objets
3
LE PARADIGME FONCTIONNEL
La programmation fonctionnelle d signe une famille de langages
de programmation ayant un certain nombre de traits en commun,
dont un r le central donn aux fonctions, d'o le nom.
On peut y raisonner comme en math matiques, faire des
d monstrations par r currence, des analyses r cursives de
complexit , et acqu rir une rigueur certaine.
Les fonctions r cursives sont au cSur de ce paradigme.
Exemples : Haskell, Standard ML et Ocaml
4
LE PARADIGME PROCEDURAL
Le paradigme proc dural (ou imp ratif) est le plus ancien.
Il met laccent sur l'appel de proc dures pour effectuer un calcul
s quentiel.
L'it ration est le m canisme central pour effectuer un calcul
r p titif, la r cursivit y est rarement optimis e.
La programmation imp rative consid re qu'un texte de
programme est une suite d'instructions pilotant un ordinateur.
Exemples : Apparu avec Fortran (1967), poursuivi avec Pascal
(1970-1990), actuellement C est le repr sentant largement
majoritaire.
5
LE PARADIGME A OBJETS
Le paradigme objets s'appuie sur la notion de classes et
d'objets.
Les objets ont du savoir-faire sous la forme de m thodes qui
ne sont autres que des proc dures mais destin es tre
transmises un objet receveur sous la forme d'un message.
Le calcul est donc d centralis dans les objets, dont les
m thodes peuvent tre fonctionnelles ou imp ratives.
Notion de r utilisation du logiciel et son extensibilit .
Exemples : Smalltalk (1970), popularis avec Java et C++ dans
les ann es 1990.
6
LISP
LIST PROGRAMMING
7
Introduction
Con u en 1958 par J. McCarthy, LISP est un des plus vieux
langages de programmation. Il fut pendant longtemps
confi la recherche en intelligence artificielle. LISP se
distingue des langages traditionnels par le fait quil est
sp cialement adapt la manipulation des symboles.
Avantages :
} La simplicit de la syntaxe : elle repose sur la seule
structure de liste.
} La puissance du langage en particulier l quivalence
compl te entre donn es et programmes.
} Linteractivit : LISP est principalement interpr t .
8
} Son concepteur
John Mc CARTHY
} Cr ation
En 1960
} Sp cificit s
Langage fonctionnel
Traitement symbolique
Code form de listes parenth s es
9
} 1960 Lisp 1.5
} 1966 MACLISP
} 1967-1975 INTERLISP SCHEME
} 1977 VLISP
} 1984 LE_LISP Common LISP
} 1985-1986 EULISP AutoLISP
10
} Syntaxe simple mais parenth ses multiples
} Utilisation intensive de la r cursivit
} Typage dynamique des donn es
} Pas de distinction entre donn es et
programmes
} Langage interpr t
11
Objet de base : Atome
Lobjet de base de LISP est latome.
Un atome est :
un nombre
Exemple : 126, -54
un symbole : toute s quence non vide de caract res,
Exemple : Le-Lisp, var, 1+x/y.
Les symboles permettent de d signer les diff rents objets
(donn es et fonctions).
12
Structure de base de LISP : Liste
Une liste est une s quence ordonn e, ventuellement vide,
datomes ou de listes, d limit e par des parenth ses.
Exemple : (* 3 7)
(+ (* 3 7) (- 8 4) 10)
(Langages de lIA)
( )
La liste vide joue un r le tr s important en LISP.
13
Expression l mentaire
Lexpression l mentaire de LISP est la S-expression
Il existe 3 cat gories dexpressions symboliques :
} Les atomes,
} Les listes,
} Les paires point es.
14
} a
} B
} ATOME
} Pierre
} Atome-Long
} unseulatomelong
} 128
} -345
} *86
15
Suite ordonn e datomes ou de listes
} (A B) liste constitu e de 2 atomes
} (A B C) liste constitu e de 3 atomes
} (A (B C)) liste constitu e de1 atome et dune
liste
} (Une liste) liste constitu e de 2 atomes
} () liste vide correspond NIL
16
Une paire point e est sp cifi e par lutilisation
du s parateur <.> situ entre 2 objets.
} Exemple : (A.B)
17
Fonctionnement de base de l valuateur de
S-expression
Toute S-expression a une valeur en LISP. Il est important de
bien diff rencier une S-expression de sa valeur. On note la
valeur dune S-expression <s> : VALEUR<s>.
Le r le de linterpr te LISP est d valuer une S-expression
pour d terminer sa valeur.
18
Fonctionnement de base de l valuateur de
S-expression
La valeur dune S-expression est d termin e diff remment,
selon quil sagit dun atome ou dune liste :
un atome : nombre ou symbole
la valeur dun nombre est lui-m me,
la valeur dun symbole :
19
Fonctionnement de base de l valuateur de
S-expression
la valeur dun symbole :
soit pr d finie dans LISP et non modifiable : le
symbole est alors une des deux constantes de LISP
t ou nil , t a pour valeur lui-m me , nil a pour
valeur ( ).
soit d finie et modifi e dynamiquement, variable.
20
Une liste (<s0>& <sn>) est valu e comme suit :
- LISP consid re que <s0> est un symbole qui d signe un
nom de fonction ; <s0> nest pas valu . <s0> ne doit
tre ni une liste ni un symbole qui ne correspond pas
une fonction connue par LISP.
- LISP value les sous-expressions <s1> & <sn> et
d termine resp. VALEUR<s1>, & <sn>
- LISP applique la fonction associ e <s0> aux
arguments VALEUR<s1>&VALEUR<sn> ; la sous-
expression aura pour valeur le r sultat de cette
application.
21
Dans une S-expression toute parenth se ouvrante doit tre suivie
dun nom de fonction.
Exemple :
? (1 2 3 4)
** eval : fonction ind finie : 1
Comment d signer une S-expression (atome ou liste) quon ne veut
pas valuer ?
gr ce la fonction quote
? (quote (1 2 3 4))
= (1 2 3 4)
Abr viation : (1 2 3 4)
22
D finition de fonctions
Un programme en Lisp est une fonction ou un ensemble
de fonctions. L'utilisateur d finit les fonctions gr ce
la primitive de ou defun.
Exemple:
? (de *(z) ( z z)
= **
La valeur de cette S-expression est le nom de la
fonction qui vient d' tre d finie.
23
R cursion:
Syntaxiquement, une fonction LISP est r cursive si le nom
de cette fonction figure dans sa propre d finition.
Exemple 1: Factorielle
(de fact(n)
(if (= n 1)
1
(* n (fact (- n 1)))))
24
R cursion :
Exemple 2: Suite de Fibonacci Un= Un-1 + Un-2
(de fib (n)
(cond ((= n 0) 0)
((= n 1) 1)
(t (+ (fib (-n 1)) (fib (- n 2)))))
25
Le r le de l'interpr te LISP est d' valuer une S-expression pour
d terminer sa valeur. Il proc de selon l'it ration suivante:
Lire une S-expression
Evaluer la S-expression
Publicité
Imprimer la valeur trouv e
Une session LISP consiste faire valuer successivement
diff rentes expressions qui ob issent une syntaxe tr s simple.
26
Lalgorithme dex cution
de linterpr te est une
boucle
READ EVAL PRINT
Qui sex cute divers
niveaux de profondeur en
commen ant par le plus
profond
Lecture dune
expression
Evaluation de
lexpression
Impression du
r sultat
27
} LISP ne fait pas une distinction lexicale entre les
symboles de fonctions et les symboles de variables.
} Sinon, ceci va nous emp cher de construire par
exemple une fonction r cursive en la d finissant avec
son it r e.
28
} Il existe deux classes de syst mes LISP suivant la fa on
dont ce probl me est r solu :
a. Syst mes bi-valents
b. Syst mes mono-valents
29
a. Syst mes bi-valents :
Chaque symbole peut recevoir deux valeurs, une valeur comme
variable dite C-val et une valeur comme fonction dite F-val.
Exemple :
(setq a 3)
Nous mettons 3 dans la C-val de a
Les symboles +,-,*,... ont une F-val dans l'environnement initial.
Le symbole fib a une F-val partir de la d finition de la fonction
fib.
30
Pour avoir la d finition d'une fonction on utilise la fonction
pr d finie getdef
Exemple :
? (getdef 'fib)
Dans les syst mes bi-valents rien n'emp che de donner une valeur
la fois la C-val et la F-val d'un symbole.
Exemples de syst mes bivalents le-Lisp et Mac-Lisp.
31
b. Syst mes mono-valents :
Dans ces syst mes, un symbole ne peut recevoir qu'une
seule valeur dite C-val.
L' valuation de la fonction donne sa d finition
(pas besoin de getdef).
32
Nous avons vu que la valeur d'une liste est obtenue en
op rant le premier l ment, qui correspond au nom
de la fonction, sur les valeurs des autres l ments.
Mais prenons cet exemple :
? (setq a 5)
La r gle g n rale n'a pas t appliqu e : a n'a pas t
valu e puisqu'il s'agit de lui donner une valeur.
33
On distingue d'abord les primitives pr d finies et les fonctions
d finies par l'utilisateur :
SUBR: on appelle SUBR une fonction pr d finie crite en
langage machine valuant ses arguments.
EXPR ou LAMBDA: une fonction crite en LISP valuant ses
argument.
FSUBR: une fonction pr d finie crite en langage machine
n' valuant pas tous ses arguments (setq).
34
On peut obtenir le type d'une fonction gr ce la
primitive typefn.
Exemples :
?(typefn 'fact)
= expr
?(typefn 'car)
= subr1
?(typefn '*)
= nsubr
35
- Laddition
(+ & &)
- La soustraction
(- & &)
- La multiplication
(* & &)
- La division
(/ & &)
36
- QUOTE
- CAR
- CDR
- CONS
- APPEND
37
- Emp che l valuation de lexpression arithm tique
fournie en argument.
Retourne lexpression non valu e.
(quote <argument>)
Exemple :
? (quote (2 + 3))
= (2 + 3)
38
- Extrait le premier l ment dune liste. Celui-ci peut
tre un atome ou une liste.
(car <argument>)
Largument doit tre une liste.
39
- Retourne une liste priv e de son premier l ment.
(cdr <argument>)
Largument doit tre une liste.
40
- Les fonctions CAR et CDR peuvent tre imbriqu es,
cest- -dire appliqu es successivement sur une liste.
- (car (cdr <liste>)) -> (cadr <liste>)
- (car (cdr (cdr <liste>))) -> (caddr <liste>)
- (car (cdr (car (cdr <liste>)))) -> (cadadr <liste>)
41
Afin de lire correctement une imbrication
de fonctions, commencez par celle
inscrite en profondeur
42
Permet dextraire le troisi me l ment de la liste
fournie en argument.
(caddr (a b c)) = (car (cdr (cdr (a b c))))
= (car (cdr (b c)))
= (car (c))
= c
43
Ajoute un l ment en t te dune liste.
(cons <arg1> <arg2>)
Le nombre darguments est fixe = 2
44
Permet de concat ner les listes transmises en
arguments
(append <arg1> <arg2> & <argn>)
45
Constructeur et s lecteur de listes:
- Cons : permet d'ajouter un atome ou une liste en t te
d'une liste.
? (cons 2 '(3 4))
= (2 3 4)
? (cons '(1 2) '(3 4))
= ((1 2) 3 4)
46
Constructeur et s lecteur de listes :
(car <l>)
retourne la t te de la liste VALEUR<l>, retourne erreur si VALEUR<l>
n'est pas une liste.
(cdr <l>) retourne le reste de la liste VALEUR<l>, retourne erreur si
VALEUR<l> n'est pas une liste.
? (car '(1 2 3))
=1
? (car (cdr (cons 1 '(2 3))))
= 2
47
Constructeur et s lecteur de listes:
- (append <l1> ... <ln>)
retourne la liste obtenue en concat nant les listes <l1> ... <ln>
? (append '(ceci est ) '(un support de cours) '(en Lisp))
= (ceci est un support de cours en Lisp)
- (list <s1> ...<sn>)
retourne la liste dont les l ments <s1> ...<sn>.
? (list 1 2 '(3 4))
= (1 2 (3 4))
48
- (length <s>)
retourne le nombre d' l ments de plus haut niveau de <s>,
si <s> est une liste, sinon 0 (si <s> est un atome).
Exemple:
? (length '(a (b c) d))
= 3
49
Les fonctions pr dicats sont toujours valuantes,
elles retournent nil si le pr dicat est faux.
Si le pr dicat est vrai, la r ponse peut d pendre
des syst mes puisque "vrai" admet comme
repr sentation toute S-expression diff rente de
nil.
De nombreux syst mes utilisent l'atome "t".
50
- (atom <s>)
retourne "t" si VALEUR<s> est un atome num rique ou
symbolique, et retourne () si c'est une liste non vide.
- (null <s>)
retourne "t" si VALEUR<s> est gal () et () dans le cas
contraire.
- (eq <s1> <s2>)
permet de tester l'identit de deux atomes.
Si VALEUR<s1> et VALEUR<s2> sont identiques retourne
"t", sinon retourne ().
51
- (equal <s1> <s2>)
permet de tester si VALEUR<s1> est semblable VALEUR<s2>,
elle retourne t , sinon (). Elle admet comme arguments des
listes et des atomes.
- (symbolp <s>)
retourne "t" si <s> est un symbole, et retourne nil sinon.
- (constantp <s>)
retourne "t" si <s> est une constante, et retourne nil sinon.
Une constante est soit un nombre, une cha ne de caract res ou nil.
52
- (consp <s>)
retourne "t" si <s> est une liste non vide, et retourne nil
sinon.
- (listp <s>)
retourne "t" si <s> est une liste, et retourne nil sinon.
53
- (numberp <s>)
Teste si largument est un nombre. Retourne le nombre si le
test est v rifi , () sinon.
- = ou < ou > ou <= ou >=
Compare les arguments transmis par rapport aux crit res
dinf riorit ou de sup riorit . Retourne le 1er argument si le
crit re est v rifi , () dans le cas contraire.
- eqn =
54
Publicité
Ce sont les fonctions pour lesquelles la valeur logique du
r sultat ne d pend que de la valeur logique des
arguments.
OR retourne une expression de valeur logique vraie si
l'un au moins des arguments est de valeur logique vraie
sinon retourne nil.
L valuation s'arr te d s le premier argument dont la
valeur est vraie. Pour cette raison OR est une F-SUBR.
55
- (or <s1> &<sN>)
retourne la valeur du premier argument dont la valeur est
diff rent de nil, et nil sinon.
L' valuation sarr te d s l'obtention dune valeur vraie.
- (and <s1> &<sN>)
retourne la valeur du dernier argument si les valuations de
tous les arguments sont vraies, et nil sinon.
L valuation sarr te d s lobtention dune valeur nil.
56
(progn <s1>
...
<sN>)
value s quentiellement ses arguments et
retourne la valeur du dernier.
Utile pour la structure conditionnelle IF.
57
-- la longueur au plus haut niveau
-- la longueur au plus bas niveau
(longueur1 l)
(longueur2 l)
(palindrome l)
(appartient e l)
(inverse l)
(intersection l1 l2)
(dernier l)
(lsd l)
-- la liste sans son dernier l ment
58
(nieme n l) -- l quivalent de nth en Lisp
(elem-rang-pair l)
(elem-rang-impair l)
(coupler l1 l2)
(extremites l)
(abs-list l)
(snoc l e) -- ajout dun l ment en queue dune liste
(subst new old l)
(aplatir l)
59
Op rateur LET
} En LISP, on tend privil gier une programmation
fonctionnelle et manipuler des fonctions au sens
math matique du terme.
Applications dun ensemble dans un autre pour lesquels
la notion daffectation nintervient pas.
Ceci nest pas incompatible avec la n cessit de sauvegarder
des r sultats interm diaires.
60
Op rateur LET
} La primitive LET offre le moyen de le faire.
} La fonction let est tr s utilis e pour proc der l' valuation
d'expressions dans un environnement provisoire.
} Elle permet de cr er des variables locales.
61
(let ((<var1> <s1>) ...(<varn> <sn>))
<expr1> ... <exprn>)
Cette fonction permet de :
- valuer successivement <s1>...<sn>
- lier <var1> ... <varn> aux valuations obtenues
- valuer successivement <expr1> ... <exprn>
- d lier <var1> ... <varn>
- retourner l' valuation de <exprn>
62
Exemple :
? (setq x 2 y 4)
= 4
? (let ((x (- x y)) (y (+ x y))) (* x y))
= -12
Les liaisons se font en parall le;
La deuxi me liaison, savoir, y (+ x y) se fait avec
la valeur de x ant rieure l'appel de let.
63
Dautres primitives de modification de la valeur dun symbole
permettent le parcours et la construction progressive de listes.
Elles facilitent la programmation de fonctions it ratives.
(nextl <v>) : retourne (car <v>) et affecte au symbole <v> la
valeur de (cdr <v>)
(newl <v> <e>) : affecte <v> la valeur de (cons <e> <v>) et
retourne cette valeur
(while <test> <e1>& <en>) : it re sur l valuation s quentielle de
<e1>& <en> tant que VALEUR<test> est diff rente de ().
64
Exemple : REVERSE it ratif
(de reverse (l)
(let ((resultat))
(while l (newl resultat (nextl l)))
resultat))
65
} La plupart des syst mes LISP poss dent dans le descriptif d'un
symbole un champ appel P-LIST permettant l'utilisateur
d'attacher aux symboles des propri t s.
} Le mode d'utilisation de ce champ varie d'un syst me un
autre. Le_Lisp attache la P-LIST d'un symbole une liste plate
de longueur paire appel e P-liste dont le format est le suivant :
(<prop1><val1> ... <propN><valN>)
Les indicateurs <prop1> ... <propN> indiquent une propri t et
sont suivis de la valeur de cette propri t .
66
La gestion de cette liste est assur e par les fonctions SUBR
suivantes :
- (plist <symb>) retourne la P-liste de symbole <symb>
- (plist <symb> <l>) affecte <l> la P-liste du symbole <symb>
- (putprop <symb> <val> <prop>) affecte <prop> la valeur
<val> dans la P-liste de symbole <symb>
- (getprop <symb> <prop>) retourne la valeur de <prop> dans la
P-liste <symb>
- (remprop <symb> <prop>) supprime, si elle existe, <prop> dans
la P-liste <symb>
67
La fonction EVAL value la valeur de son argument.
Exemple :
? (setq a '(* 2 4))
= (* 2 4)
? (setq x 'a)
= a
? x
= a
? (eval x)
=(* 2 4)
? (eval (eval x))
= 8
68
La fonction EVAL est appliqu e implicitement
par l' valuateur.
En l'appelant explicitement, on force une
deuxi me valuation.
69
- (print <expr>)
value son argument, dite la valeur obtenue et retourne
sa valeur.
Exemple:
? (setq a 3)
= 3
? (print a)
a
= 3
70
print est souvent utilis e avec des cha nes de caract res (entre ).
L'utilisation de print ne se justifie que lorsque le r sultat de
l' valuation n'est pas dit .
? (print 'salut)
salut
= salut
; on cr e le symbole salut
? (setq salut "Bonjour")
= Bonjour
? (print salut)
= Bonjour
71
- (read)
c'est une fonction 0-aire qui retourne sans l valuer la
r ponse de l'utilisateur (un ? est envoy par le syst me
pour l'inviter envoyer une expression).
Exemple :
? (setq x (read))
? 5 ; r ponse de l'utilisateur
= 5
72
- princh
Edite un certain nombre de fois le caract re transmis la
fonction.
(princh <caractere> <nombre>)
Exemple :
? (princh - 12)
= ------------
73
- terpri
Lappel sans arguments vide le tampon et commence une
nouvelle ligne (retourne nil).
(terpri <nombre>)
Dans le cas de la pr sence dun argument, celui-ci
correspond au nombre de sauts de lignes appliquer.
Exemple:
? (terpri 2)
= t ; apr s 2 sauts de ligne
74
Editeur pepe
Fonction dappel de pepe :
- (Ctrl E)
- (pepe <nom_fichier>)
- (pepe (pretty <nom_fichier>))
Charger un fichier :
- (load <nom_fichier>)
-^L<nom_fichier>
Effacer l cran :
- (tycls)
Quitter linterpr teur :
- (end)
75
La fonction Trace modifie la d finition d'une fonction :
la fonction dite une ligne chaque fois qu'elle est appel e
en indiquant les valeurs des variables.
On revient la d finition initiale par la fonction Untrace.
(trace <f>)
(untrace <f>)
La fonction Trace est tr s utile pour suivre les appels
d'une fonction r cursive.
76
La fonction Step permet une valuation pas pas.
(step <expr>)
Cette fonction donne avec plus de d tails au niveau
des op rations l mentaires, une valuation pas pas.
77
Avez-vous des QUESTIONS ?
?
78
Les op rations de s lection
La r cursivit
Fonctions r cursives sur les ensembles
Lit ration
79
Structure de la fonction IF
(if (condition)
(alors_action1)
(sinon_action2)
&
Publicité
(sinon_action n))
; condition valuer
; action pour condition vrai
; actions pour condition fausse
80
(IF <s1> <s2> <s3>)
Si la valeur de <s1> est diff rente de NIL, IF retourne la valeur de
<s2>; sinon, IF value <s3>.
IF construit une structure de contr le de type "si alors sinon" .
Exemples :
? (IF T 1 2)
=1
? (IF NIL 1 2)
=2
? (IF NIL 1)
= NIL
81
(WHEN <test> <s1> ... <sN>)
Si <test> est Vrai, WHEN value chacune des expressions
<sI>.
(UNLESS <test> <s1> ... <sN>)
Si <test> est Faux, UNLESS value chacune des expressions
<sI>.
82
Structure de la fonction COND
(cond
((test1)
((test2)
&
(t
(action1))
(action2))
(actions par d faut)))
83
Exemple :
? (de test (x y)
(COND
((> x y)
((= x y)
(t
'sup)
'egal)
'inf)) )
= test
? (test 12 5)
= sup
?(test 5 8)
= inf
84
Concept fondamental :
En math matiques :
Une relation de r currence
En informatique :
Proc dures r cursives
85
En algorithmique :
f Fonction qui sappelle elle-m me
f Appels de plus en plus simples
f Solution directe pour le dernier appel
f Respect de la condition darr t
86
Correspondance entre les mod les :
Exemple : la factorielle
f D finition r currente :
n ! = n (n 1) !
pour n > = 1 avec 0 ! = 1
f Algorithme r cursif :
SI
ALORS
SINON
n = 0
r ponse = 1
r ponse = n * fact (n 1)
f Programme LISP :
(defun fact (n)
(cond
((= n 0)
(t
1)
(* n (fact (- n 1) ) ) ) ) )
87
3 * fact (2)
--------------
D roulement de la fonction pour Factorielle (3)
? (fact 3)
= 6
E
M
P
I
L
E
R
2 * fact (1) --------------
RETOUR DE LA PILE
D
E
P
I
L
E
R
--------------
1 * fact (0)
2 * 1 = 2
3 * 2 = 6
1 * 1 = 1
= 1
88
(ensemble l)
teste si une liste est un ensemble (pas de doublons)
(inclus l1 l2)
teste si tous les l ments dune liste se trouvent dans une autre
(compare l1 l2)
teste l galit de deux ensembles
(unique l)
transforme une liste en un ensemble (sans doublons)
(union l1 l2)
cr e un ensemble constitu des l ments de deux listes
(inter l1 l2)
cr e un ensemble constitu des l ments communs
89
Fonctions It ratives :
PROG&GO...RETURN
(prog <liste> <S-expr1> & <S-expr n>)
(go <atom>)
(return <S-expr>)
90
Exemple 1:
(defun puissance (n p)
(prog (resultat)
(setq resultat 1)
depart
(setq resultat (* n resultat))
(setq p (- p 1))
(if (= p 0)
(return resultat)
(go depart) ) ) )
91
Exemple 2: dernier l ment dune liste
(defun dernier (liste)
(prog ( )
encore
(cond
((null (cdr liste)) (return (car liste)))
(t (setq liste (cdr liste)))
)
(go encore)
)
)
92
Exemple 3: variante it rative de la factorielle
(defun factorielle (n)
(prog (resultat)
(setq resultat 1)
toujours
(cond
((= 0 n) (return resultat))
)
(setq resultat (* resultat n) n (- n 1))
(go toujours)
)
)
93
Fonctions It ratives :
WHILE
(WHILE (condition)
(S-expr 1)
(S-expr 2)
&
(S-expr n)
)
Elle value les S-expressions TANT QUE la condition retourne VRAI
94
Exemple 1: afficher le d compte dun nombre
(defun decompte (n)
(while (> n 0)
(print n)
(decr n)
)
)
; d cr mente n
95
Exemple 2: inverse version it rative (vu dans let)
(de reverse (l)
(let ((resultat))
(while l (newl resultat (nextl l)))
resultat))
96
Avez-vous des QUESTIONS ?
?
97
Les Fonctions Anonymes
Les Fonctionnelles de R cursion
Les Filtres
Les Macro Fonctions
98
(lambda <liste-arguments> <corps> )
(lambda (x) (+ x x))
(lambda (x y) (+ ( 2 x) ( 3 y)))
Une lambda-expression est appel e description
anonyme dune fonction.
99
(LAMBDA <param tres> <corps de la fonction> <valeurs locales>)
La fonction anonyme LAMBDA retourne l valuation
dune <fonction> avec des <param tres> qui prennent des
<valeurs locales>. En dehors de LAMBDA les param tres
sont d li s.
Elle permet de d finir une fonction sans nom qui n'est
pas utilisable hors de la S-expression dans laquelle elle est
d finie.
100
Exemples :
? ((lambda (x y) (* x y)) 2 3)
= 6
? (setq a '(lambda (x y) (* x y)))
Publicité
= (lambda (x y)(* x y))
? (apply a '(2 3))
= 6
? ((lambda (x) (+ x x)) 3)
= 6
101
Fonction dordre sup rieur qui prend les
fonctions comme arguments et les applique sur
des ensembles de donn es.
102
} Ces fonctionnelles ont pour but d'appliquer une m me
fonction successivement diff rents morceaux d'une ou
plusieurs listes.
} APPLY
} MAPCAR
103
} (APPLY <f> <liste>)
retourne la valeur de l'application de la fonction < f > sur la
liste <liste>
Exemples :
? (apply '+ '(2 3 4) )
= 9
? (apply 'append '((a b) (c d)))
= (a b c d)
? (apply '/ ' (6 2))
? (apply 'modulo' (6 2))
= 3
= 0
104
} La fonctionnelle de r cursion la plus utilis e est mapcar.
} Cette fonctionnelle applique la fonction (suppos e
unaire) aux l ments successifs d'une liste (car, cadr,
caddr,...) et retourne la liste des r sultats de ces
applications.
} On peut utiliser aussi mapcar avec plusieurs listes.
105
Donc il existe deux utilisations de mapcar.
Usage1 :
(mapcar <s> <l>)
value <s> et applique le r sultat aux l ments de
la liste <l> et retourne la liste des r sultats.
Exemples :
? (mapcar '1+ '(1 2 3))
= (2 3 4)
? (mapcar 'car '((a b) (c) ((d e) f)))
=(a c (d e))
106
Usage 2 :
(mapcar <s> <l1> ... <ln>)
value <s> et applique le r sultat aux car des listes <l1> ... <ln>
puis
leurs l ments suivants (cadr, caddr,...) et retourne la liste des
r sultats.
Exemples :
? (mapcar '+ '(1 2 3) '(4 5 6))
= (5 7 9)
? (mapcar (lambda (x y) (+ ( x 2) ( y 3))) '(1 2 3) '(4 5 6))
= (14 19 24)
107
(let ((x a)) <expr>)
((lambda (x) <expr>) a)
Exemples :
(let ((x 2)) (+ x x)) ((lambda (x) (+ x x)) 2)
108
Soient les deux fonctions suivantes :
1. Retourner les plus petits quun l ment dans une liste
(de petits (a l)
(cond
((null l) ())
((< (car l) a) (cons (car l) (petits a (cdr l))))
(petits a (cdr l))))
(t
109
2. Retourner les plus grands quun l ment dans une liste
(de grands (a l)
(cond
((null l) ())
((>= (car l) a) (cons (car l) (grands a (cdr l))))
(grands a (cdr l))))
(t
110
Filtres
} Les deux fonctions petits et grands sont, lexception
des deux tests, rigoureusement identiques.
} Elles effectuent le m me travail : passer en revue les
l ments dune liste en les soumettant un test et ne
retenir que ceux qui passent le test.
} Alors peut-on programmer ceci en une fonction
g n rale qui prendrait comme argument la fonction de
test utiliser et la liste filtrer par ce test ?
111
Filtres
(de filtre (test l)
(cond
((null l) ())
((funcall test (car l)) (cons (car l)
(filtre test (cdr l)))
(t (filtre test (cdr l)))))
112
Filtres
} funcall
(funcall <fn> <s1> &<sn>) o <fn> d signe une fonction
qui sera appliqu e aux arguments <s1> &<sn>.
Exemple :
? (filtre (lambda (x) (>= x 9)) (15 7 12 3))
= (15 12)
113
Filtres
Nos deux fonctions petits et grands peuvent sexprimer
alors comme suit :
(de petits (a l)
(filtre (lambda (x) (< x a)) l))
(de grands (a l)
(filtre (lambda (x) (>= x a)) l))
Lint r t du filtre est de cr er une classe de fonctions tr s
g n rales pour s lectionner des l ments dans une liste.
114
} Les objets LISP sont trop complexes pour pouvoir tre
rang s dans un seul mot m moire.
} Ils sont en g n ral repr sent s par un pointeur.
} La cr ation des doublets de listes et des autres objets
Lisp se fait le plus souvent dynamiquement.
} Un dispositif g n ral appel GARBAGE-COLLECTOR
r cup re automatiquement les doublets et objets
inutilis s .
115
} Pointeurs et doublets
On appelle doublet (ou cons) un ensemble de deux pointeurs.
Nous le repr sentons par un diagramme en "bo tes et fl ches":
Une liste peut tre consid r e comme un ensemble ordonn de
deux l ments, le premier s'appelle le CAR et le second le
CDR de la liste. On repr sente donc une liste par un doublet
dont la premi re partie pointe vers le CAR et la seconde vers le
CDR de la liste.
116
} Pointeurs et doublets
Exemples :
a. Repr sentation en m moire de la liste
(LISP LANGAGE FONCTIONNEL).
117
} Pointeurs et doublets
b. Repr sentation de la liste (A (B A) B) par un diagramme en
bo tes et fl ches.
118
119
120
121
122
123
(ajoutN e n l)
Ecrire une fonction ajoutN qui ajoute un l ment la ni me position dune
liste.
(rech e p l)
Ecrire une fonction rech qui cherche si un l ment e se trouve la position p
dune liste l.
(pair l)
retourne la liste des l ments pairs dune liste (Utiliser les Filtres)
(impair l)
retourne la liste des l ments impairs dune liste (Utiliser les Filtres)
(list-abs-mapcar l)
Ecrire une fonction qui retourne la liste des valeurs absolues des l ments
dune liste (Utiliser mapcar)
Ecrire une fonction qui retourne f(1). Appliquer cette fonction f(x) = 3x + 2
124
Ecrire une variante de la fonction mapcar :
mapcar-fill (f l1 l2)
o f est une fonction, l1 et l2 des listes et qui retournent la m me
chose que mapcar si les deux listes sont de m me longueur et une
liste dont les premiers l ments sont les m mes que ce qui est
renvoy par mapcar et le reste des l ments sont les l ments
suppl mentaires de la liste la plus longue.
Exemples :
? (mapcar-fill + (1 5 8) (3 4 2))
= (4 9 10)
? (mapcar-fill + (1 5 8) (3 4 2 6 7 4 2))
= (4 9 10 6 7 4 2)
125
Ecrire une fonction mappend (fun l) qui applique la
fonction fun chaque l ment de la liste l (et dont le r sultat
doit tre une autre liste) puis renvoie la concat nation des
r sultats ainsi obtenus.
Exemple :
? (mappend (lambda (x) (list x (1+ x))) (5 3 9 2 5))
=(5 6 3 4 9 10 2 3 5 6)
? (mapcar (lambda (x) (list x (1+ x))) (5 3 9 2 5))
= ((5 6) (3 4) (9 10) (2 3) (5 6))
126
Ecrire une fonction combien qui retourne le nombre d l ments de la liste
v rifiant un pr dicat.
Exemples :
(combien 'evenp '(1 5 7 6 2))
= 2
(combien 'numberp '(2 3 4 a b 5 t + 8))
= 5
(combien (lambda (x) (= (modulo x 2) 0)) '(1 5 7 6 2))
= 2
Ecrire une fonction TRI qui affiche un menu permettant lutilisateur de choisir
un algorithme de tri appliquer. La liste trier est saisie au clavier.
127
(de next-line (l) (mapcar + (cons 0 l) (append l (list 0))))
1. Tester la fonction next-line en lappliquant n fois la liste (1).
2. En utilisant la fonction next-line, crire une fonction triangle (n) qui construit une
liste contenant les listes correspondant aux lignes du triangle de Pascal dordre n.
Exemples :
(triangle 0)
((1))
(triangle 1)
((1) (1 1))
(triangle 2)
((1) (1 1) (1 2 1))
(triangle 3)
((1) (1 1) (1 2 1) (1 3 3 1))
(triangle 4)
((1) (1 1) (1 2 1) (1 3 3 1) (1 4 6 4 1))
128