我的代码中有if-condition
:
if (a||a&&!b){
// do some stuff
}
来自我的junit test
:
boolean a=true, b = true;
我后来认识到这句话可以简化为:
if (a&&b)
变为绿色:Assert.assertTrue(a||a&&!b == a&&b);
我现在的问题。有没有方法,工具,功能,图书馆等可以检查boolean expression
是否有简化?
谢谢你的帮助?
答案 0 :(得分:7)
只需查看真值表(我已添加括号)
a || (a && (!b))
a|b|result
----------
T|T|T
T|F|T
F|T|F
F|F|F
正如我们所看到的,公式不依赖 b
,并且可以简化为
a
最后
if (a) {
// do some stuff
}
对于具有多个变量的公式,当真值表太长而无法进行人工分析时,您可以使用卡诺图作为Eomm提议。
答案 1 :(得分:3)
您可以使用Karnaugh map来简化布尔逻辑。
有3个或更多变量是最好的方法
答案 2 :(得分:2)
用于简化复杂布尔表达式的一种常用技术是Karnaugh Maps。它相对容易学习,它可以帮助您生成更短的表达式,甚至可以从真值表中构建布尔表达式。
Karnaugh地图表达非常简单 - 看起来像这样:
它简化为a
,而不是a && b
。
答案 3 :(得分:2)
a || a && !b
不等于
a && b
它等于a
。
我想在你的JUnit测试中你使用了a
和b
的特定值组合,其中结果匹配,但这并不意味着表达式是等价的 - 实际上它们不是“T。一个快速说服自己的方法是检查组合
a = true, b = false;
对于true
的所有情况,您的原始表达式显然会产生a == true
,但只要false
,您的第二个表达式就会产生b == false
。
至于仅与a
等效的形式证明,请进行扩展
a == a && (b || !b)
== a && b || a && !b
插入原始表达式:
a || a && !b == a && b || a && !b || a && !b
== a && b || a && !b
== a
答案 4 :(得分:0)
Wolfram Alpha实际上做了布尔代数简化。它可能需要一点点转换它给你的答案,使它与你的编程语言兼容,但这个概念有效并且检查得很好。 Here's a link to the page