Оценка арифметического выражения oz mozart - PullRequest
0 голосов
/ 09 января 2019

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

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

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

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

1 Ответ

0 голосов
/ 14 января 2019

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

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

Например, если вы способны оценить 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 или любого другого выражения.

...