Какие структуры данных / алгоритмы для эффективной замены выражений DNF друг на друга?
Я пытаюсь работать с системой, которая имеет несколько сотен логических литералов с отношениями между ними в дизъюнктивной нормальной форме (например, x1 = (x2 & x3) | x4
; x2 = x5 | x6
; так далее). Я хочу упростить систему, подставляя некоторые из них во все остальные (я уже знаю примерно те замены, которые можно отследить). Но до сих пор я столкнулся с очень плохим масштабированием своих структур данных. Я представляю выражение как Set
из BitSet
s, что устраняет прямые дубликаты, но я все же в конечном итоге (казалось бы) трачу кучу времени на создание этих наборов, потому что я хочу с готовностью сократить любые лишние дизъюнкты - например, (x1 & x2) | (x1 & x2 & x3)
просто (x1 & x2)
,
Есть ли лучший способ хранить или манипулировать ими, не требуя затрат O(n^2) только на их создание?