Spero che qualcuno di voi conosca il linguaggio Lisp perchè ho proprio bisogno di un aiuto!!!
Devo creare delle funzioni per il calcolo di derivate matematiche, fin qui nessun problema.. il passo dopo però è quello di semplificare i risultati ottenuti togliendo ad esempio le moltiplicazioni per 1, le somme con 0, l'elevamento a 1 ecc..
Il codice l'ho buttato giù cosi:
(defun derivata (f g)
;serie di condizioni per il calcolo delle derivate es:
(cond ((equal (first f) '*) `(+ (* ,(second f) ,(derivata (third f) g)) (* ,(third f) ,(derivata (second f) g))))
; etc....))
; chiamata per ottenere le derivate già semplificate
(defun der (f g) (semplifica (derivata f g)))
;funzione che DOVREBBE andare a valutare ogni elemento della lista applicandogli le regole di semplificazione
(defun semplifica (d)
(cons (car d) (mapcar 'semplificazione (cdr d))))
; regole di semplificazione
(defun semplificazione (d)
;serie di condizioni per ogni tipo di semplificazione es:
(cond ((and (equal (first d) '+) (equal (second d) '0)) (semplificazione (third d)))
; etc .....))
Ecco qua.. il problema è che se chiamo:
> (der '(* x x) 'x)
(+ x x)
funziona perfettamente, ma quando iniziano ad esserci funzioni annidate non fa più nulla .. esempio:
> (der '(+ (* 2 x) (* 3 x)) 'x)
(+ (+ (* 2 1) (* X 0)) (+ (* 3 1) (* X 0)))
Non riesco in pratica a far si che la semplificazione vada in profondità .. qualcuno ha la più pallida idea di come si potrebbe fare?! Almeno un'idea di base poi con il codice mi arrangio io però ora come ora sono nel nulla più totale e la cosa fantastica è che devo consegnare questo progetto entro il 28 dicembre..
Se avete qualche dubbi sulla mia spiegazione del problema chiedete pure cercherò di essere più chiara.. GRAZIE in anticipo!!!