Предположим, у меня есть сущность с 3 атрибутами: A1, A2, A3 такие, что:
- A1 может иметь только значения: 1, 2, 3
- A2 может иметь только значения: 10, 20, 30, 40, 50
- A3 может иметь только значения: 100, 200
И ряд правил, например:
R1: (A1 in (1, 2)) AND (A2 in (20, 40, 50)) AND (A3 IN (100))
R2: (A1 in (1, 3)) AND (A2 in (10, 30)) AND (A3 in (200))
R3: (A1 in (1, 2)) AND (A2 in (10)) AND (A3 in (100))
Тогда есть предикат: R = R1 or R2 or R3
, что я хотел бы свести к минимуму. Дело в том, что A1=1
охватывает все возможные варианты A2
и A3
, так что мы можем вынести это в отдельный пункт: R = (A1=1) or (the rest)
Я пробовал булевы методы минимизации, объявляя переменные как a=(A1=1), b=(A1=2), ..., k=(A3=200)
, однако это, похоже, не работает, потому что:
- логический оптимизатор не знает всех значений атрибута A
- логические переменные не являются независимыми При попытке решить эти проблемы выражение становится слишком сложным, и ни QMC, ни Эспрессо не могут свести его к минимуму желаемым образом.
Я также пытался хранить сопоставления "каждый к каждому", и в случае, если у одного из них есть все значения другого, используйте его в качестве якоря агрегации, затем удалите его и повторите, но это занимает вечность и довольно много оперативной памяти.
Возможно, мы сможем представить значения атрибутов в виде набора и рассмотреть их с точки зрения теории множеств.
Вы когда - нибудь сталкивались с такой проблемой? Знаете ли вы лучшие способы ее решения? (эвристика тоже в порядке)