求解布尔表达式时如何思考?

Posted

技术标签:

【中文标题】求解布尔表达式时如何思考?【英文标题】:How to think when solving boolean expressions? 【发布时间】:2017-09-27 05:45:53 【问题描述】:

我有以下问题:

设 a 和 b 为布尔变量。是否可以将 a 和 b 的值设置为使以下表达式评估为假? b or (((not a) or (not a)) or (a or (not b)))

解决此问题的最佳方法是什么?我知道在一张纸上计算出所有四种可能性会给我答案,但是有没有一种有效的策略来处理这类问题?

【问题讨论】:

做一个真值表 评估中有重复:(非 a)或(非 a)总是(非 a) 德摩根定律也很有用en.wikipedia.org/wiki/De_Morgan%27s_laws 为什么是java标签?如果你想完成一个程序,那你为什么不在这里展示你的努力呢?! @GhostCat 我不想以 java 程序结束。我刚开始,这是一个积累练习 【参考方案1】:

我们可以通过推理得到答案。

b or (((not a) or (not a)) or (a or (not b)))

正如我们在这里看到的,b 必须为假,整个表达式为假,因为它是 OR 运算符的操作数:

b or ...

但是,在右侧,如果b 为假,那么not b 将为真,因此:

(a or (not b))

是的。

现在我们的表达式变成了:

false or (((not a) or (not a)) or true)

正如您在这里很清楚地看到的那样,右侧必须评估为真,整个事情评估为真。因此,答案是

【讨论】:

很好的解释。 And (not a) OR (not a) 也可以简化为 (not a) 所以你有false or ((not a) or true)【参考方案2】:

您可以编写一个小程序或单元测试。

  @Test
  public void testSomeThing() 
    System.out.println(check(true, true));
    System.out.println(check(true, false));
    System.out.println(check(false, true));
    System.out.println(check(false, false));

  

  private boolean check(final boolean a, final boolean b) 
    return b || (((!a) || (!a)) || (a || (!b)));
  

我保留了括号,即使其中一些可以删除。

结果是: 真的 真的 真的 真的

所以回答你的问题:

是否可以将 a 和 b 的值设置为使以下表达式计算为假?

是“不,你不能”。

【讨论】:

【参考方案3】:

第二部分的答案:在现实世界中,您将使用所谓的SAT solver(为了满足)。含义:您可以手动简化小方程式,但在现实世界中,您可能有包含数百万个变量的方程式 - 然后您求助于 SAT 求解器。

深入了解此类工具的工作原理是了解计算机科学基础主题的绝佳切入点。见相应。例如,听这个podcast。它讨论了 P 和 NP 之间的区别 - 然后花了很多时间解释为什么我们现在能够有效地解决 大型 SAT 问题(在 NP 中)。

【讨论】:

以上是关于求解布尔表达式时如何思考?的主要内容,如果未能解决你的问题,请参考以下文章

Python如何在循环中证明布尔表达式并在单击按钮时取消循环

如何在 Facelets 的 EL 布尔表达式中使用 &&?

Java中的布尔表达式

go语言入门

如何简化任意布尔表达式?

如何将c代码转换为布尔表达式?