Модификация программы дифференцирования
Предположим, что нам захотелось изменить программу дифференцирования так, чтобы она работала с обычной математической нотацией, где
+
и
*
не префиксные, а инфиксные операции. Поскольку программа взятия производных определена в терминах абстрактных данных, мы можем изменять представление выражений, с которыми она работает, меняя только предикаты, селекторы и конструкторы, определяющие представление алгебраических выражений, с которыми должен работать дифференциатор.
а. Покажите, как это сделать так, чтобы брать производные от выражений, представленных в инфиксной форме, например
(x + (3 * (x + (y + 2))))
. Для упрощения задачи предположите, что
+
и
*
всегда принимают по два аргумента, и что в выражении расставлены все скобки.
б. Задача становится существенно сложней, если мы разрешаем стандартную алгебраическую нотацию, например
(x + 3 * (x + y + 2))
, которая опускает ненужные скобки и предполагает, что умножение выполняется раньше, чем сложение. Можете ли Вы разработать соответствующие предикаты, селекторы и конструкторы для этой нотации так, чтобы наша программа взятия производных продолжала работать?
Комментарии отсутствуют.