【问题标题】:Algorithm to simplify boolean expressions简化布尔表达式的算法
【发布时间】:2016-06-30 01:59:54
【问题描述】:

我想简化一个非常大的布尔函数形式:

f(a1,a2,....,an)= (a1+a2+a5).(a2+a7+a11+a23+a34)......(a1+a3+an).

'.'表示或

'+' 表示与

可能有 100 个这样的术语('.' 彼此) n 的值可能高达 30。

有没有可行的算法来简化这个?

注意:这不是一个实验室作业,它是我关于通过粗集生成规则的项目的一小部分,其中 f 是相异函数。

【问题讨论】:

  • 由于并非所有语言都使用该符号,您能否具体说明 .+ 运算符是什么?我假设 OR 和 AND?
  • “简化”是什么意思?
  • 如果是这种情况,那么“简化”的主要方法是是否有可以拉出的 ALL OR 组中的术语。除此之外,您也许可以进行重组,但我认为不会有大规模的简化。
  • 规则是静态的还是动态的?
  • 通过简化函数 f,我们最多可以生成一个 ai.aj.ak.al-> 形式的规则,其中 ai,aj 等是条件属性。

标签: algorithm math time-complexity classification boolean-expression


【解决方案1】:

典型的方法是使用boolean algebra 将语句简化为最简单的形式。

如果,例如,你有类似的东西:

(A AND B) OR (A AND C)

你可以把它转换成更简单的形式:

A AND (B OR C)

【讨论】:

    【解决方案2】:

    如果您将 a 值表示为 intlong,其中 a1 的值为 2,a2 的值为 4,a3 的值为 8,依此类推:

    int a = (a1 ? 2^1 : 0) + (a2 ? 2^2 : 0) + (a3 ? 2^3 : 0) + ...;

    (为了保持简单而浪费了一点时间,而忽略了 a0 = 1 会更好的事实)

    您对所有条款都这样做:

    long[] terms = ...;
    terms[0] = 2^0 + 2^3 + 2^5           // a1+a2+a5
    terms[1] = 2^2 + 2^7 + 2^23 + 2^34   // (a2+a7+a11+a23+a34)
    

    然后就可以找到结果了:

    foreach(var term in terms)
    {
       if (a & term == term) return true;
    }
    return false;
    

    但这仅适用于最多 n=64。上面是乱七八糟的。

    【讨论】:

    • 是的!我尝试了类似的方法,但最后我得到了一个规则,例如 a1+a2+..+ak-> dicision,但我必须得到 a1.a2....ak->dicision 的形式,所有的术语和彼此,如何从这里得到它?
    • @sb15 不确定您的意思。 for 循环创建 OR,只要其中一项与它的所有位匹配,就会返回 true。实际上:结果 = a&term[0] == term[0] |一个&术语[1] == 术语[1] | ... a&term[m] == term[m]
    【解决方案3】:

    众所周知的方法是:

    第二种方式最常用于计算机。它是表格和直截了当的。第一种方法是最好的手工方法,而且更有趣,但你不能可靠地将它用于超过 4 个变量。

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 2016-07-13
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多