Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Упростить выражение


Автор: integral 11.11.2006, 13:38
Я вообще новичок в ФП, поэтому не знаю на сколько это реально: Нада написать ф-цию или их набор, которые упрощают алгебраическое выражение одной переменой записаное в польской нотации. Т. е. упрощать нужно что-то типа (+ (+ x 1) (- x 1)) получится (* 2 x), ну или что-то подобное. Хорошо-бы примерчик кода

Автор: Lisp2D 12.11.2006, 23:48
Данная задача попахивает искуственным интеллектом, точного алгоритма нет.
Можно просто попробовать различные методы практические из жизни.

- Учиться программировать нужно от более простых задач.

Автор: adejneka 13.11.2006, 07:09
Сначала стоит определиться с тем, что такое "алгебраическое выражение". Например, можно считать, что в нем используются операции сложения, вычитания, умножения и деления. Тогда упрощением можно попробовать считать приведение к форме отношения двух многочленов. Соответственно, нужно определить четыре операции над такими выражениями. Многочлены можно представить либо как список коэффициентов при последовательных степенях X, либо как список пар (степень коэф), дроби - как пары взаимно простых многочленов. Дальше определяете алгебраические операции над дробями и пишете рекурсивный вычислитель:
Код

(defun ratio-eval (exp)
  (if (atom exp)
      (encode-ratio exp)
      (destructuring-bind (oper arg1 arg2) exp
        (let ((rarg1 (ratio-eval arg1))
              (rarg2 (ratio-eval arg2)))
          (ecase oper
            (+ (ratio+ rarg1 rarg2))
            (- (ratio- rarg1 rarg2))
            (* (ratio* rarg1 rarg2))
            (/ (ratio/ rarg1 rarg2)))))))

После этого, осталось только перевести результат в красивый вид.

Автор: Void 13.11.2006, 19:23
Помимо книг по компьютерной алгебре (например, на русском языке доступен одноимённый сборник под редакцией Бухбергера), возможно, стоит заглянуть в исходники http://maxima.sourceforge.net/ — CAS, написанной большей частью на Лиспе.

Автор: integral 14.11.2006, 22:39
Ага, ясна, щас гляну. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)