是||和 !足以使每个可能的逻辑表达式的运算符?

Are || and ! operators sufficient to make every possible logical expression?

逻辑表达式( a && b ) (ab都有布尔值)可以写成!(!a || !b),例如。这不是说 && 是 "unneccesary" 吗?这是否意味着 所有 逻辑表达式只能使用 ||!

如果可以,花点时间阅读 DeMorgan's Laws

你会在那儿的阅读中找到答案,以及对逻辑证明的引用。

但本质上,答案是肯定的。

编辑:为了明确起见,我的观点是可以从逻辑上从 AND 表达式推断出 OR 表达式,反之亦然。逻辑等价和推理的规律还有很多,但我觉得这条最合适。


编辑 2:这是通过 truth-table 的证明,显示了以下表达式的逻辑等价性。

德摩根定律:!(!A || !B) -> A && B

 _____________________________________________________
| A | B | !A  | !B  | !A || !B | !(!A || !B) | A && B | 
-------------------------------------------------------
| 0 | 0 |  1  |  1  |    1     |      0      |   0    | 
-------------------------------------------------------
| 0 | 1 |  1  |  0  |    1     |      0      |   0    |
-------------------------------------------------------
| 1 | 0 |  0  |  1  |    1     |      0      |   0    |
-------------------------------------------------------
| 1 | 1 |  0  |  0  |    0     |      1      |   1    |
_______________________________________________________

是的。

All logic gates can be made from NOR gates.

由于 NOR 门可以由 NOT 和 OR 构成,结果如下。

您所描述的是functional completeness

这描述了一组足以"express all possible truth tables"的逻辑运算符。您的 Java 运算符集 {||, !} 就足够了;它对应于 "Minimal functionally complete operator sets".

部分下列出的集合 {∨, ¬}

全真集合table表示所有可能的4个布尔值集合,可以是2个布尔值之间运算的结果。因为布尔值有 2 个可能值,所以有 24,或 16 个可能的真值 tables.

A B | 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
----+------------------------------------------------
T T | T  T  T  T  T  T  T  T  F  F  F  F  F  F  F  F
T F | T  T  T  T  F  F  F  F  T  T  T  T  F  F  F  F
F T | T  T  F  F  T  T  F  F  T  T  F  F  T  T  F  F 
F F | T  F  T  F  T  F  T  F  T  F  T  F  T  F  T  F

这是 table 的真值 table 数字 (0-15),产生它的 ||! 组合,以及描述。

Table  |  Operation(s)                    | Description
-------+----------------------------------+-------------
  0    | A || !A                          | TRUE
  1    | A || B                           | OR
  2    | A || !B                          | B IMPLIES A
  3    | A                                | A
  4    | !A || B                          | A IMPLIES B
  5    | B                                | B
  6    | !(!A || !B) || !(A || B)         | XNOR (equals)
  7    | !(!A || !B)                      | AND
  8    | !A || !B                         | NAND
  9    | !(A || !B) || !(!A || B)         | XOR
 10    | !B                               | NOT B
 11    | !(!A || B)                       | NOT A IMPLIES B
 12    | !A                               | NOT A
 13    | !(A || !B)                       | NOT B IMPLIES A
 14    | !(A || B)                        | NOR
 15    | !(A || !A)                       | FALSE

还有很多其他功能完整的集合,包括单元素集合 {NAND} 和 {NOR},它们在 Java 中没有对应的单个运算符。

是的,正如其他答案所指出的,由 ||! 组成的运算符集是 functionally complete。这是一个建设性的证明,展示了如何使用它们来表达布尔变量 AB:

之间所有十六种可能的逻辑连接词

请注意,NAND 和 NOR 本身都是功能完整的(可以使用上面相同的方法证明),因此如果要验证一组运算符功能完整,足以证明您可以用它表达 NAND 或 NOR。

这是一张图表,显示了上面列出的每个连接词的 Venn diagrams

[source]

是的,根据布尔代数,任何布尔函数都可以表示为最小项之和或最大项之积,称为规范范式。没有理由不能将这种逻辑应用于计算机科学中使用的相同运算符。

https://en.wikipedia.org/wiki/Canonical_normal_form

NAND and NOR 是通用的,它们可用于在任何地方构建您想要的任何逻辑操作;其他运算符以编程语言提供,以便于编写和制作可读代码。

此外,所有需要在电路中硬连线的逻辑操作也都是使用 NAND 或 NOR 专用 IC 开发的。