Если вам не требуется использовать List<List<iSymbol>>
, я рекомендую переключиться на другую структуру класса с базовым классом (или интерфейсом) Expression
и подклассами (или разработчиками) SymbolExpression
, NotExpression
, OrExpression
и AndExpression
.A SymbolExpression
содержит один символ;NotExpression
содержит одно Expression
, а OrExpression
и AndExpression
содержат по два выражения в каждом.Это гораздо более стандартная структура для работы с математическими выражениями, и, вероятно, для нее проще выполнять преобразования.
С помощью приведенных выше классов вы можете моделировать любое выражение в виде двоичного дерева.Отмените выражение, заменив корень на NotExpression
, чей дочерний элемент является исходным корнем.Затем обойдите дерево с помощью поиска в глубину, и всякий раз, когда вы нажимаете NotExpression
, чей дочерний элемент - OrExpression
или AndExpression
, вы можете заменить его на AndExpression
или OrExpression
(соответственно)чьи дети NotExpression
s, с оригинальными детьми под ними.Возможно, вы также захотите устранить двойные отрицания (найдите NotExpression
s, чей ребенок - NotExpression
, и удалите оба).
(Понятен ли этот ответ, вероятно, зависит от того, насколько вам удобно работатьдеревья. Дайте мне знать, если вам нужны разъяснения.)