A、B 和 C 是三个布尔值。仅根据 !(not) 和 &&(and) 编写一个表达式,它始终给出与 A||B||C 相同的值

A, B and C are three boolean values. Write an expression in terms of only !(not) and &&(and) which always gives the same value as 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 or B) or C),将 (A or B) 子表达式视为 X,然后是 (A or B) 本身——你会得到想要的结果:

A || B || C =
(A || B) || C =
!(!(A || B) && !C) =
!((!A || !B) && !C) =
!(!A && !B && !C)

DeMorgan 定律(无论如何,其中之一)通常应用于两个变量,指出:

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 为真,这变得很明显,如果 all 则为假的唯一方法 个是假的。

并且,只有当它们 全部 为假时,not A and not B and not C 才会给出真(因此 not(that) 会给出假)。为了确认,这里是 table,您会看到 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