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


Table des Matieres


Exercices à faire directement au prompt Lisp, puis sous forme de fonctions (éventuellement définies dans un fichier):

Fonctions numériques

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)
  • mêmes questions
	 (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)
  • mêmes questions


Fonctions Lisp a analyser (pour comprendre leur fonctionnement et trouver a quelle fonction standard elles correspondent eventuellement)

(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)))



Bibliographie

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