简化布尔表达式算法

时间:2011-03-15 11:33:47

标签: algorithm boolean-logic boolean boolean-expression

有人知道一种简化布尔表达式的算法吗?

我记得布尔代数和Karnaught地图,但这适用于EVERITHING为布尔值的数字硬件。我想要考虑一些子表达式不是布尔值的东西。

例如:

a == 1 && a == 3

这可以转换为纯布尔表达式:

a1 && a3 

但是这种表达是不可简化的,而对于算术的一点点知识,everibody可以确定表达式只是:

false

有些人知道一些链接吗?

6 个答案:

答案 0 :(得分:8)

您可能对K-mapsQuine–McCluskey algorithm感兴趣。

我认为SymPy能够解决和简化布尔表达式,查看源代码可能很有用。

答案 1 :(得分:4)

您的特定示例将由SMT solver解决。 (它确定没有变量的设置可以使表达式成为真;因此它总是错误的。更一般的简化超出了此类求解器的范围。)显示表达式等同于true或{{即使没有将算术带入交易中,1}}当然也是NP难的,所以即使这样也有实用的软件非常酷。根据范围内的算术知识量,问题may be undecidable

答案 2 :(得分:4)

这个问题有两个部分,逻辑简化和表示简化。

为了简化逻辑,Quine-McCluskey。为了简化表示,使用分布标识(0& 1 | 0& 2)== 0&(1 | 2)递归提取术语。

我详细介绍了流程here。这仅仅使用&和|,但可以修改它以包含所有布尔运算符。

答案 3 :(得分:2)

使用谷歌的第一枪发现了这篇论文:

http://hopper.unco.edu/KARNAUGH/Algorithm.html

当然,这不涉及非布尔子表达式。但是后一部分的一般形式确实很难,因为肯定没有算法来检查任意算术表达式是真,假或其他。你所要求的是深入到compiler optimization的领域。

答案 4 :(得分:2)

可能的不同值的数量是否有限且已知?如果是这样,您可以将每个表达式转换为布尔表达式。例如,如果a有3个不同的值,那么您可以拥有变量a1a2a3,其中a1为真意味着a == 1等等。你做到了这一点,你可以依靠Quine-McCluskey算法(对于比Karnaugh地图更大的例子,这可能更好)。以下是Quine-McCluskey的一些Java code

我不能说这个设计是否会真正简化事情或使它们更复杂,但你可能至少要考虑它。

答案 5 :(得分:0)

这很难。我找到的算法以最简单的方式匹配每个输出组合,每个输入组合。但那是基本的算法,并没有解决每一个表达。

如果所有输出(q1,q2,q3,q4)与输入A组合相同,则简化结果为A.

如果没有,您将尝试另一种变量/输入依赖。