Я почти уверен, что обнаружение эквивалентных выражений является либо проблемой np-hard, либо np-complete, даже для выражений типа boolean-only.Это означает, что для того, чтобы сделать это идеально, оптимальный способ - это построить полные таблицы всех возможных комбинаций входных данных и результатов, а затем сравнить таблицы.
Может быть, выражения BPF каким-то образом ограничены, что это меняет?Я не знаю, поэтому я предполагаю, что нет.
Если ваши проблемы невелики, это может не быть проблемой.Я делаю точно , что является частью алгоритма проектирования дерева решений.
В качестве альтернативы, не пытайтесь быть идеальным.Разрешить некоторые ложные отрицания (случаи, которые эквивалентны, но которые вы не обнаружите).
Простой подход может состоять в том, чтобы сделать вариант нормального выражения-оценки, но скорее оценивать альтернативное представление выражениячем результат.Наложить порядок на коммутативные операторы.Примените некоторые очевидные упрощения во время оценки.Замените богатый набор операторов минимальным набором примитивных операторов - например, используйте de-morgans для исключения операторов OR.
Это альтернативное представление формирует каноническое представление для всех членов набора эквивалентных выражений.Это должен быть класс эквивалентности в том смысле, что вы всегда найдете одну и ту же каноническую форму для любого члена этого набора.Но это только смысл теории множеств / абстрактной алгебры класса эквивалентности - это не означает, что все эквивалентные выражения находятся в одном классе эквивалентности.
Для эффективного поиска в словаре вы можете использовать хэши или сравненияна основе этого канонического представления.