You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
355 lines
6.6 KiB
355 lines
6.6 KiB
#|
|
|
| #(@)nomfichier.c ENSICAEN 2005-11-21
|
|
|
|
|
| @author MASSE Nicolas (2005-Groupe4-LIMIN) <nicolas27.masse@laposte.net>
|
|
| @author LIMIN Thomas (2005-Groupe4-MASSE) <thomas.limin@laposte.net>
|
|
|
|
|
| ENSICAEN
|
|
| 6 Boulevard Marechal Juin
|
|
| F-14050 Caen Cedex
|
|
|
|
|
| Ce fichier est l'oeuvre d'eleves de l'ENSI de Caen. Il ne peut etre
|
|
| reproduit, utilise ou modifie sans l'avis express de ses auteurs.
|
|
|#
|
|
|
|
#|
|
|
| TP n° 1 de Programation symbolique
|
|
|#
|
|
|
|
#|
|
|
| @version 1.0.0
|
|
|
|
|
| @Fait: -
|
|
|
|
|
| @Afaire: énoncé
|
|
|#
|
|
|
|
|
|
#| CAR = Content of Address Register
|
|
| First element of list
|
|
| Also named FIRST
|
|
|#
|
|
(print (car '(p h w))) ; P
|
|
|
|
#| CDR = List minus the first element
|
|
| Also named REST
|
|
|#
|
|
(print (cdr '(b a c d))) ; (A C D)
|
|
|
|
(setq x '((anne emma) (marc michel)))
|
|
(print (first x)) ; (ANNE EMMA)
|
|
(print (rest x)) ; ((MARC MICHEL))
|
|
(print (first (rest x))) ; (MARC MICHEL)
|
|
(print (rest (first x))) ; (EMMA)
|
|
(print (rest (first (rest x)))) ; (MICHEL)
|
|
(print (first (rest (first x)))) ; EMMA
|
|
|
|
#| ((a b) (c d) (e f)) => Y |#
|
|
(setq y '((a b) (c d) (e f)))
|
|
|
|
(print (cadadr y)) ; D
|
|
(print (caaddr y)) ; E
|
|
#| Doesn't function, because CAR performed on non-list argument, replace by CADR
|
|
| (print (caadr '(cdr y)))
|
|
|#
|
|
|
|
#| CDDR is not a list, so CAAR cannot perform on it, replace by CAR
|
|
| (print (caar '(cddr y)))
|
|
|#
|
|
|
|
; the list following the quote is handled as data
|
|
(print (car '(caddr ((a b) (c d) (e f))))) ; CADDR
|
|
(print '(car (car (cdr (cdr y))))) ; (CAR (CAR (CDR (CDR Y))))
|
|
|
|
#|
|
|
| Ex 2
|
|
|#
|
|
|
|
(print (caddr '(a b c d) ))
|
|
(print (caadr '((a b) (c d)) ))
|
|
; CAADDAR is not defined (too long)
|
|
(print (car (caddar '(((a) (b) (c) (d))) )))
|
|
(print (caaddr '((((a))) ((b)) (c) d) ))
|
|
(print (cadar '((((a) b) c) d) ))
|
|
|
|
#|
|
|
| Ex 3
|
|
|#
|
|
|
|
; (A B) => L
|
|
(print (setq l '(a b)))
|
|
|
|
(print (append l l)) ; (A B A B)
|
|
;(print (append 'l l)) L is not a list
|
|
(print (append l 'l)) ; (A B . L)
|
|
|
|
(print (car (cons 'a '(b c)))) ; A
|
|
(print (cdr (cons 'a '(b c)))) ; (B C)
|
|
(print (cons (car l) (cdr l))) ; (A B)
|
|
|
|
(print (cons (car nil) (cdr nil))) ; (NIL) because of (car nil)
|
|
(print (cons l l)) ; ((A B) A B)
|
|
(print (cons 'l l)) ; (L A B)
|
|
|
|
#|
|
|
| Ex 4
|
|
|#
|
|
(print (cons '(a b x) '())) ; ((A B X))
|
|
(print (append '(a b) '(c d))) ; (A B C D)
|
|
(print (list l l)) ; ((A B) (A B))
|
|
(print (cons 'l l)) ; (L A B)
|
|
(print (list '(a b c) '())) ; ((A B C) NIL)
|
|
(print (append '(a b c) '())) ; (A B C)
|
|
(print (cons '(a b) '(c d))) ; ((A B) C D)
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| a)
|
|
|#
|
|
(defun decale (liste)
|
|
(append (cdr liste)
|
|
(list (car liste))
|
|
)
|
|
)
|
|
(print (decale '(a b c d))) ; (B C D A)
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| b)
|
|
|#
|
|
(defun inverse (liste)
|
|
(if (NULL liste)
|
|
NIL
|
|
(append
|
|
(inverse (cdr liste))
|
|
(list (car liste))
|
|
)
|
|
)
|
|
)
|
|
|
|
(print (inverse '(a b c d))) ; (D C B A)
|
|
(print (inverse NIL)) ; NIL
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| c)
|
|
| Calculer la liste formée par la répétition inverse d'une liste
|
|
|#
|
|
(defun duplique (liste)
|
|
(let ((inv_liste (inverse liste)))
|
|
(append inv_liste inv_liste)
|
|
)
|
|
)
|
|
|
|
(print (duplique '(a b c d)))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| d)
|
|
| the list following "&optional" defines the name of the parameter
|
|
| and its default value
|
|
|#
|
|
(defun nbatome (liste &optional (nb 0))
|
|
(if (null liste)
|
|
nb ; terminal recursivity
|
|
(nbatome (cdr liste)
|
|
(if (atom (car liste))
|
|
(+ 1 nb)
|
|
nb
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(print (nbatome '(a b c (2) r (3) s)))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| e)
|
|
| Calculer la liste composée du premier et du dernier élément d'une liste
|
|
|#
|
|
(defun premder (liste)
|
|
(let ((fin (cdr (cdr liste))))
|
|
(if (NULL fin)
|
|
liste
|
|
(premder (cons (car liste) (cdr (cdr liste)))))
|
|
)
|
|
)
|
|
|
|
(print (premder '(76 45 34 90 2 9 4 8 56 4 2 87)))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| f)
|
|
| Calcul du PGCD
|
|
|#
|
|
(defun pgcd (p q)
|
|
(if (= q 0)
|
|
p
|
|
(pgcd q (rem p q))
|
|
)
|
|
)
|
|
|
|
(print (pgcd 23 21))
|
|
(print (gcd 23 21))
|
|
|
|
(print (pgcd 24 15))
|
|
(print (gcd 24 15))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| g)
|
|
| Suite de Syracuse
|
|
|#
|
|
(defun syra (un)
|
|
(progn
|
|
(print un)
|
|
(if (= un 1)
|
|
()
|
|
(syra
|
|
(if (evenp un)
|
|
(/ un 2)
|
|
(+ 1 (* 3 un))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;(print "U0 = ")
|
|
;(syra (read))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| h)
|
|
| Vérifier qu'un mot éclaté en liste est un palyndrome
|
|
|#
|
|
(defun palindromep (liste) (equal liste (inverse liste)))
|
|
|
|
(print (palindromep '(e s o p e r e s t e e t s e r e p o s e) ))
|
|
(print (palindromep '(b a t e a u) ))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| i)
|
|
| Construire la liste décroissante des n premiers entiers positifs ou nuls
|
|
|#
|
|
(defun genere (nb &optional(liste NIL))
|
|
( if (>= nb 0)
|
|
(genere (- nb 1) (append liste (list nb)))
|
|
liste
|
|
)
|
|
)
|
|
|
|
(print (genere 10 ))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| j)
|
|
| Determiner le nombre médian de 3 nombres
|
|
|#
|
|
(defun median (n1 n2 n3)
|
|
(max (max (min n1 n2) (min n2 n3)) (min n3 n1))
|
|
)
|
|
|
|
(print (median 1 2 3 ))
|
|
(print (median 2 3 1 ))
|
|
(print (median 3 1 2 ))
|
|
|
|
#|
|
|
| Ex 5
|
|
| k)
|
|
| Returns the list of the different elements
|
|
|#
|
|
(defun diff (liste)
|
|
(if (null liste)
|
|
()
|
|
(if (member (car liste) (cdr liste))
|
|
(diff (cdr liste))
|
|
(cons (car liste) (diff (cdr liste)))
|
|
)
|
|
)
|
|
)
|
|
|
|
(print (diff '(6 4 9 10 3 6 2 9 3 3 4)))
|
|
|
|
|
|
#|
|
|
| Ex 5
|
|
| l)
|
|
| Trier une liste dans l'ordre croissant
|
|
|#
|
|
(defun inserer (liste nb)
|
|
(if (null liste)
|
|
(list nb)
|
|
(if (> (car liste) nb)
|
|
(cons nb liste)
|
|
(cons (car liste) (inserer (cdr liste) nb))
|
|
)
|
|
)
|
|
)
|
|
(defun trier (liste &optional(res NIL))
|
|
(if (null liste)
|
|
res
|
|
(progn
|
|
(trier (cdr liste) (inserer res (car liste)))
|
|
)
|
|
)
|
|
)
|
|
|
|
|
|
(print (trier '(2 3 10 9 4 6)))
|
|
|
|
#|
|
|
| Ex 5
|
|
| m)
|
|
| Calculer l'histogramme d'une liste de nombre, c'est à dire le nombre d'occurences de chaque nombre
|
|
|#
|
|
(defun addoccur (dat nb)
|
|
(if (null dat)
|
|
(list (list nb 1))
|
|
(if (= (caar dat) nb)
|
|
(cons (list nb (1+ (cadar dat))) (cdr dat))
|
|
(if (> (caar dat) nb)
|
|
(cons (list nb 1) dat)
|
|
(cons (car dat) (addoccur (cdr dat) nb))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(defun histo (liste &optional(dat NIL))
|
|
(if (null liste)
|
|
dat
|
|
(histo (cdr liste) (addoccur dat (car liste)))
|
|
)
|
|
)
|
|
|
|
(print (histo '(6 4 9 10 3 6 2 9 3 3 4)))
|
|
|
|
#|
|
|
| Ex 5
|
|
| n)
|
|
| Se servir de cet histogramme pour calculer le nombre médian de cette liste.
|
|
|#
|
|
(defun median (liste &optional(nb NIL))
|
|
(if (null nb)
|
|
(median (histo liste) (/ (length liste) 2))
|
|
(if (<= nb (cadar liste))
|
|
(caar liste)
|
|
(median (cdr liste) (- nb (cadar liste)))
|
|
)
|
|
)
|
|
)
|
|
|
|
(print (median '(6 4 9 10 3 6 2 9 3 3 4)))
|
|
|
|
|