Сначала стоит определиться с тем, что такое "алгебраическое выражение". Например, можно считать, что в нем используются операции сложения, вычитания, умножения и деления. Тогда упрощением можно попробовать считать приведение к форме отношения двух многочленов. Соответственно, нужно определить четыре операции над такими выражениями. Многочлены можно представить либо как список коэффициентов при последовательных степенях 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)))))))
|
После этого, осталось только перевести результат в красивый вид. |