Exercices de LISP
Université Paris 8
Département Informatique
Cette page propose un ensemble d'exercices à l'intention des étudiants
débutant dans la programmation en langage Lisp. Constitué à partir des
enseignements de Lisp du Département Informatique, il est destiné à être
enrichi grâce aux suggestions de chacun, enseignants, Tpistes, tuteurs
ou étudiants. La dernière partie contient une bibliographie
d'ouvrages,
disponibles à la Bibliothèque de l'Université, présentant également des
exercices de Lisp.
Pour toutes remarques, critiques ou suggestions, s'adresser à
Francoise Balmas
Sources : Jym Feat, Francoise Balmas
Exercices à faire directement au prompt Lisp, puis sous forme de fonctions (éventuellement définies dans un fichier):
- Fonctions numériques
- calculer le carré d'un nombre, puis son cube
- calculer le périmètre et la surface d'un rectangle, d'un trapèze et d'un triangle
- Fonctions sur les listes : car, cdr et cons
- extraire le 2ème, le 3ème, le 4ème, ..., élément d'une liste
- extraire le 2ème, le 3ème, ..., de la 1ère, 2ème, 3ème, ..., sous-liste d'une liste
- construire une liste à partir de 2, 3, 4, ..., éléments isolés
- Prédicats et tests
- déterminer si oui ou non un élément est un nombre, un littéral, une chaîne ou une liste
- déterminer si un élément est un nombre ou un littéral
- déterminer si un élément est une liste pleine ou vide
- déterminer si un élément est un nombre inférieur à 10
- déterminer si un élément est une liste contenant seulement 1, 2, 3, ..., éléments
- déterminer si deux listes sont différentes
- déterminer si deux éléments sont des listes différentes
- déterminer si le 1er, 2ème, 3ème, ..., élément d'une liste est un nombre, une chaîne, un nombre inférieur à 15, ...
- déterminer si un nombre est un multiple de X
- déterminer si un nombre est un carré
Exercices à faire sous forme de fonctions
- Structures de contrôle : alternatives
- tester si un nombre est négatif, positif ou nul
- déterminer le type d'un élément (nombre, chaîne, littéral ou liste)
- calculer la valeur absolue d'un nombre
- déterminer le minimum, le maximum parmi 2, 3, 4, ..., nombres
- Structures de contrôle : boucles
- afficher 3, 12, N fois un mot
- afficher les nombres de 1 à 10, de 20 à 50
- afficher les nombres de 50 au premier multiple de 37
- chercher le premier carré supérieur à X
- déterminer si un nombre est premier
- Manipulation de listes (en utilisant des fonctions standard, puis
en les implémentant soi-même)
- tester si un élément (atome ou liste) existe dans une liste
- inverser l'ordre des éléments d'une liste
- extraire le dernier élément d'une liste
- concaténer deux listes
- comparer deux listes
- calculer la longueur d'une liste
- supprimer la première, puis toutes les occurrences d'un élément dans une liste
- extraire le Nème élément d'une liste
- remplacer toutes les occurrences d'un élément dans une liste par un autre élément
- Manipulation d'arbres (listes à tous les niveaux)
- mêmes exercices que pour les listes
- Manipulation de A-listes
- chercher la valeur d'une clé dans une liste d'associations (A-liste)
- construire la liste des clés d'une A-liste
- construire une A-liste à partir d'une liste de clés et d'une liste de valeurs
- Exercices sur une base de connaissances
; Base = un ensemble de personnes (nom, prénom, ville où elles habitent,
; âge et nombre de livres possédés)
(setq Base '( (Dupond Pierre Lyon 45 150)
(Dupond Marie Nice 32 200)
(Dupond Jacques Lyon 69 20)
(Perrot Jacques Geneve 28 500)
(Perrot Jean Nice 55 60)
(Perrot Anna Grenoble 19 180)
))
(de nom (u) (car u))
(de prenom (u) (cadr u))
(de ville (u) (caddr u))
(de age (u) (car (cdddr u)))
(de nb-livres (u) (cadr (cdddr u)))
- afficher toutes les personnes
- afficher les personnes qui s'appellent Perrot
- afficher les personnes qui habitent Lyon
- afficher les personnes dont le nom est un argument
- rechercher la première personne qui a X ans (X = un argument)
- rechercher la première personne qui possède moins de 100 livres
- rechercher la première personne habitant à Lyon qui a plus de 50 ans
- calculer la somme des livres possédés par toutes les personnes
- calculer la somme des livres possédés par les personnes habitant à Lyon
- calculer la somme des livres possédés par les membres de la famille X
- calculer la moyenne des âges de toutes les personnes
- calculer la moyenne des âges des personnes de la famille X
- construire une copie de la base
- construire une copie de la base sans indication du nombre de livres possédés
- rechercher toutes les personnes qui habitent à Lyon
- rechercher toutes les personnes qui n'habitent pas à Nice
- rechercher toutes les personnes qui portent le nom X
- rechercher toutes les personnes qui portent le nom X et qui habitent à Y
Exercices à faire directement au prompt Lisp, éventuellement en s'aidant d'un schéma représentant la mémoire interne
- Exercice sur les modifications physiques
(setq X '(a b c))
(setq Y X)
(setq Z (copy X))
- déterminer les valeurs des variables X, Y et Z
- déterminer les variales qui sont eq ou equal
(rplaca X 1)
(setq X '(a b c))
(setq Y '(d e f))
(setq Z (copy X))
(setq W (nconc X Y))
- déterminer les valeurs des variables X, Y, Z et W
(nconc Y Y)
(de F1 (L1 L2)
(cond
((atom L1) L2)
((cons
(car L1)
(F1 (cdr L1) L2)) ) ) )
(de F2 (A L)
(cond
((atom L) nil)
((eq (car L) A) L)
((F2 A (cdr L))) ) )
(de F3 (L) (if L (cons (car L) (F3 (cddr L)))))
(de F4 (L)
(cond
((atom L) 0)
((1+ (F4 (cdr L)) )) ) )
(de F5 (L)
(cond
((atom L) nil)
((atom (cdr L)) L)
((F5 (cdr L))) ) )
(de F6 (A L)
(cond
((atom L) L)
((eq (car L) A) (F6 A (cdr L)))
((cons
(car L)
(F6 A (cdr L)) ) ) ) )
(de F7 (L)
(cond
((atom L) L)
((F2 (car L) (cdr L)) (F7 (cdr L)))
((cons
(car L)
(F7 (cdr L)) ) ) ) )
(de F8 (A1 A2 L)
(cond
((atom L) L)
((eq (car L) A2)
(cons
A1
(F8 A1 A2 (cdr L)) )) ))
(de F9 (A1 A2 L)
(cond
((eq A2 L) A1)
((atom L) L)
((cons
(F9 A1 A2 (car L))
(F9 A1 A2 (cdr L)) ) ) ) )
(de F10 (N L)
(cond
((atom L) nil)
((eq N 1) (car L))
((F10 (1- N) (cdr L))) ) )
(de F11 (N L)
(cond
((atom L) nil)
((eq N 1) (cdr L))
((F11 (1- N) (cdr L))) ) )
(de F12 (L N)
(cond
((eq N 0) L)
((F12 (cdr L) (1- N))) ) )
(de F13 (L N)
(cond
((eq N 0) nil)
((cons
(car L)
(F13 (cdr L) (1- N))) ) ) )
(de F14 (L N1 N2)
(F13
(F11 N1 L)
(1+ (- N2 N1)) ) )
(de F15 (N A)
(cond
((eq N 0) nil)
((cons
A
(F15 (1- N) A) ) ) ) )
(de F16 (L1 L2)
(cond
((atom L1) L2)
((F2 (car L1) L2) (F16 (cdr L1) L2))
((cons
(car L1)
(F16 (cdr L1) L2) ) ) ) )
(de F17 (L1 L2)
(cond
((atom L1) nil)
((F2 (car L1) L2)
(cons
(car L1)
(F17 (cdr L1) L2) ) )
((F17 (cdr L1) L2)) ) )
(de F18 (L1 L2)
(cond
((atom L1) nil)
((F2 (car L1) L2) (F18 (cdr L1) L2))
((cons (car L1) (F18 (cdr L1) L2))) ) )
(de F19 (L1 L2) (F1 (F18 L1 L2) (F18 L2 L1)))
- Manuels de Lisp avec exercices et solutions
- H. Wertz, (Common) LISP : une introduction à la programmation. Ed. Masson, Paris 1989
- D.P. Friedman, M. Felleisen, Le Petit LISPien. Ed. Masson, Paris 1991
- P.H. Winston, B.K.P. Horn, LISP. Addison-Wesley, Reading (MA) 1981
- H. Farreny, LISP. Ed. Masson, Paris 1984
- Ouvrages de programmation Lisp avec exercices et solutions
- H. Abelson, G.J. Sussman, Structures et interprétation des programmes informaiques. InterEditions, Paris 1989
- C. Queinnec, LISP Mode d'emploi. Ed. Eyrolles, Paris 1984
- dernière mise à jour : 10 mars 1997
- F. Balmas
- Laboratoire d'Intelligence Artificielle