逻辑表达式 ( a && b )
(表示a和b都是布尔值) 可以像 !(!a || !b)
一样书写。这是否意味着 &&
是“不必要的”?这是否意味着所有逻辑表达式都可以仅使用||
和!
来表示?
逻辑表达式 ( a && b )
(表示a和b都是布尔值) 可以像 !(!a || !b)
一样书写。这是否意味着 &&
是“不必要的”?这是否意味着所有逻辑表达式都可以仅使用||
和!
来表示?
是的,正如其他答案指出的那样,包括||
和!
运算符的集合是功能完备的。以下是一个具体的证明,展示了如何使用它们来表示布尔变量A
和B
之间的所有十六种可能的逻辑连接:
A || !A
!A || !B
!B || A
!A || B
A || B
!B
!A
!(!A || B) || !(A || !B)
!(!A || !B) || !(A || B)
A
B
!(A || B)
!(!A || B)
!(!B || A)
!(!A || !B)
!(A || !A)
请注意,NAND 和 NOR 都本身是功能完备的(可以使用上述相同的方法证明),因此,如果您想要验证一组操作符是否功能完备,则只需说明您可以使用其中之一表示 NAND 或 NOR。
以下是显示上述连通性的Venn 图表:
[来源]
!(!A || !B)
与 A && B
在短路和计算次数上是相同的)。我认为如果没有额外的结构(比如 a ? !b : b
),你无法使用 XOR 和 XNOR 定义新的运算符;如果能够保存值,true 或 false 并不是问题,因为你可以通过一些虚拟布尔变量来定义它们。 - Peter Olson||
,!
}是足够的; 它对应于集合{∨,¬},该集合列在“最小功能完备运算符集”部分下。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 | 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中没有相应的单个运算符。
!(!A ||!B) -> A && B
根据布尔代数,任何布尔函数都可以表示为最小项之和或最大项之积的形式,这称为规范标准型。这种逻辑在计算机科学中使用的运算符上同样适用。
A和B == !A nor !B == !(!A or !B)
。 同样,A或B == !A nand !B == !(!A and !B)
。 很明显,将相同的值传递到NAND或NOR的两个输入中将得到与简单的NOT相同的结果。 XOR和XNOR也是可能的,但更为复杂。 请参阅德摩根定理。 - Basic