;;; Exercice 1 ;; 1. (defun coeff (monome) (car monome)) ;; 2. (defun degre (monome) (cdr monome)) ;; 3. (defun monome+ (monome1 monome2) (let ((d (degre monome1))) (assert (= d (degre monome2))) (cons (+ (coeff monome1) (coeff monome2)) d))) ;; 4. (defun monomes+ (monomes) (assert monomes) (reduce #'monome+ monomes)) ;; 5. (defun sort-monomes (monomes) (sort (copy-list monomes) #'< :key #'degre)) ;; 6 (defun groupe-degres (monomes) (if (endp monomes) '() (let* ((monome (car monomes)) (degre (degre monome))) (multiple-value-bind (memedegre different) (partition (lambda (e) (= (degre e) degre)) monomes) (cons (monomes+ memedegre) (groupe-degres different)))))) ;;; Exercice 2 ;; 1. (defun list-monome (monome) (cons '* (cons (coeff monome) (make-list (degre monome) :initial-element 'X)))) ;; 2. (defmacro defpoly (nom monomes) `(defun ,nom (x) (+ ,@(mapcar #'list-monome monomes)))) ;;; Exercice 3 ;; 1. ;; Réponse 1. *E* ;; Réponse 2. MI T ;; Réponse 3. NIL NIL ;; 2. (defclass constant-enumerator (abstract-enumerator) ((constant :initarg :constant :reader constant))) ;; 3. (defmethod next-element-p ((e constant-enumerator)) T) ;; 4. (defmethod next-element ((e constant-enumerator)) (constant e)) ;; 5. (defclass abstract-enumerator () ()) (defclass list-enumerator (abstract-enumerator) (defclass constant-enumerator (abstract-enumerator) ;; 6. (defun ncirc (l) (nconc l l)) (defun circ (l) (ncirc (copy-list l))) (defun make-circular-list-enumerator (l) (init-enumerator (make-instance 'list-enumerator :initial-list (circ l))))