Я пытаюсь понять, как скомпоновать логическое выражение в скобках в набор упорядоченных выражений, которые логически совпадают - PullRequest
2 голосов
/ 26 января 2010

Допустим, у меня есть такое выражение:

(((((e1) или (e2)) и (e3 или (e5 и e6)) и (e7)) или (e8))

Мне нужно получить список выражений (e1, e2, e3 и т. Д.), За которыми следуют операторы и / или операторы, чтобы при оценке списка слева направо получался тот же логический логический ответ.

т.е. e1 или e2 и e5 и e6 или e3 и e7 или e8. Но это не правильный ответ, но это то, что мне нужно в итоге.

Я знаю, что синтаксический анализатор рекурсивного спуска будет оценивать выражение, но это не то, что мне нужно, мне нужно закончить списком выражений, которые можно будет вычислить позже слева направо.

Я думал положить его в двоичное дерево, а затем перемещаться по постфиксу дерева или что-то в этом роде, но это не так.

Раньше я был достаточно умен, чтобы понять такие вещи, но теперь у меня есть ребенок, и я потерял все свои более высокие когнитивные способности. Помощь

Ответы [ 2 ]

3 голосов
/ 26 января 2010

Прежде всего, вы хотите конвертировать инфиксную нотацию в постфиксную нотацию.

Вы на правильном пути со своими мыслями о парсере, поскольку вам действительно нужно проанализировать (но не оценить) исходное выражение, а затем распечатать его в постфиксной записи.

1 голос
/ 27 января 2010

Мой папа с его почти бесконечным интеллектом (несмотря на то, что у него двое детей) указывает на довольно простое решение: Закон Деморгана гласит, что вы можете переписать любое выражение, чтобы использовать только AND или OR с различным использованием NOT. Поэтому просто преобразуйте все выражения AND в их эквивалент OR, удалите скобки и оцените слева направо. Очень работоспособная идея, за исключением того, что в моем случае операция NOT ужасно дорогая.

...