有人知道一种简化布尔表达式的算法吗?
我记得布尔代数和Karnaught地图,但这适用于EVERITHING为布尔值的数字硬件。我想要考虑一些子表达式不是布尔值的东西。
例如:
a == 1 && a == 3
这可以转换为纯布尔表达式:
a1 && a3
但是这种表达是不可简化的,而对于算术的一点点知识,everibody可以确定表达式只是:
false
有些人知道一些链接吗?
答案 0 :(得分:8)
您可能对K-maps和Quine–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个不同的值,那么您可以拥有变量a1
,a2
和a3
,其中a1
为真意味着a == 1
等等。你做到了这一点,你可以依靠Quine-McCluskey算法(对于比Karnaugh地图更大的例子,这可能更好)。以下是Quine-McCluskey的一些Java code。
我不能说这个设计是否会真正简化事情或使它们更复杂,但你可能至少要考虑它。
答案 5 :(得分:0)
这很难。我找到的算法以最简单的方式匹配每个输出组合,每个输入组合。但那是基本的算法,并没有解决每一个表达。
如果所有输出(q1,q2,q3,q4)与输入A组合相同,则简化结果为A.
如果没有,您将尝试另一种变量/输入依赖。