Я в затруднении с тем, как решить мою проблему. У меня есть домашнее задание, в котором мне нужно упростить выражения, используя правила, изложенные профессором. Мне нужно взять строки из выражений:Как подойти к упрощению выражения (и, или, не) в Scala?
"(and(x x))"
"(or (and x z) y)"
"(and (or z (not x))(or e a))"
и упростить их с помощью правил:
(or x nil) => x;
(or nil x) => x;
(or 1 x) => 1;
(or x 1) => 1;
(and x nil) => nil;
(and nil x) => nil;
(and x 1) => x;
(and 1 x) => x;
(not nil) => 1;
(not 1) => nil;
(not (and x y)) => (or (not x) (not y));
(not (or x y)) => (and (not x) (not y));
я решил взять выражения в точной форме, что она выше (не может быть иначе), и разобрать его в массив, так что в каждом индексе, например, это будет выглядеть следующим образом:
and or x y z //ArrayBuffer[String]
затем я использую рекурсивную функцию, которая проверяет левые и правые выражения, пока он не получит СИМПЛИ выражение. Моя проблема заключается не в правилах, как я понял это. Я по существу есть 3 случая сделано, которые:
"(and z (or x y)" // the case when the left symbol is simple but the right side must be recursed
"(and (or x y) z)" // case when the right symbol is simple but the right side must be recursed
"(and x y)" // simple case where no recursion is necessary
я пропускаю случай, когда обе левые и правые символы должны быть Рекурсия для того, чтобы получить эти упрощенные символы. У меня нет возможности узнать, когда они заканчиваются или начинаются, и там может быть много случаев, в которых он должен быть Рекурсия даже в тех внутренних выражениях:
"(and (or (and x y) z)(or x a))"
"(and (or (and x y) z)(or (and y z) a))"
Я подумал о том, как это может быть сделано в эффективный способ с текущей реализацией, который у меня есть, но пока ничего не получил. Я прошу совета относительно того, как это сделать. Я не предоставляю никакого кода, поскольку я хотел бы сделать это самостоятельно, просто нужно подтолкнуть в правильном направлении. Если требуется уточнение, спросите, и я сделаю это. Еще раз спасибо!
Первоначально я поехал по этому маршруту, но затем столкнулся с проблемой, поэтому я решил, что я сделаю это быстрее, чтобы передать его вовремя. Любые подсказки о том, как сохранить это так, как я это делал? Если это не так, и мне придется переключать реализацию. Но я бы не хотел избавляться от всего кода, который я придумал! Но я ценю вклад. – Andy
@ Andy. Поиск шаблонов в плоском списке деталей в основном потребует повторного разбора, чтобы найти структуру. Однако вы можете преобразовать свой плоский список в иерархическое выражение (см. Мое редактирование для грубой информации). – dhg