Как узнать, эквивалентны ли два булевых выражения?Как проверить, эквивалентны ли два булевых выражения
String expr1 = "(A or B) and C";
String expr2 = "C and (B or A)";
boolean equals = areExprsEquals(expr1, expr2);
Я думаю, что я должен ...
- Разбираем expresion хранения в некоторых данных о структуре
- Снизить expresion в OR группы
- Проверьте, если два имеют как выражения одинаковые группы
Например, с шага два я получаю:
Expr1
(A or B) and C
Converted to:
(A and C) or (B and C)
Expr2
C and (B or A)
Converted to:
(C and B) or (C and A)
Теперь я должен знать, имеют ли те же группы. Одним из способов может быть получение хэш каждой группы:
EXP1:
group 1:
(A and C)
Order:
(A and C)
Hash:
md5("a&c")
group 2:
(B and C)
Order:
(B and C)
Hash:
md5("b&c")
exp2:
group 1:
(C and B)
Order:
(B and C)
Hash:
md5("b&c")
group 2:
(C and A)
Order:
(A and C)
Hash:
md5("a&c")
Итак:
expr1: md5(sort(md5("a&c"), md5("b&c")))
expr2: md5(sort(md5("b&c"), md5("a&c")))
Я могу сделать md5 каждой группы , sort и expr hash - это md5 всех хешей.
Но проблема в том, что ... Как уменьшить exprs? Есть ли какой-нибудь алгоритм? В выражениях используются только операторы AND и OR.
В целом, действительно БОЛЬШОЙ вопрос. Посмотрите на https://en.wikipedia.org/wiki/Boolean_satisfability_problem –
Короче говоря: если бы у вас был волшебный алгоритм, который мог бы решить вашу проблему с хорошей производительностью в приличное время по отношению к размеру входных данных , этот же алгоритм также мог бы управлять большинством известных с точки зрения вычислительной техники проблем. –
Являются ли "(A или B) и C" и "(D или E) и F" эквивалентными? –