如何检查两个布尔表达式是否相同

时间:2015-11-17 22:08:52

标签: java boolean-logic

我怎么知道两个布尔表达式是否相同?

String expr1 = "(A or B) and C";
String expr2 = "C and (B or A)";
boolean equals = areExprsEquals(expr1, expr2);

我想我应该......

  1. 解析将其存储在某些结构数据中的表达
  2. 减少OR组中的表达
  3. 检查两个表达是否具有相同的组
  4. 例如,我得到第二步:

    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,排序,并且expr哈希值是所有哈希值的md5。

    但问题是......我怎样才能减少exprs?有算法吗?表达式仅使用AND和OR运算符。

1 个答案:

答案 0 :(得分:4)

  

有算法吗?

理论答案:

  • 您要解决的问题是Boolean Satisfiability Problem也称为SAT。

  • 这是NP-complete

  • 这意味着,没有已知的算法 1 总能找到多项式时间内SAT问题的解决方案;即没有最坏情况为O(N^C)或更好的算法,其中C是常数,N是SAT问题中的变量数。

  • 有一个明显的解决方案是O(2^N) ...对解决方案空间的强力搜索。存在更好的算法;见the Wikipedia article但在最坏的情况下它们都是指数级的。

实用解决方案:

  • 对于非常小的N,蛮力可能会提供可接受的表现。

  • 使用现有的SAT求解器,记住该理论认为它在最坏的情况下具有指数行为。

  • 避免大N ...的问题或编写应用程序代码,以便解算器按时间框排序&#34 ;;即如果它无法在规定的时间内得到解决方案,它就会放弃。

1 - 如果有证据证明P == NP,则可能会出现更好的算法以解决此问题和其他NP完全问题。