如果条件布尔表达式,则简化

时间:2014-03-05 13:28:43

标签: java if-statement boolean-logic boolean-expression

我的代码中有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是否有简化?

谢谢你的帮助?

5 个答案:

答案 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地图表达非常简单 - 看起来像这样:

enter image description here

它简化为a,而不是a && b

答案 3 :(得分:2)

a || a && !b 

不等于

a && b

它等于a

我想在你的JUnit测试中你使用了ab的特定值组合,其中结果匹配,但这并不意味着表达式是等价的 - 实际上它们不是“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