问题描述
偶然发现了这个美丽的问题。因为我是布尔表达式的新手,所以看起来很困难。
我想可以使用括号。
如果 A、B、C 之一为真,则 A||B||C 必须为真。使用 AND 和 NOT,它可以完成,但是,我们如何知道哪个具有哪个值?
我尝试使用真值表,但三个变量太多了。
关于如何解决或至少如何使其更快的任何想法?
解决方法
学习De Morgan's laws。这是程序员基础知识的一小部分。
他们指出,not(X or Y) = (not X) and (not Y)。
如果你否定两边然后应用公式两次——首先是 ((A 或 B) 或 C),将 (A 或 B) 子表达式视为 X,然后是 (A 或 B) 本身——你'会得到想要的结果:
A || B || C =
(A || B) || C =
!(!(A || B) && !C) =
!((!A || !B) && !C) =
!(!A && !B && !C)
,
德摩根定律(其中之一,无论如何),通常适用于两个变量,指出:
A or B == not (not A and not B)
但这对三个(或更多)变量同样有效:
A or B or C == not (not A and not B and not C)
当您意识到 A or B or C
如果 any 为真则为真时,这一点就变得很明显了,如果 all 全部为真,则只有这样才能得到假假的。
而且,只有当它们全部为假时,not A and not B and not C
才会给出真(因此 not(that)
会给出假)。为了确认,下面是表格,您会在其中看到 A or B or C
和 not(notA and notB and notC)
列给出相同的值:
A B C A or B or C notA notB notC not(notA and notB and notC)
----- ----------- -------------- ---------------------------
f f f f t t t f
f f t t t t f t
f t f t t f t t
f t t t t f f t
t f f t f t t t
t f t t f t f t
t t f t f f t t
t t t t f f f t