Вычисление арифметического выражения oz mozart

У меня есть проблема, и я действительно не знаю, как это реализовать в OZ: Предположим, что вам дано арифметическое выражение, описываемое деревом, построенным из кортежей следующим образом:

  1. Целое число описывается кортежем int(N), где N — целое число.
  2. Добавление описывается кортежем add(X Y), где X и Y являются арифметическими выражениями.
  3. Умножение описывается кортежем mul(X Y), где X и Y являются арифметическими выражениями.

Реализуйте функцию Eval, которая принимает арифметическое выражение и возвращает его значение.

Например, add(int(1) mul(int(3) int(4))) — это арифметическое выражение, и его вычисление возвращает 13.


person Alma A    schedule 09.01.2019    source источник


Ответы (1)


Немного грустно, что вы пока не показали свои попытки.

В любом случае. Обычно при решении таких проблем вы мыслите в терминах рекурсии. И соответствие шаблону хороший способ проанализировать выражение.

Например, если вы можете вычислить int(4), то вполне очевидно, как вычислить add(int(4) int(4)) с помощью простой рекурсии:

declare
proc {Eval Exp Res}
   case Exp
   of int(N) then Res = N
   [] add(X Y) then
      local R1 R2 in
         {Eval X R1}
         {Eval Y R2}
         Res = R1 + R2
      end
   end
end

Теперь вы можете расширить его с помощью mul или любого другого выражения.

person vonaka    schedule 14.01.2019