A、B 和 C 是三个布尔值只用 !(not) 和 &&(and) 写一个表达式,它总是给出与 A||B||C 相同的值

问题描述

偶然发现了这个美丽的问题。因为我是布尔表达式的新手,所以看起来很困难。

我想可以使用括号。

如果 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 Cnot(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