我有以下问题:
设a和b为布尔变量。是否可以设置a和b的值以使以下表达式求值为false? b或(((不是)或(非a))或(a或(非b)))
最好的方法是什么?我知道在一张纸上解决所有四种可能性会给我答案但是有一个有效的策略可以解决这类问题吗?
答案 0 :(得分:2)
我们可以通过演绎得到答案。
b or (((not a) or (not a)) or (a or (not b)))
正如我们在这里看到的,b
必须为false才能使整个表达式为false,因为它是OR运算符的操作数:
b or ...
但是,在右侧,如果b
为false,则not b
为真,这样做:
(a or (not b))
真。
现在我们的表达已成为:
false or (((not a) or (not a)) or true)
正如你在这里可以清楚地看到的那样,右边必须评估为真正的广告,整个事情评估为真。因此,答案是否。
答案 1 :(得分:1)
您可以编写一个小程序或单元测试。
@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的值,使下面的表达式求值为false?
是“不,你不能”。
答案 2 :(得分:1)
对第二部分的回答:在现实世界中,你将使用所谓的SAT solver(为了满足)。含义:您可以手动简化小方程,但在现实世界中,您可能拥有包含数百万个变量的方程式 - 然后转向SAT求解器。
了解这些工具的工作方式是进入计算机科学基础课程的绝佳切入点。见。听一听这个podcast。它讨论了P和NP之间的差异 - 然后花费了大量时间来解释为什么我们能够有效地解决大型 SAT问题(现在在NP中)。