Упрощение выражений на Lisp

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, уважаемые профессионалы и начинающие специалисты! Появилась необходимость в кратчайшие сроки реализовать небольшую программу на Lisp, суть которой состоит в упрощении арифметических выражений. К примеру, пользователь передаёт в функцию следующее выражение (+ (* 2 x) (* 2 x)) и должно вывести 4x. Раньше с подобными языками дела не имел, а сроки горят. Думаю, для спецов по данному языку подобное задание "как дважды два" . Кому не сложно и не жалко помочь, буду крайне благодарен! Для примера (возможно, его можно как-то модифицировать под это задание) сброшу мою программу по дифференцированию на Lisp (но не уверен, что она хороша). Заранее благодарен за ответы, с уважением.

Решение задачи: «Упрощение выражений на Lisp»

textual
Листинг программы
  1. (setf (get '+ 'diff) 'diff_plus)
  2.  
  3. (setf (get '- 'diff) 'diff_minus)
  4.  
  5. (setf (get '* 'diff) 'diff_mult)
  6.  
  7. (setf (get '/ 'diff) 'diff_div)
  8.  
  9. (setf (get '+ 'reduce) 'reduce_plus)
  10.  
  11. (setf (get '- 'reduce) 'reduce_minus)
  12.  
  13. (setf (get '* 'reduce) 'reduce_mult)
  14.  
  15. (setf (get '/ 'reduce) 'reduce_div)
  16.  
  17. (defun diff_g(a x)
  18.     (cond ((atom a) (if (eql a x) 1 0))
  19.         (t (funcall  (get (car a) 'diff) (cdr a) 'x))
  20.     )
  21. )
  22.  
  23. (defun reduce_g(l)
  24.     (cond ((atom l) l)
  25.         (t (funcall (get (car l) 'reduce) (cdr l)))
  26.     )
  27. )
  28.  
  29. (defun diff_plus(l x)
  30.     (list '+ (diff_g (car l) 'x) (diff_g (cadr l) 'x))
  31. )
  32.  
  33. (defun diff_minus(l x)
  34.     (list '- (diff_g (car l) 'x) (diff_g (cadr l) 'x))
  35. )
  36.  
  37. (defun diff_mult(l x)
  38.     (list '+ (list '* (diff_g (car l) 'x) (cadr l))
  39.              (list '* (diff_g (cadr l) 'x) (car l))
  40.     )
  41. )
  42.  
  43. (defun reduce_plus(l)
  44.     (cond
  45.         ((and (numberp (car l)) (zerop (car l))) (cadr l))
  46.         ((and (numberp (cadr l)) (zerop (cadr l))) (car l))
  47.         ((and (numberp (car l)) (numberp (cadr l))) (+ (car l) (cadr l)))
  48.         (t (list '+ (reduce_g (car l)) (reduce_g (cadr l))))
  49.     )
  50. )
  51.  
  52. (defun reduce_minus(l)
  53.     (cond
  54.         ((equal (car l) (cadr l)) 0)
  55.         ((and (numberp (car l)) (zerop (car l))) (- 0 (cadr l)))
  56.         ((and (numberp (cadr l)) (zerop (cadr l))) (car l))
  57.         ((and (numberp (car l)) (numberp (cadr l))) (- (car l) (cadr l)))
  58.         (t (list '- (reduce_g (car l)) (reduce_g (cadr l))))
  59.     )
  60. )
  61.  
  62. (defun reduce_mult(l)
  63.     (cond
  64.         ((and (numberp (car l)) (zerop (car l))) 0)
  65.         ((and (numberp (cadr l)) (zerop (cadr l))) 0)
  66.         ((and (numberp (car l)) (eql 1 (car l)) (cadr l)))
  67.         ((and (numberp (car l)) (numberp (cadr l))) (* (car l) (cadr l)))
  68.         (t (list '* (reduce_g (car l)) (reduce_g (cadr l))))
  69.     )
  70. )
  71.  
  72. (defun reduce_div(l)
  73.     (cond
  74.         ((and (numberp (car l)) (zerop (car l))) 0)
  75.         ((and (numberp (cadr l)) (zerop (cadr l))) -111111111)
  76.         ((and (numberp (cadr l)) (eql 1 (cadr l))) (car l))
  77.         ((and (numberp (car l)) (numberp (cadr l))) (/ (car l) (cadr l)))
  78.         (t (list '/ (reduce_g (car l)) (reduce_g (cadr l))))
  79.     )
  80. )
  81.  
  82. (defun diff_div(l x)
  83.     (list '/ (list '- (list '* (diff_g (car l) x) (cadr l)) (list '* (diff_g (cadr l) x) (car l))) (list '* (car l) (car l)))
  84. )
  85.  
  86. (defun reduce_f(next)
  87.     (setq prev next)
  88.     (setq next (reduce_g prev))
  89.     (if (equal prev next) next (reduce_f next))
  90. )

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.231 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут