有人知道一种简化布尔表达式的算法吗?
我记得布尔代数和卡诺图,但这是为数字硬件设计的,其中一切都是布尔类型。我想要的是考虑到一些子表达式不是布尔类型的东西。
例如:
a == 1 && a == 3
这可以被翻译成一个纯布尔表达式:
a1 && a3
但是这个表达式是不可约的,尽管稍微了解算术的人都可以确定这个表达式只是:
false
有人知道一些链接吗?
有人知道一种简化布尔表达式的算法吗?
我记得布尔代数和卡诺图,但这是为数字硬件设计的,其中一切都是布尔类型。我想要的是考虑到一些子表达式不是布尔类型的东西。
例如:
a == 1 && a == 3
这可以被翻译成一个纯布尔表达式:
a1 && a3
但是这个表达式是不可约的,尽管稍微了解算术的人都可以确定这个表达式只是:
false
有人知道一些链接吗?
可能的不同值的数量是有限且已知的吗?如果是,则可以将每个表达式转换为布尔表达式。例如,如果a有3个不同的值,则可以使用变量a1
、a2
和a3
,其中a1
为true表示a == 1
,依此类推。一旦这样做了,您就可以依赖于Quine-McCluskey算法(对于较大的示例而言,这可能比Karnaugh图更好)。这里是一些关于Quine-McCluskey的Java代码。
我不能确定这种设计是否会真正简化事情或使它们更加复杂,但至少您可能需要考虑一下。
第一次使用谷歌找到了这篇论文:
http://hopper.unco.edu/KARNAUGH/Algorithm.html
当然,这并没有涉及非布尔子表达式的处理。但是后者的通用形式确实很难,因为绝对没有算法可以检查任意算术表达式是否为真、假或其他。你所要求的深入到了编译器优化领域。
这很难。我找到的最简单的算法是将每个输出组合与每个输入组合进行匹配。但那只是基本算法,不能解决每个表达式。
如果所有输出(q1、q2、q3、q4)与例如输入A组合相同,则化简的结果将为A。
如果不是,则尝试另一个变量/输入依赖关系。