简化布尔表达式的算法

Posted

技术标签:

【中文标题】简化布尔表达式的算法【英文标题】: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 等是条件属性。 【参考方案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】:

众所周知的方法是:

如果变量个数小于5,使用Karnaugh Map Algorithm 如果变量数为 5 个或更多,请使用Quine McCluskey Algorithm

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

【讨论】:

以上是关于简化布尔表达式的算法的主要内容,如果未能解决你的问题,请参考以下文章

布尔代数表达式简化

如何简化任意布尔表达式?

表达式可以在布尔文字上简化[重复]

使用卡诺图简化布尔表达式

布尔逻辑:如何简化此 IF 语句?

布尔逻辑 - 简化产品的总和